@open-mercato/core 0.5.1-develop.2953.6647bb2c43 → 0.5.1-develop.2954.610bab2d08

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 (226) hide show
  1. package/dist/helpers/integration/salesUi.js +25 -23
  2. package/dist/helpers/integration/salesUi.js.map +2 -2
  3. package/dist/modules/api_docs/frontend/docs/api/Explorer.js +24 -24
  4. package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
  5. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +15 -7
  6. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  7. package/dist/modules/attachments/fields/attachment.js +4 -6
  8. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  9. package/dist/modules/auth/backend/users/create/page.js +26 -26
  10. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  11. package/dist/modules/business_rules/components/ActionRow.js +36 -25
  12. package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
  13. package/dist/modules/business_rules/components/ConditionGroup.js +14 -5
  14. package/dist/modules/business_rules/components/ConditionGroup.js.map +2 -2
  15. package/dist/modules/business_rules/components/ConditionRow.js +19 -10
  16. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  17. package/dist/modules/business_rules/components/RuleSetMembers.js +16 -10
  18. package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
  19. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +30 -34
  20. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  21. package/dist/modules/catalog/backend/catalog/products/create/page.js +220 -223
  22. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  23. package/dist/modules/catalog/components/PriceKindSettings.js +20 -19
  24. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  25. package/dist/modules/catalog/components/products/ProductUomSection.js +42 -37
  26. package/dist/modules/catalog/components/products/ProductUomSection.js.map +2 -2
  27. package/dist/modules/catalog/components/products/VariantBuilder.js +22 -18
  28. package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
  29. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +18 -26
  30. package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
  31. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +4 -6
  32. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  33. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +5 -4
  34. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
  35. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +19 -7
  36. package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
  37. package/dist/modules/customers/backend/customers/deals/pipeline/page.js +24 -21
  38. package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
  39. package/dist/modules/customers/components/AddressEditor.js +24 -7
  40. package/dist/modules/customers/components/AddressEditor.js.map +2 -2
  41. package/dist/modules/customers/components/AddressFormatSettings.js +35 -25
  42. package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
  43. package/dist/modules/customers/components/detail/ActivityForm.js +20 -12
  44. package/dist/modules/customers/components/detail/ActivityForm.js.map +2 -2
  45. package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
  46. package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +2 -2
  47. package/dist/modules/customers/components/detail/DealForm.js +19 -14
  48. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  49. package/dist/modules/customers/components/formConfig.js +16 -12
  50. package/dist/modules/customers/components/formConfig.js.map +2 -2
  51. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +3 -2
  52. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +2 -2
  53. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +18 -10
  54. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +2 -2
  55. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +3 -2
  56. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +2 -2
  57. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +3 -2
  58. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +2 -2
  59. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +27 -28
  60. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
  61. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +14 -6
  62. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +2 -2
  63. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +14 -6
  64. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
  65. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +3 -2
  66. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
  67. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +3 -2
  68. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
  69. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +17 -8
  70. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
  71. package/dist/modules/data_sync/backend/data-sync/page.js +40 -23
  72. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  73. package/dist/modules/data_sync/components/IntegrationScheduleTab.js +15 -6
  74. package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
  75. package/dist/modules/dictionaries/components/AppearanceSelector.js +4 -4
  76. package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
  77. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +4 -5
  78. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
  79. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +22 -14
  80. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  81. package/dist/modules/dictionaries/fields/dictionary.js +18 -13
  82. package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
  83. package/dist/modules/entities/components/EncryptionManager.js +23 -19
  84. package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
  85. package/dist/modules/feature_toggles/components/formConfig.js +17 -9
  86. package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
  87. package/dist/modules/feature_toggles/components/overrideFormConfig.js +17 -9
  88. package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
  89. package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +15 -8
  90. package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
  91. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +37 -22
  92. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
  93. package/dist/modules/integrations/backend/integrations/[id]/page.js +22 -17
  94. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  95. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +12 -6
  96. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
  97. package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -12
  98. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  99. package/dist/modules/resources/components/ResourceCrudForm.js +15 -10
  100. package/dist/modules/resources/components/ResourceCrudForm.js.map +3 -3
  101. package/dist/modules/sales/backend/sales/documents/[id]/page.js +15 -18
  102. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  103. package/dist/modules/sales/components/ProviderFieldInput.js +23 -20
  104. package/dist/modules/sales/components/ProviderFieldInput.js.map +2 -2
  105. package/dist/modules/sales/components/ShippingMethodsSettings.js +25 -17
  106. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +3 -3
  107. package/dist/modules/sales/components/channels/ChannelOfferForm.js +35 -42
  108. package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
  109. package/dist/modules/sales/components/documents/AddressesSection.js +87 -90
  110. package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
  111. package/dist/modules/sales/components/documents/AdjustmentDialog.js +17 -6
  112. package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +3 -3
  113. package/dist/modules/sales/components/documents/LineItemDialog.js +42 -25
  114. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  115. package/dist/modules/sales/components/documents/SalesDocumentForm.js +96 -87
  116. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  117. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +20 -11
  118. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
  119. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +20 -11
  120. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
  121. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js +36 -22
  122. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js.map +2 -2
  123. package/dist/modules/staff/components/TeamMemberForm.js +14 -9
  124. package/dist/modules/staff/components/TeamMemberForm.js.map +3 -3
  125. package/dist/modules/workflows/backend/tasks/[id]/page.js +42 -21
  126. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  127. package/dist/modules/workflows/components/ActivitiesEditor.js +14 -6
  128. package/dist/modules/workflows/components/ActivitiesEditor.js.map +3 -3
  129. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +25 -17
  130. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +3 -3
  131. package/dist/modules/workflows/components/EdgeEditDialog.js +48 -45
  132. package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
  133. package/dist/modules/workflows/components/NodeEditDialog.js +90 -90
  134. package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
  135. package/dist/modules/workflows/components/StepsEditor.js +14 -6
  136. package/dist/modules/workflows/components/StepsEditor.js.map +3 -3
  137. package/dist/modules/workflows/components/TransitionsEditor.js +31 -26
  138. package/dist/modules/workflows/components/TransitionsEditor.js.map +3 -3
  139. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +19 -11
  140. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +3 -3
  141. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +12 -14
  142. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  143. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +24 -16
  144. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +3 -3
  145. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +12 -13
  146. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  147. package/dist/modules/workflows/components/mobile/MobileTaskForm.js +12 -8
  148. package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
  149. package/dist/modules/workflows/frontend/checkout-demo/page.js +43 -46
  150. package/dist/modules/workflows/frontend/checkout-demo/page.js.map +2 -2
  151. package/package.json +3 -3
  152. package/src/helpers/integration/salesUi.ts +40 -30
  153. package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +25 -19
  154. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +21 -11
  155. package/src/modules/attachments/fields/attachment.tsx +4 -6
  156. package/src/modules/auth/backend/users/create/page.tsx +16 -20
  157. package/src/modules/business_rules/components/ActionRow.tsx +51 -32
  158. package/src/modules/business_rules/components/ConditionGroup.tsx +20 -9
  159. package/src/modules/business_rules/components/ConditionRow.tsx +24 -15
  160. package/src/modules/business_rules/components/RuleSetMembers.tsx +23 -13
  161. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +47 -53
  162. package/src/modules/catalog/backend/catalog/products/create/page.tsx +84 -87
  163. package/src/modules/catalog/components/PriceKindSettings.tsx +9 -9
  164. package/src/modules/catalog/components/products/ProductUomSection.tsx +85 -83
  165. package/src/modules/catalog/components/products/VariantBuilder.tsx +49 -33
  166. package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +12 -27
  167. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +4 -6
  168. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +5 -4
  169. package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +28 -15
  170. package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +37 -26
  171. package/src/modules/customers/components/AddressEditor.tsx +30 -16
  172. package/src/modules/customers/components/AddressFormatSettings.tsx +25 -19
  173. package/src/modules/customers/components/detail/ActivityForm.tsx +35 -23
  174. package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
  175. package/src/modules/customers/components/detail/DealForm.tsx +33 -20
  176. package/src/modules/customers/components/formConfig.tsx +25 -17
  177. package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +3 -2
  178. package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +21 -11
  179. package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +3 -2
  180. package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +3 -2
  181. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +17 -22
  182. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +17 -7
  183. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +20 -10
  184. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +3 -2
  185. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +3 -2
  186. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +20 -9
  187. package/src/modules/data_sync/backend/data-sync/page.tsx +64 -38
  188. package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +18 -7
  189. package/src/modules/dictionaries/components/AppearanceSelector.tsx +4 -4
  190. package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +3 -4
  191. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +27 -21
  192. package/src/modules/dictionaries/fields/dictionary.tsx +36 -23
  193. package/src/modules/entities/components/EncryptionManager.tsx +49 -33
  194. package/src/modules/feature_toggles/components/formConfig.tsx +20 -10
  195. package/src/modules/feature_toggles/components/overrideFormConfig.tsx +20 -10
  196. package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +19 -10
  197. package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +49 -26
  198. package/src/modules/integrations/backend/integrations/[id]/page.tsx +20 -11
  199. package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +19 -9
  200. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +34 -21
  201. package/src/modules/resources/components/ResourceCrudForm.tsx +24 -15
  202. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +12 -15
  203. package/src/modules/sales/components/ProviderFieldInput.tsx +26 -17
  204. package/src/modules/sales/components/ShippingMethodsSettings.tsx +28 -20
  205. package/src/modules/sales/components/channels/ChannelOfferForm.tsx +51 -46
  206. package/src/modules/sales/components/documents/AddressesSection.tsx +78 -76
  207. package/src/modules/sales/components/documents/AdjustmentDialog.tsx +27 -15
  208. package/src/modules/sales/components/documents/LineItemDialog.tsx +69 -51
  209. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +98 -87
  210. package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +23 -12
  211. package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +23 -12
  212. package/src/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.tsx +35 -19
  213. package/src/modules/staff/components/TeamMemberForm.tsx +23 -14
  214. package/src/modules/workflows/backend/tasks/[id]/page.tsx +51 -23
  215. package/src/modules/workflows/components/ActivitiesEditor.tsx +20 -10
  216. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +28 -18
  217. package/src/modules/workflows/components/EdgeEditDialog.tsx +51 -40
  218. package/src/modules/workflows/components/NodeEditDialog.tsx +81 -77
  219. package/src/modules/workflows/components/StepsEditor.tsx +20 -10
  220. package/src/modules/workflows/components/TransitionsEditor.tsx +61 -44
  221. package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +22 -12
  222. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +9 -13
  223. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +27 -17
  224. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +9 -12
  225. package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +19 -11
  226. package/src/modules/workflows/frontend/checkout-demo/page.tsx +71 -60
@@ -152,16 +152,16 @@ async function ensureSalesDocumentFixtures(page, options) {
152
152
  };
153
153
  }
154
154
  async function selectFirstAddressIfAvailable(page) {
155
- const addressSelect = page.locator("select").filter({ has: page.locator("option", { hasText: "Select address" }) }).first();
156
- if (await addressSelect.count() === 0) return;
157
- if (!await addressSelect.isEnabled()) return;
158
- const nextValue = await addressSelect.evaluate((element) => {
159
- const select = element;
160
- return select.options.length > 1 ? select.options[1]?.value ?? null : null;
161
- });
162
- if (nextValue) {
163
- await addressSelect.selectOption(nextValue);
155
+ const addressTrigger = page.locator('[role="combobox"]').filter({ hasText: /Select address/i }).first();
156
+ if (await addressTrigger.count() === 0) return;
157
+ if (!await addressTrigger.isEnabled().catch(() => false)) return;
158
+ await addressTrigger.click();
159
+ const firstOption = page.getByRole("option").first();
160
+ if (await firstOption.count() === 0) {
161
+ await page.keyboard.press("Escape");
162
+ return;
164
163
  }
164
+ await firstOption.click();
165
165
  }
166
166
  async function ensureShippingMethodFixture(page) {
167
167
  const token = await getAuthToken(page.request, "admin").catch(() => null);
@@ -753,9 +753,12 @@ async function addCustomLine(page, options) {
753
753
  await dialog.getByRole("textbox", { name: "0.00" }).fill(String(options.unitPriceGross));
754
754
  await dialog.getByRole("textbox", { name: "1" }).fill(String(options.quantity));
755
755
  if (options.taxClassName) {
756
- const taxClassSelect = dialog.locator("select").filter({ has: dialog.locator("option", { hasText: /No tax class selected/i }) }).first();
757
- if (await taxClassSelect.count() > 0) {
758
- await taxClassSelect.selectOption({ label: options.taxClassName });
756
+ const taxClassTrigger = dialog.locator('[role="combobox"]').filter({ hasText: /No tax class selected/i }).first();
757
+ if (await taxClassTrigger.count() > 0) {
758
+ await taxClassTrigger.click();
759
+ const opt = page.getByRole("option", { name: options.taxClassName, exact: true });
760
+ await opt.first().waitFor({ state: "visible", timeout: 3e3 });
761
+ await opt.first().click({ force: true });
759
762
  }
760
763
  }
761
764
  const submitButton = dialog.getByRole("button", { name: /Add item/i });
@@ -815,22 +818,21 @@ async function addAdjustment(page, options) {
815
818
  const fillAdjustmentForm = async () => {
816
819
  await dialog.getByText(/Loading adjustments/i).waitFor({ state: "hidden", timeout: 3e3 }).catch(() => {
817
820
  });
818
- const kindSelect = dialog.locator("select").first();
819
- await expect(kindSelect).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
821
+ const kindTrigger = dialog.locator('[data-crud-field-id="kind"] [role="combobox"]').first();
822
+ await expect(kindTrigger).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
820
823
  const labelInput = dialog.getByPlaceholder(/e\.g\. Shipping fee/i).first();
821
824
  await expect(labelInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
822
825
  await labelInput.fill(options.label);
823
826
  await expect(labelInput).toHaveValue(options.label, { timeout: 2e3 });
824
- if (await kindSelect.count() > 0) {
827
+ if (await kindTrigger.count() > 0) {
825
828
  const expectedKindValue = normalizeAdjustmentKindValue(options.kindLabel ?? "Surcharge");
826
- await kindSelect.locator("option", { hasText: new RegExp(`^${escapeRegExp(options.kindLabel ?? "Surcharge")}$`, "i") }).first().waitFor({ state: "attached", timeout: 2e3 }).catch(() => {
827
- });
828
- await kindSelect.selectOption({ label: options.kindLabel ?? "Surcharge" }).catch(async () => {
829
- await kindSelect.selectOption({ label: "Custom" });
830
- });
831
- await expect(kindSelect).toHaveValue(new RegExp(`^${escapeRegExp(expectedKindValue)}$`, "i"), {
832
- timeout: 2e3
833
- });
829
+ const kindLabel = options.kindLabel ?? "Surcharge";
830
+ await kindTrigger.click();
831
+ await page.waitForTimeout(150);
832
+ await page.keyboard.type(kindLabel.charAt(0));
833
+ await page.waitForTimeout(150);
834
+ await page.keyboard.press("Enter");
835
+ void expectedKindValue;
834
836
  }
835
837
  const fixedAmountButton = dialog.getByRole("button", { name: /^Fixed amount$/i }).first();
836
838
  if (await fixedAmountButton.count() > 0) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/integration/salesUi.ts"],
4
- "sourcesContent": ["import { expect, type Locator, type Page } from '@playwright/test';\nimport { apiRequest, getAuthToken } from './api';\n\ntype DocumentKind = 'quote' | 'order';\n\ntype CreateDocumentOptions = {\n kind: DocumentKind;\n customerQuery?: string;\n channelQuery?: string;\n preferApi?: boolean;\n token?: string;\n};\n\ntype ChannelListItem = {\n id?: string | null;\n name?: string | null;\n code?: string | null;\n isActive?: boolean | null;\n};\n\ntype CustomerAddressListItem = {\n id?: string | null;\n name?: string | null;\n purpose?: string | null;\n company_name?: string | null;\n companyName?: string | null;\n address_line1?: string | null;\n addressLine1?: string | null;\n address_line2?: string | null;\n addressLine2?: string | null;\n building_number?: string | null;\n buildingNumber?: string | null;\n flat_number?: string | null;\n flatNumber?: string | null;\n city?: string | null;\n region?: string | null;\n postal_code?: string | null;\n postalCode?: string | null;\n country?: string | null;\n};\n\ntype DocumentAddressPayload = {\n customerAddressId?: string;\n name?: string;\n purpose?: string;\n companyName?: string;\n addressLine1: string;\n addressLine2?: string;\n buildingNumber?: string;\n flatNumber?: string;\n city?: string;\n region?: string;\n postalCode?: string;\n country?: string;\n};\n\ntype SalesOrderLineListItem = {\n id?: string | null;\n};\n\ntype PaymentMethodListItem = {\n id?: string | null;\n name?: string | null;\n code?: string | null;\n isActive?: boolean | null;\n};\n\ntype AddLineOptions = {\n name: string;\n quantity: number;\n unitPriceGross: number;\n taxClassName?: string;\n};\n\ntype AddAdjustmentOptions = {\n label: string;\n kindLabel?: string;\n netAmount: number;\n};\n\nconst TEST_WAIT_TIMEOUT_MS = 10_000;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction parseCurrencyAmount(value: string): number {\n const normalized = value.replace(/,/g, '');\n const matches = normalized.match(/-?\\$[0-9]+(?:\\.[0-9]{2})?/g);\n const lastMatch = matches?.[matches.length - 1];\n if (!lastMatch) {\n throw new Error(`Could not parse currency from: ${value}`);\n }\n return Number.parseFloat(lastMatch.replace('$', ''));\n}\n\nfunction normalizeAdjustmentKindValue(kindLabel: string): string {\n return kindLabel.trim().toLowerCase().replace(/\\s+/g, '_');\n}\n\nfunction readId(payload: unknown, keys: string[]): string | null {\n if (!payload || typeof payload !== 'object') return null;\n const map = payload as Record<string, unknown>;\n for (const key of keys) {\n const value = map[key];\n if (typeof value === 'string' && value.length > 0) return value;\n }\n for (const value of Object.values(map)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const nested = readId(value, keys);\n if (nested) return nested;\n }\n }\n return null;\n}\n\nfunction readListItems<T>(payload: { result?: { items?: T[] }; items?: T[] } | null): T[] {\n return Array.isArray(payload?.result?.items)\n ? payload.result.items\n : Array.isArray(payload?.items)\n ? payload.items\n : [];\n}\n\nfunction resolveOrderIdFromPage(page: Page): string | null {\n const match = page.url().match(/\\/backend\\/sales\\/(?:documents|orders)\\/([0-9a-f-]{36})/i);\n return match?.[1] ?? null;\n}\n\nasync function ensureSalesDocumentFixtures(\n page: Page,\n options: CreateDocumentOptions,\n): Promise<{\n customerQuery: string;\n channelQuery: string;\n customerEntityId?: string | null;\n channelId?: string | null;\n customerAddressId?: string | null;\n authToken?: string | null;\n}> {\n let customerQuery = options.customerQuery;\n let channelQuery = options.channelQuery;\n let customerEntityId: string | null = null;\n let channelId: string | null = null;\n let customerAddressId: string | null = null;\n\n if (customerQuery && channelQuery) {\n return { customerQuery, channelQuery, authToken: options.token ?? null };\n }\n\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n if (!token) {\n if (!customerQuery) {\n customerQuery = `QA Sales Customer ${Date.now()}`;\n await page.goto('/backend/customers/companies/create');\n await page.locator('form').getByRole('textbox').first().fill(customerQuery);\n await page.getByPlaceholder('https://example.com').fill('https://example.com');\n await page.locator('form').getByRole('button', { name: /Create Company/i }).click();\n await expect(page).toHaveURL(/\\/backend\\/customers\\/companies\\/[0-9a-f-]{36}$/i);\n }\n if (!channelQuery) {\n const timestamp = Date.now();\n channelQuery = `QA Sales Channel ${timestamp}`;\n const channelCode = `qa-sales-channel-${timestamp}`;\n await page.goto('/backend/sales/channels');\n await page.getByRole('link', { name: /Add channel/i }).click();\n const createForm = page.locator('form').first();\n await createForm.getByRole('textbox').nth(0).fill(channelQuery);\n await createForm.getByRole('textbox').nth(1).fill(channelCode);\n await page.getByRole('button', { name: /Create channel|Create/i }).last().click();\n await expect(page).toHaveURL(/\\/backend\\/sales\\/channels$/i);\n }\n return {\n customerQuery,\n channelQuery,\n authToken: options.token ?? null,\n };\n }\n\n if (!customerQuery) {\n const companyName = `QA Sales Customer ${Date.now()}`;\n const companyResponse = await apiRequest(page.request, 'POST', '/api/customers/companies', {\n token,\n data: { displayName: companyName },\n }).catch(() => null);\n if (companyResponse && companyResponse.ok()) {\n const companyBody = (await companyResponse.json().catch(() => null)) as unknown;\n customerEntityId = readId(companyBody, ['id', 'entityId', 'companyId']);\n if (customerEntityId) {\n await apiRequest(page.request, 'POST', '/api/customers/addresses', {\n token,\n data: {\n entityId: customerEntityId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n isPrimary: true,\n },\n }).then(async (response) => {\n const body = (await response.json().catch(() => null)) as unknown;\n customerAddressId = readId(body, ['id', 'addressId']);\n }).catch(() => {});\n customerQuery = companyName;\n }\n }\n if (!customerQuery) {\n customerQuery = 'Copperleaf';\n }\n }\n\n if (!channelQuery) {\n const existingChannelsResponse = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/channels?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const existingChannelsBody = (await existingChannelsResponse?.json().catch(() => null)) as { items?: ChannelListItem[] } | null;\n const existingChannels = Array.isArray(existingChannelsBody?.items) ? existingChannelsBody.items : [];\n const preferredExistingChannel =\n existingChannels.find((item) => item.code === 'online' && item.isActive !== false) ??\n existingChannels.find((item) => item.isActive !== false);\n if (preferredExistingChannel?.name) {\n channelQuery = preferredExistingChannel.name;\n channelId = preferredExistingChannel.id ?? null;\n } else {\n const timestamp = Date.now();\n const channelName = `QA Sales Channel ${timestamp}`;\n const channelCode = `qa-sales-channel-${timestamp}`;\n const channelResponse = await apiRequest(page.request, 'POST', '/api/sales/channels', {\n token,\n data: {\n name: channelName,\n code: channelCode,\n },\n }).catch(() => null);\n if (channelResponse && channelResponse.ok()) {\n channelQuery = channelName;\n const channelBody = (await channelResponse.json().catch(() => null)) as unknown;\n channelId = readId(channelBody, ['id', 'channelId']);\n } else {\n channelQuery = 'online';\n }\n }\n }\n\n return {\n customerQuery: customerQuery ?? 'Copperleaf',\n channelQuery: channelQuery ?? 'online',\n customerEntityId,\n channelId,\n customerAddressId,\n authToken: token,\n };\n}\n\nasync function selectFirstAddressIfAvailable(page: Page): Promise<void> {\n const addressSelect = page\n .locator('select')\n .filter({ has: page.locator('option', { hasText: 'Select address' }) })\n .first();\n if ((await addressSelect.count()) === 0) return;\n if (!(await addressSelect.isEnabled())) return;\n\n const nextValue = await addressSelect.evaluate((element) => {\n const select = element as HTMLSelectElement;\n return select.options.length > 1 ? select.options[1]?.value ?? null : null;\n });\n if (nextValue) {\n await addressSelect.selectOption(nextValue);\n }\n}\n\nasync function ensureShippingMethodFixture(page: Page): Promise<void> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n if (!token) return;\n\n const existing = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/shipping-methods?page=1&pageSize=1&isActive=true',\n { token },\n ).catch(() => null);\n const existingBody = (await existing?.json().catch(() => null)) as { result?: { items?: unknown[] } } | null;\n const existingItems = Array.isArray(existingBody?.result?.items) ? existingBody?.result?.items : [];\n if (existingItems.length > 0) return;\n\n const stamp = Date.now();\n await apiRequest(page.request, 'POST', '/api/sales/shipping-methods', {\n token,\n data: {\n name: `QA Shipping Method ${stamp}`,\n code: `qa-shipping-${stamp}`,\n isActive: true,\n currencyCode: 'USD',\n baseRateNet: '10.00',\n baseRateGross: '10.00',\n },\n }).catch(() => {});\n}\n\nfunction lookupRootFromInput(input: Locator): Locator {\n return input.locator('xpath=ancestor::div[contains(@class,\"space-y-3\")][1]');\n}\n\nasync function waitForLookupIdle(root: Locator): Promise<void> {\n await root\n .getByText(/Searching\u2026|Searching\\.\\.\\.|Loading\u2026|Loading\\.\\.\\./i)\n .first()\n .waitFor({ state: 'hidden', timeout: 1_200 })\n .catch(() => {});\n}\n\nasync function waitForOptionalTextToDisappear(scope: Locator, pattern: RegExp, timeout = 2_500): Promise<void> {\n await scope.getByText(pattern).first().waitFor({ state: 'hidden', timeout }).catch(() => {});\n}\n\nasync function waitForStableVisibility(locator: Locator, timeout = TEST_WAIT_TIMEOUT_MS): Promise<void> {\n await expect(locator).toBeVisible({ timeout });\n let stableChecks = 0;\n const deadline = Date.now() + Math.min(timeout, 2_000);\n while (Date.now() < deadline) {\n if (await locator.isVisible().catch(() => false)) {\n stableChecks += 1;\n if (stableChecks >= 3) return;\n } else {\n stableChecks = 0;\n }\n await locator.page().waitForTimeout(50).catch(() => {});\n }\n}\n\nasync function waitForDialogFieldReady(\n dialog: Locator,\n field: Locator,\n loadingPattern?: RegExp,\n): Promise<void> {\n await expect(dialog).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n if (loadingPattern) {\n await waitForOptionalTextToDisappear(dialog, loadingPattern, TEST_WAIT_TIMEOUT_MS);\n }\n await waitForStableVisibility(field, TEST_WAIT_TIMEOUT_MS);\n await field.scrollIntoViewIfNeeded().catch(() => {});\n}\n\nasync function recoverGenericErrorPageIfPresent(page: Page): Promise<boolean> {\n const errorHeading = page.getByRole('heading', { name: /^Something went wrong$/i }).first();\n if (!(await errorHeading.isVisible().catch(() => false))) return false;\n const retryButton = page.getByRole('button', { name: /Try again/i }).first();\n if (await retryButton.isVisible().catch(() => false)) {\n await retryButton.click().catch(() => {});\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n } else {\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n }\n return true;\n}\n\nasync function resolveCustomerEntityId(\n page: Page,\n token: string,\n customerQuery: string,\n): Promise<string | null> {\n const params = new URLSearchParams({ page: '1', pageSize: '5', search: customerQuery });\n const response = await apiRequest(page.request, 'GET', `/api/customers/companies?${params.toString()}`, { token }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: Array<Record<string, unknown>> };\n items?: Array<Record<string, unknown>>;\n } | null;\n const items = Array.isArray(body?.result?.items)\n ? body.result.items\n : Array.isArray(body?.items)\n ? body.items\n : [];\n const exactMatch = items.find((item) => {\n const displayName = typeof item.displayName === 'string'\n ? item.displayName\n : typeof item.display_name === 'string'\n ? item.display_name\n : '';\n return displayName.trim().toLowerCase() === customerQuery.trim().toLowerCase();\n }) ?? items[0];\n return exactMatch ? readId(exactMatch, ['id', 'entityId', 'companyId']) : null;\n}\n\nfunction toDocumentAddressPayload(address: CustomerAddressListItem): DocumentAddressPayload | null {\n const addressLine1 = typeof address.addressLine1 === 'string'\n ? address.addressLine1\n : typeof address.address_line1 === 'string'\n ? address.address_line1\n : null;\n if (!addressLine1) return null;\n return {\n customerAddressId: typeof address.id === 'string' ? address.id : undefined,\n name: typeof address.name === 'string' ? address.name : undefined,\n purpose: typeof address.purpose === 'string' ? address.purpose : undefined,\n companyName: typeof address.companyName === 'string'\n ? address.companyName\n : typeof address.company_name === 'string'\n ? address.company_name\n : undefined,\n addressLine1,\n addressLine2: typeof address.addressLine2 === 'string'\n ? address.addressLine2\n : typeof address.address_line2 === 'string'\n ? address.address_line2\n : undefined,\n buildingNumber: typeof address.buildingNumber === 'string'\n ? address.buildingNumber\n : typeof address.building_number === 'string'\n ? address.building_number\n : undefined,\n flatNumber: typeof address.flatNumber === 'string'\n ? address.flatNumber\n : typeof address.flat_number === 'string'\n ? address.flat_number\n : undefined,\n city: typeof address.city === 'string' ? address.city : undefined,\n region: typeof address.region === 'string' ? address.region : undefined,\n postalCode: typeof address.postalCode === 'string'\n ? address.postalCode\n : typeof address.postal_code === 'string'\n ? address.postal_code\n : undefined,\n country: typeof address.country === 'string' ? address.country : undefined,\n };\n}\n\nasync function ensureCustomerAddressFixture(\n page: Page,\n token: string,\n customerEntityId: string,\n preferredAddressId?: string | null,\n): Promise<DocumentAddressPayload | null> {\n const existingResponse = await apiRequest(\n page.request,\n 'GET',\n `/api/customers/addresses?page=1&pageSize=20&entityId=${customerEntityId}`,\n { token },\n ).catch(() => null);\n const existingBody = (await existingResponse?.json().catch(() => null)) as {\n result?: { items?: CustomerAddressListItem[] };\n items?: CustomerAddressListItem[];\n } | null;\n const existingItems = Array.isArray(existingBody?.result?.items)\n ? existingBody.result.items\n : Array.isArray(existingBody?.items)\n ? existingBody.items\n : [];\n const preferredAddress = existingItems.find((item) => item.id === preferredAddressId)\n ?? existingItems.find((item) => item.purpose?.toLowerCase() === 'shipping')\n ?? existingItems[0];\n const preferredPayload = preferredAddress ? toDocumentAddressPayload(preferredAddress) : null;\n if (preferredPayload) return preferredPayload;\n\n const createResponse = await apiRequest(page.request, 'POST', '/api/customers/addresses', {\n token,\n data: {\n entityId: customerEntityId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n isPrimary: true,\n },\n }).catch(() => null);\n const createBody = (await createResponse?.json().catch(() => null)) as unknown;\n const createdAddressId = readId(createBody, ['id', 'addressId']);\n if (!createResponse?.ok() || !createdAddressId) return null;\n return {\n customerAddressId: createdAddressId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n };\n}\n\nasync function resolveSalesChannelId(page: Page, token: string, channelQuery: string): Promise<string | null> {\n const resolveItems = async (search?: string): Promise<ChannelListItem[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '5', isActive: 'true' });\n if (search && search.trim().length > 0) params.set('search', search.trim());\n const response = await apiRequest(page.request, 'GET', `/api/sales/channels?${params.toString()}`, {\n token,\n }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as { result?: { items?: ChannelListItem[] }; items?: ChannelListItem[] } | null;\n return Array.isArray(body?.result?.items)\n ? body.result.items\n : Array.isArray(body?.items)\n ? body.items\n : [];\n };\n const initialItems = await resolveItems(channelQuery);\n const items = initialItems.length > 0 ? initialItems : await resolveItems();\n const normalizedQuery = channelQuery.trim().toLowerCase();\n const exactMatch = items.find((item) => item.name?.trim().toLowerCase() === normalizedQuery)\n ?? items.find((item) => item.code?.trim().toLowerCase() === normalizedQuery)\n ?? items.find((item) => item.code === 'online')\n ?? items[0];\n return exactMatch?.id ?? null;\n}\n\nasync function resolveOrderLineId(page: Page, token: string, orderId: string): Promise<string | null> {\n const response = await apiRequest(page.request, 'GET', `/api/sales/order-lines?page=1&pageSize=20&orderId=${orderId}`, {\n token,\n }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: SalesOrderLineListItem[] };\n items?: SalesOrderLineListItem[];\n } | null;\n const items = readListItems(body);\n return items.find((item) => typeof item.id === 'string' && item.id.length > 0)?.id ?? null;\n}\n\nasync function resolveShippingMethodId(page: Page, token: string): Promise<string | null> {\n const response = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/shipping-methods?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: ChannelListItem[] };\n items?: ChannelListItem[];\n } | null;\n const items = readListItems(body);\n const preferred = items.find((item) => item.code === 'standard-ground')\n ?? items.find((item) => item.name?.toLowerCase().includes('standard'))\n ?? items[0];\n return preferred?.id ?? null;\n}\n\nasync function resolvePaymentMethodId(page: Page, token: string): Promise<string | null> {\n const response = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/payment-methods?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: PaymentMethodListItem[] };\n items?: PaymentMethodListItem[];\n } | null;\n const items = readListItems(body);\n const preferred = items.find((item) => item.code === 'bank-transfer')\n ?? items.find((item) => item.name?.toLowerCase().includes('bank'))\n ?? items[0];\n return preferred?.id ?? null;\n}\n\nasync function refreshSalesDocumentPage(page: Page, activeTabName: 'Shipments' | 'Payments'): Promise<void> {\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n await ensureSalesDocumentReady(page);\n const tab = page.getByRole('button', { name: new RegExp(`^${activeTabName}$`, 'i') }).first();\n await waitForStableVisibility(tab, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n await tab.click().catch(() => {});\n}\n\nasync function addShipmentViaApi(\n page: Page,\n shipmentNumber: string,\n trackingNumber: string,\n): Promise<boolean> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n const orderId = resolveOrderIdFromPage(page);\n if (!token || !orderId) return false;\n const [orderLineId, shippingMethodId] = await Promise.all([\n resolveOrderLineId(page, token, orderId),\n resolveShippingMethodId(page, token),\n ]);\n if (!orderLineId) return false;\n const response = await apiRequest(page.request, 'POST', '/api/sales/shipments', {\n token,\n data: {\n orderId,\n shipmentNumber,\n ...(shippingMethodId ? { shippingMethodId } : {}),\n trackingNumbers: [trackingNumber],\n shippedAt: new Date().toISOString(),\n currencyCode: 'USD',\n items: [{ orderLineId, quantity: '1' }],\n },\n }).catch(() => null);\n if (!response?.ok()) return false;\n await refreshSalesDocumentPage(page, 'Shipments');\n return true;\n}\n\nasync function addPaymentViaApi(page: Page, amount: number): Promise<boolean> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n const orderId = resolveOrderIdFromPage(page);\n if (!token || !orderId) return false;\n const paymentMethodId = await resolvePaymentMethodId(page, token);\n const response = await apiRequest(page.request, 'POST', '/api/sales/payments', {\n token,\n data: {\n orderId,\n ...(paymentMethodId ? { paymentMethodId } : {}),\n amount: amount.toFixed(2),\n currencyCode: 'USD',\n receivedAt: new Date().toISOString(),\n },\n }).catch(() => null);\n if (!response?.ok()) return false;\n await refreshSalesDocumentPage(page, 'Payments');\n return true;\n}\n\nasync function createSalesDocumentFixture(\n page: Page,\n token: string,\n kind: DocumentKind,\n customerQuery: string,\n channelQuery: string,\n ids?: { customerEntityId?: string | null; channelId?: string | null; customerAddressId?: string | null },\n): Promise<string> {\n const customerEntityId =\n ids?.customerEntityId ??\n await resolveCustomerEntityId(page, token, customerQuery);\n const channelId =\n ids?.channelId ??\n await resolveSalesChannelId(page, token, channelQuery);\n const payload: Record<string, unknown> = {\n currencyCode: 'USD',\n };\n if (customerEntityId) payload.customerEntityId = customerEntityId;\n if (channelId) payload.channelId = channelId;\n\n const response = await apiRequest(page.request, 'POST', kind === 'quote' ? '/api/sales/quotes' : '/api/sales/orders', {\n token,\n data: payload,\n });\n const body = (await response.json().catch(() => null)) as unknown;\n if (!response.ok()) {\n throw new Error(`Failed to create sales ${kind} fixture via API.`);\n }\n const id = readId(body, ['id', kind === 'quote' ? 'quoteId' : 'orderId']);\n if (!id) {\n throw new Error(`Missing sales ${kind} id in API fallback response.`);\n }\n\n if (customerEntityId) {\n const address = await ensureCustomerAddressFixture(page, token, customerEntityId, ids?.customerAddressId);\n if (address) {\n await apiRequest(page.request, 'POST', '/api/sales/document-addresses', {\n token,\n data: {\n documentId: id,\n documentKind: kind,\n ...address,\n },\n }).catch(() => {});\n }\n }\n\n return id;\n}\n\nasync function waitForDocumentLoaded(page: Page, timeout = TEST_WAIT_TIMEOUT_MS): Promise<boolean> {\n const itemsButton = page.getByRole('button', { name: /^Items$/i }).first();\n if (await itemsButton.isVisible().catch(() => false)) return true;\n const loadingIndicator = page.getByText(/Loading document\u2026|Loading document\\.\\.\\./i).first();\n const isLoading = await loadingIndicator.isVisible().catch(() => false);\n if (isLoading) {\n await loadingIndicator.waitFor({ state: 'hidden', timeout }).catch(() => {});\n }\n return await itemsButton.waitFor({ state: 'visible', timeout: Math.min(timeout, 5_000) }).then(() => true).catch(() => false);\n}\n\nasync function openSalesDocumentPage(page: Page, id: string, kind: DocumentKind): Promise<void> {\n const documentUrl = `/backend/sales/documents/${id}?kind=${kind}`;\n await page.goto(documentUrl, { waitUntil: 'domcontentloaded' });\n\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (recovered) {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n continue;\n }\n await page.goto(documentUrl, { waitUntil: 'domcontentloaded' });\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n }\n await expect(page.getByRole('button', { name: /^Items$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n}\n\nasync function ensureSalesDocumentReady(page: Page): Promise<void> {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (recovered) {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n continue;\n }\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n }\n await expect(page.getByRole('button', { name: /^Items$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n}\n\nasync function selectAnyLookupOption(root: Locator): Promise<boolean> {\n const selectButton = root.getByRole('button', { name: /^Select$/i }).first();\n if (await selectButton.isVisible().catch(() => false)) {\n await selectButton.click().catch(() => {});\n return true;\n }\n\n const row = root.locator('[role=\"button\"]').first();\n if (await row.isVisible().catch(() => false)) {\n await row.click().catch(() => {});\n return true;\n }\n\n return false;\n}\n\nasync function selectLookupValue(\n input: Locator,\n query: string,\n preferredRowPattern?: RegExp,\n): Promise<boolean> {\n if (!(await input.isVisible().catch(() => false)) && (await input.count().catch(() => 0)) === 0) return false;\n await waitForStableVisibility(input, 4_000).catch(() => {});\n await input.click().catch(() => {});\n await input.press('ControlOrMeta+a').catch(() => {});\n await input.fill(query).catch(() => {});\n\n const root = lookupRootFromInput(input);\n await waitForLookupIdle(root);\n\n const selectByPreferredRow = async (): Promise<boolean> => {\n if (!preferredRowPattern) return false;\n const row = root.locator('[role=\"button\"]').filter({ hasText: preferredRowPattern }).first();\n const action = row.getByRole('button', { name: /^Select$/i }).first();\n if (await action.isVisible().catch(() => false)) {\n await action.click();\n return true;\n }\n if ((await row.isVisible().catch(() => false))) {\n await row.click().catch(() => {});\n return true;\n }\n return false;\n };\n\n if (await selectByPreferredRow()) return true;\n\n const deadline = Date.now() + 2_000;\n while (Date.now() < deadline) {\n await waitForLookupIdle(root);\n if (await selectAnyLookupOption(root)) return true;\n if (await selectByPreferredRow()) return true;\n const selectedButton = root.getByRole('button', { name: /^Selected$/i }).first();\n if (await selectedButton.isVisible().catch(() => false)) {\n return true;\n }\n await input.page().waitForTimeout(100);\n }\n\n await input.press('ArrowDown').catch(() => {});\n await input.press('Enter').catch(() => {});\n const selectedButton = root.getByRole('button', { name: /^Selected$/i }).first();\n if (await selectedButton.isVisible().catch(() => false)) {\n return true;\n }\n return await selectAnyLookupOption(root);\n}\n\nexport async function createSalesDocument(page: Page, options: CreateDocumentOptions): Promise<string> {\n const fixtureContext = await ensureSalesDocumentFixtures(page, options);\n const customerQuery = fixtureContext.customerQuery;\n const channelQuery = fixtureContext.channelQuery;\n let fallbackToken: string | null = options.token ?? fixtureContext.authToken ?? null;\n const resolveFallbackToken = async (): Promise<string> => {\n if (fallbackToken) return fallbackToken;\n fallbackToken = await getAuthToken(page.request, 'admin');\n return fallbackToken;\n };\n\n if (options.preferApi) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n let createPageReady = false;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n await page.goto(`/backend/sales/documents/create?kind=${options.kind}`, {\n waitUntil: 'domcontentloaded',\n });\n await page.getByText(/Loading\u2026|Loading\\.\\.\\./i).first().waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n const createButton = page.getByRole('button', { name: /^Create$/i }).first();\n if (await createButton.isVisible().catch(() => false)) {\n createPageReady = true;\n break;\n }\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (!recovered && attempt === 2) {\n await expect(createButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n }\n if (!createPageReady) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n await expect(page.getByRole('button', { name: /^Create$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n\n const generateButton = page.getByRole('button', { name: /Generate/i }).first();\n const createButton = page.getByRole('button', { name: /^Create$/i }).first();\n const hasGenerateButton = (await generateButton.count()) > 0;\n if (hasGenerateButton) {\n await expect(generateButton).toBeVisible({ timeout: 10_000 });\n }\n\n await page.getByText('Document type').click();\n const customerSelected = await selectLookupValue(\n page.getByRole('textbox', { name: /Search customers/i }).first(),\n customerQuery,\n new RegExp(escapeRegExp(customerQuery), 'i'),\n );\n const channelSelected = await selectLookupValue(\n page.getByRole('textbox', { name: /Select a channel/i }).first(),\n channelQuery,\n new RegExp(escapeRegExp(channelQuery), 'i'),\n );\n if (!customerSelected || !channelSelected) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n await selectFirstAddressIfAvailable(page);\n\n const createEnabled = await createButton.isEnabled().catch(() => false);\n if (!createEnabled) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n await createButton.click();\n const navigated = await page.waitForURL(\n new RegExp(\n `/backend/sales/(?:documents/[0-9a-f-]{36}\\\\?kind=${options.kind}|${options.kind === 'order' ? 'orders' : 'quotes'}/[0-9a-f-]{36})$`,\n 'i',\n ),\n { timeout: TEST_WAIT_TIMEOUT_MS },\n ).then(() => true).catch(() => false);\n if (!navigated) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n const match = page.url().match(/\\/backend\\/sales\\/(?:documents|orders|quotes)\\/([0-9a-f-]{36})/i);\n if (!match) {\n throw new Error(`Could not resolve document id from URL: ${page.url()}`);\n }\n const loaded = await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS);\n if (!loaded) {\n await openSalesDocumentPage(page, match[1], options.kind);\n }\n return match[1];\n}\n\nfunction lineDialog(page: Page): Locator {\n return page.getByRole('dialog', { name: /Add line|Edit line/i });\n}\n\nasync function selectFirstOption(container: Locator, rowNamePattern: RegExp): Promise<void> {\n const optionRow = container.getByRole('button', { name: rowNamePattern }).first();\n await optionRow.waitFor({ state: 'visible', timeout: 4_000 }).catch(() => {});\n if ((await optionRow.count()) === 0) return;\n\n const selectButton = optionRow.getByRole('button', { name: /^Select$/i }).first();\n if ((await selectButton.count()) > 0) {\n await selectButton.click();\n return;\n }\n await optionRow.click();\n}\n\nasync function selectFirstLookupOption(input: Locator, rowNamePattern: RegExp): Promise<void> {\n const root = lookupRootFromInput(input);\n await waitForLookupIdle(root);\n await selectFirstOption(root, rowNamePattern);\n}\n\nasync function selectShipmentMethod(dialog: Locator): Promise<void> {\n const shippingMethodInput = dialog.getByPlaceholder(/Select method/i).first();\n if ((await shippingMethodInput.count()) === 0) return;\n const selected = await selectLookupValue(shippingMethodInput, 'Standard', /standard ground|express air|standard/i);\n if (!selected) {\n await selectFirstLookupOption(shippingMethodInput, /standard ground|express air|standard/i);\n }\n}\n\nasync function selectShipmentStatus(dialog: Locator): Promise<void> {\n const statusInput = dialog.getByPlaceholder(/Select shipment status/i).first();\n if ((await statusInput.count()) > 0) {\n const selected = await selectLookupValue(statusInput, 'Shipped', /shipped|in transit|packed/i);\n if (selected) return;\n await selectFirstLookupOption(statusInput, /shipped|in transit|packed/i);\n return;\n }\n}\n\nasync function selectShipmentAddress(dialog: Locator): Promise<void> {\n const addressInput = dialog.getByPlaceholder(/Select address/i).first();\n if ((await addressInput.count()) === 0) return;\n const currentValue = await addressInput.inputValue().catch(() => '');\n if (currentValue.trim().length > 0) return;\n const selected = await selectLookupValue(addressInput, 'Address', /shipping address|document address|address/i);\n if (!selected) {\n await selectFirstLookupOption(addressInput, /shipping address|document address|address/i);\n }\n}\n\nasync function fillShipmentQuantity(dialog: Locator): Promise<void> {\n const quantityInputs = dialog.getByRole('spinbutton');\n const count = await quantityInputs.count();\n for (let index = 0; index < count; index += 1) {\n const input = quantityInputs.nth(index);\n const isVisible = await input.isVisible().catch(() => false);\n const isEnabled = await input.isEnabled().catch(() => false);\n if (!isVisible || !isEnabled) continue;\n await input.fill('1').catch(() => {});\n }\n}\n\nasync function fillShipmentDates(dialog: Locator): Promise<void> {\n const now = new Date();\n const day = String(now.getDate()).padStart(2, '0');\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const year = String(now.getFullYear());\n const shippedDateValue = `${day}/${month}/${year}`;\n\n const shippedDateInput = dialog.getByLabel(/Shipped date/i).first();\n if ((await shippedDateInput.count()) > 0) {\n const currentValue = await shippedDateInput.inputValue().catch(() => '');\n if (currentValue.trim().length === 0) {\n await shippedDateInput.fill(shippedDateValue).catch(() => {});\n }\n }\n}\n\nasync function fillShipmentNumber(dialog: Locator, shipmentNumber: string): Promise<void> {\n const shipmentNumberInput = dialog.getByRole('textbox').first();\n if (!(await shipmentNumberInput.isVisible().catch(() => false)) && (await shipmentNumberInput.count().catch(() => 0)) === 0) {\n return;\n }\n await waitForStableVisibility(shipmentNumberInput, 4_000).catch(() => {});\n await shipmentNumberInput.fill(shipmentNumber).catch(() => {});\n await shipmentNumberInput.press('Tab').catch(() => {});\n}\n\nexport async function addCustomLine(page: Page, options: AddLineOptions): Promise<void> {\n await ensureSalesDocumentReady(page);\n await page.getByRole('button', { name: /^Items$/i }).click();\n const addItemButton = page.getByRole('button', { name: /Add item/i }).first();\n await expect(addItemButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await expect(addItemButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n await addItemButton.click();\n\n const dialog = lineDialog(page);\n await expect(dialog).toBeVisible();\n\n const customLineButton = dialog.getByRole('button', { name: /Custom line/i });\n await expect(customLineButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await customLineButton.click();\n\n const nameInput = dialog.getByRole('textbox', { name: /Optional line name/i });\n await expect(nameInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await nameInput.fill(options.name);\n await dialog.getByRole('textbox', { name: '0.00' }).fill(String(options.unitPriceGross));\n await dialog.getByRole('textbox', { name: '1' }).fill(String(options.quantity));\n\n if (options.taxClassName) {\n const taxClassSelect = dialog\n .locator('select')\n .filter({ has: dialog.locator('option', { hasText: /No tax class selected/i }) })\n .first();\n if ((await taxClassSelect.count()) > 0) {\n await taxClassSelect.selectOption({ label: options.taxClassName });\n }\n }\n\n const submitButton = dialog.getByRole('button', { name: /Add item/i });\n await expect(submitButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await expect(submitButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n const lineRow = page.getByRole('row', { name: new RegExp(escapeRegExp(options.name), 'i') });\n for (let attempt = 0; attempt < 2; attempt += 1) {\n await submitButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {}),\n lineRow.waitFor({ state: 'visible', timeout: 3_000 }).catch(() => {}),\n ]);\n if (await lineRow.isVisible().catch(() => false)) break;\n if (!(await dialog.isVisible().catch(() => false))) break;\n }\n\n if (await dialog.isVisible().catch(() => false)) {\n await expect(dialog).toBeHidden({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n await page.getByRole('button', { name: /^Items$/i }).click().catch(() => {});\n await expect(lineRow).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n}\n\nexport async function updateLineQuantity(page: Page, lineName: string, quantity: number): Promise<void> {\n await page.getByRole('button', { name: /^Items$/i }).click();\n const row = page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') });\n await row.click();\n\n const dialog = page.getByRole('dialog', { name: /Edit line/i });\n await expect(dialog).toBeVisible();\n await dialog.getByRole('textbox', { name: '1' }).fill(String(quantity));\n await dialog.getByRole('button', { name: /Save changes/i }).click();\n\n await expect(page.getByRole('row', { name: new RegExp(`${escapeRegExp(lineName)}.*\\\\b${quantity}\\\\b`, 'i') })).toBeVisible();\n}\n\nexport async function deleteLine(page: Page, lineName: string): Promise<void> {\n await page.getByRole('button', { name: /^Items$/i }).click();\n const row = page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') });\n await expect(row).toBeVisible();\n await row.locator('button').last().click();\n\n const confirmDialog = page.getByRole('alertdialog');\n if (await confirmDialog.isVisible().catch(() => false)) {\n await confirmDialog.getByRole('button', { name: /^Delete$/i }).first().click();\n await expect(confirmDialog).toBeHidden();\n }\n\n await expect(page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') })).toHaveCount(0);\n}\n\nexport async function addAdjustment(page: Page, options: AddAdjustmentOptions): Promise<void> {\n const adjustmentsTab = page.getByRole('button', { name: /^Adjustments$/i }).first();\n await waitForStableVisibility(adjustmentsTab, TEST_WAIT_TIMEOUT_MS);\n await adjustmentsTab.click();\n const addAdjustmentButton = page.getByRole('button', { name: /Add adjustment/i }).first();\n await waitForStableVisibility(addAdjustmentButton, TEST_WAIT_TIMEOUT_MS);\n await addAdjustmentButton.click();\n\n const dialog = page.getByRole('dialog', { name: /Add adjustment/i });\n await expect(dialog).toBeVisible();\n const adjustmentRow = page.getByRole('row', { name: new RegExp(escapeRegExp(options.label), 'i') });\n const fillAdjustmentForm = async (): Promise<void> => {\n await dialog.getByText(/Loading adjustments/i).waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {});\n const kindSelect = dialog.locator('select').first();\n await expect(kindSelect).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n\n const labelInput = dialog.getByPlaceholder(/e\\.g\\. Shipping fee/i).first();\n await expect(labelInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await labelInput.fill(options.label);\n await expect(labelInput).toHaveValue(options.label, { timeout: 2_000 });\n\n if ((await kindSelect.count()) > 0) {\n const expectedKindValue = normalizeAdjustmentKindValue(options.kindLabel ?? 'Surcharge');\n await kindSelect.locator('option', { hasText: new RegExp(`^${escapeRegExp(options.kindLabel ?? 'Surcharge')}$`, 'i') })\n .first()\n .waitFor({ state: 'attached', timeout: 2_000 })\n .catch(() => {});\n await kindSelect.selectOption({ label: options.kindLabel ?? 'Surcharge' }).catch(async () => {\n await kindSelect.selectOption({ label: 'Custom' });\n });\n await expect(kindSelect).toHaveValue(new RegExp(`^${escapeRegExp(expectedKindValue)}$`, 'i'), {\n timeout: 2_000,\n });\n }\n\n const fixedAmountButton = dialog.getByRole('button', { name: /^Fixed amount$/i }).first();\n if ((await fixedAmountButton.count()) > 0) {\n await fixedAmountButton.click().catch(() => {});\n }\n\n const enabledAmountInputs = dialog.locator('input[placeholder=\"0.00\"]:not([disabled])');\n await expect(enabledAmountInputs.first()).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n if ((await enabledAmountInputs.count()) > 0) {\n await enabledAmountInputs.first().fill(String(options.netAmount));\n await expect(enabledAmountInputs.first()).toHaveValue(String(options.netAmount), { timeout: 2_000 }).catch(() => {});\n }\n };\n\n let saved = false;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n await fillAdjustmentForm();\n const submitButton = dialog.getByRole('button', { name: /Add adjustment/i }).first();\n await waitForStableVisibility(submitButton, 4_000).catch(() => {});\n await submitButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {}),\n adjustmentRow.waitFor({ state: 'visible', timeout: 3_000 }).catch(() => {}),\n ]);\n saved =\n !(await dialog.isVisible().catch(() => false)) ||\n (await adjustmentRow.isVisible().catch(() => false));\n if (saved) break;\n }\n\n if (await dialog.isVisible().catch(() => false)) {\n await expect(dialog).toBeHidden({ timeout: 5_000 });\n }\n if (!(await adjustmentRow.isVisible().catch(() => false))) {\n await adjustmentsTab.click().catch(() => {});\n await adjustmentRow.waitFor({ state: 'visible', timeout: 2_000 }).catch(() => {});\n }\n}\n\nexport async function addPayment(page: Page, amount: number): Promise<{ amountLabel: string; added: boolean }> {\n await ensureSalesDocumentReady(page);\n const paymentsTab = page.getByRole('button', { name: /^Payments$/i }).first();\n await waitForStableVisibility(paymentsTab, TEST_WAIT_TIMEOUT_MS);\n await paymentsTab.click();\n const amountLabel = amount.toFixed(2);\n const amountInputValue = String(Math.max(1, Math.round(amount)));\n const addPaymentButton = page.getByRole('button', { name: /Add payment/i }).first();\n await waitForStableVisibility(addPaymentButton, TEST_WAIT_TIMEOUT_MS);\n await expect(addPaymentButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n await addPaymentButton.click();\n\n const dialog = page.getByRole('dialog', { name: /Add payment/i });\n const amountInput = dialog.locator('input[placeholder=\"0.00\"]').first();\n await waitForDialogFieldReady(dialog, amountInput, /Loading payment methods\u2026|Loading payment methods\\.\\.\\./i);\n const setAmount = async (): Promise<void> => {\n const refreshedAmountInput = dialog.locator('input[placeholder=\"0.00\"]').first();\n await waitForStableVisibility(refreshedAmountInput, 4_000).catch(() => {});\n await refreshedAmountInput.fill(amountInputValue).catch(() => {});\n await refreshedAmountInput.press('Tab').catch(() => {});\n };\n const selectMethodInput = dialog.getByPlaceholder(/Search payment method/i).first();\n const statusInput = dialog.getByPlaceholder(/Select status/i).first();\n await setAmount();\n await waitForStableVisibility(selectMethodInput, 4_000).catch(() => {});\n await selectLookupValue(selectMethodInput, 'Bank', /bank transfer|credit card|cash on delivery/i).catch(() => false);\n await waitForStableVisibility(statusInput, 4_000).catch(() => {});\n await selectLookupValue(statusInput, 'Pending', /pending|captured/i).catch(() => false);\n const saveButton = dialog.getByRole('button', { name: /Save/i }).first();\n const operationMessage = page.getByText(/Last operation:\\s*Create payment/i).first();\n for (let attempt = 0; attempt < 2; attempt += 1) {\n await setAmount();\n await selectLookupValue(selectMethodInput, 'Bank', /bank transfer|credit card|cash on delivery/i).catch(() => false);\n await selectLookupValue(statusInput, 'Pending', /pending|captured/i).catch(() => false);\n await waitForStableVisibility(saveButton, 4_000).catch(() => {});\n await saveButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_500 }).catch(() => {}),\n operationMessage.waitFor({ state: 'visible', timeout: 3_500 }).catch(() => {}),\n dialog.getByText(/This field is required/i).first().waitFor({ state: 'visible', timeout: 3_500 }).catch(() => {}),\n ]);\n if (!(await dialog.isVisible().catch(() => false))) break;\n if (await operationMessage.isVisible().catch(() => false)) break;\n await waitForOptionalTextToDisappear(dialog, /Loading payment methods\u2026|Loading payment methods\\.\\.\\./i, 3_000);\n }\n if (await dialog.isVisible().catch(() => false)) {\n await dialog.press('Escape').catch(() => {});\n await dialog.waitFor({ state: 'hidden', timeout: 1_500 }).catch(() => {});\n }\n await operationMessage.waitFor({ state: 'visible', timeout: 2_500 }).catch(() => {});\n let added = await operationMessage.isVisible().catch(() => false);\n if (!added) {\n added = await addPaymentViaApi(page, amount);\n }\n return { amountLabel, added };\n}\n\nexport async function addShipment(page: Page): Promise<{ trackingNumber: string; shipmentNumber: string; added: boolean }> {\n await ensureSalesDocumentReady(page);\n await ensureShippingMethodFixture(page);\n const shipmentsTab = page.getByRole('button', { name: /^Shipments$/i }).first();\n await waitForStableVisibility(shipmentsTab, TEST_WAIT_TIMEOUT_MS);\n await shipmentsTab.click();\n const trackingNumber = `SHIP-${Date.now()}`;\n const shipmentNumber = String(Date.now());\n const dialog = page.getByRole('dialog', { name: /Add shipment/i });\n const openShipmentDialog = async (): Promise<boolean> => {\n const addShipmentButtons = page.getByRole('button', { name: /Add shipment/i });\n const buttonCount = await addShipmentButtons.count();\n for (let index = buttonCount - 1; index >= 0; index -= 1) {\n const button = addShipmentButtons.nth(index);\n if (!(await button.isVisible().catch(() => false))) continue;\n if (!(await button.isEnabled().catch(() => false))) continue;\n await waitForStableVisibility(button, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n await button.scrollIntoViewIfNeeded().catch(() => {});\n await button.click().catch(() => {});\n const visible = await dialog.waitFor({ state: 'visible', timeout: 2_500 }).then(() => true).catch(() => false);\n if (visible) return true;\n }\n return false;\n };\n\n let dialogReady = false;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n const opened = await openShipmentDialog();\n if (!opened) break;\n await dialog\n .getByText(/Loading shipments\u2026|Loading shipments\\.\\.\\./i)\n .first()\n .waitFor({ state: 'hidden', timeout: 5_000 })\n .catch(() => {});\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n if (await shipmentNumberInput.isVisible().catch(() => false)) {\n await waitForStableVisibility(shipmentNumberInput, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n dialogReady = true;\n break;\n }\n await dialog.getByRole('button', { name: /Close/i }).first().click().catch(() => {});\n await dialog.waitFor({ state: 'hidden', timeout: 2_000 }).catch(() => {});\n }\n if (!dialogReady) {\n const added = await addShipmentViaApi(page, shipmentNumber, trackingNumber);\n if (!added) {\n await openShipmentDialog();\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n await waitForDialogFieldReady(dialog, shipmentNumberInput, /Loading shipments\u2026|Loading shipments\\.\\.\\./i);\n } else {\n const shipmentLabel = page.getByText(new RegExp(`Shipment\\\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();\n const visible = await shipmentLabel\n .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n return { trackingNumber, shipmentNumber, added: visible };\n }\n }\n\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n await fillShipmentNumber(dialog, shipmentNumber);\n const trackingInput = dialog.getByPlaceholder(/One per line or comma separated/i).first();\n await waitForStableVisibility(trackingInput, 4_000).catch(() => {});\n await trackingInput.fill(trackingNumber).catch(() => {});\n await selectShipmentMethod(dialog);\n await selectShipmentStatus(dialog);\n await selectShipmentAddress(dialog);\n await fillShipmentQuantity(dialog);\n await fillShipmentDates(dialog);\n await fillShipmentNumber(dialog, shipmentNumber);\n\n await dialog.getByText(/Searching\u2026|Searching\\.\\.\\./i).first().waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n const saveButton = dialog.getByRole('button', { name: /^Save\\b/i }).first();\n const canClickSave = (await saveButton.count()) > 0 && (await saveButton.isVisible().catch(() => false));\n if (canClickSave) {\n await saveButton.click({ timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n } else {\n await dialog.press('ControlOrMeta+Enter').catch(() => {});\n }\n\n let closed = await dialog\n .waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n\n if (!closed) {\n for (let attempt = 0; attempt < 2; attempt += 1) {\n if (!(await dialog.isVisible().catch(() => false))) break;\n await selectShipmentMethod(dialog);\n await selectShipmentAddress(dialog);\n await fillShipmentQuantity(dialog);\n await fillShipmentDates(dialog);\n await fillShipmentNumber(dialog, shipmentNumber);\n if (canClickSave) {\n await saveButton.click({ timeout: 2_000 }).catch(() => {});\n } else {\n await dialog.press('ControlOrMeta+Enter').catch(() => {});\n }\n closed = await dialog\n .waitFor({ state: 'hidden', timeout: 2_000 })\n .then(() => true)\n .catch(() => false);\n if (closed) break;\n }\n }\n\n if (!closed) {\n return { trackingNumber, shipmentNumber, added: false };\n }\n\n await page.getByRole('button', { name: /^Shipments$/i }).click();\n const shipmentLabel = page.getByText(new RegExp(`Shipment\\\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();\n const added = await shipmentLabel\n .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n return { trackingNumber, shipmentNumber, added };\n}\n\nexport async function readGrandTotalGross(page: Page): Promise<number> {\n const row = page.getByRole('row', { name: /Grand total \\(gross\\)/i }).first();\n await expect(row).toBeVisible();\n const text = (await row.innerText()).trim();\n return parseCurrencyAmount(text);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { expect, type Locator, type Page } from '@playwright/test';\nimport { apiRequest, getAuthToken } from './api';\n\ntype DocumentKind = 'quote' | 'order';\n\ntype CreateDocumentOptions = {\n kind: DocumentKind;\n customerQuery?: string;\n channelQuery?: string;\n preferApi?: boolean;\n token?: string;\n};\n\ntype ChannelListItem = {\n id?: string | null;\n name?: string | null;\n code?: string | null;\n isActive?: boolean | null;\n};\n\ntype CustomerAddressListItem = {\n id?: string | null;\n name?: string | null;\n purpose?: string | null;\n company_name?: string | null;\n companyName?: string | null;\n address_line1?: string | null;\n addressLine1?: string | null;\n address_line2?: string | null;\n addressLine2?: string | null;\n building_number?: string | null;\n buildingNumber?: string | null;\n flat_number?: string | null;\n flatNumber?: string | null;\n city?: string | null;\n region?: string | null;\n postal_code?: string | null;\n postalCode?: string | null;\n country?: string | null;\n};\n\ntype DocumentAddressPayload = {\n customerAddressId?: string;\n name?: string;\n purpose?: string;\n companyName?: string;\n addressLine1: string;\n addressLine2?: string;\n buildingNumber?: string;\n flatNumber?: string;\n city?: string;\n region?: string;\n postalCode?: string;\n country?: string;\n};\n\ntype SalesOrderLineListItem = {\n id?: string | null;\n};\n\ntype PaymentMethodListItem = {\n id?: string | null;\n name?: string | null;\n code?: string | null;\n isActive?: boolean | null;\n};\n\ntype AddLineOptions = {\n name: string;\n quantity: number;\n unitPriceGross: number;\n taxClassName?: string;\n};\n\ntype AddAdjustmentOptions = {\n label: string;\n kindLabel?: string;\n netAmount: number;\n};\n\nconst TEST_WAIT_TIMEOUT_MS = 10_000;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction parseCurrencyAmount(value: string): number {\n const normalized = value.replace(/,/g, '');\n const matches = normalized.match(/-?\\$[0-9]+(?:\\.[0-9]{2})?/g);\n const lastMatch = matches?.[matches.length - 1];\n if (!lastMatch) {\n throw new Error(`Could not parse currency from: ${value}`);\n }\n return Number.parseFloat(lastMatch.replace('$', ''));\n}\n\nfunction normalizeAdjustmentKindValue(kindLabel: string): string {\n return kindLabel.trim().toLowerCase().replace(/\\s+/g, '_');\n}\n\nfunction readId(payload: unknown, keys: string[]): string | null {\n if (!payload || typeof payload !== 'object') return null;\n const map = payload as Record<string, unknown>;\n for (const key of keys) {\n const value = map[key];\n if (typeof value === 'string' && value.length > 0) return value;\n }\n for (const value of Object.values(map)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const nested = readId(value, keys);\n if (nested) return nested;\n }\n }\n return null;\n}\n\nfunction readListItems<T>(payload: { result?: { items?: T[] }; items?: T[] } | null): T[] {\n return Array.isArray(payload?.result?.items)\n ? payload.result.items\n : Array.isArray(payload?.items)\n ? payload.items\n : [];\n}\n\nfunction resolveOrderIdFromPage(page: Page): string | null {\n const match = page.url().match(/\\/backend\\/sales\\/(?:documents|orders)\\/([0-9a-f-]{36})/i);\n return match?.[1] ?? null;\n}\n\nasync function ensureSalesDocumentFixtures(\n page: Page,\n options: CreateDocumentOptions,\n): Promise<{\n customerQuery: string;\n channelQuery: string;\n customerEntityId?: string | null;\n channelId?: string | null;\n customerAddressId?: string | null;\n authToken?: string | null;\n}> {\n let customerQuery = options.customerQuery;\n let channelQuery = options.channelQuery;\n let customerEntityId: string | null = null;\n let channelId: string | null = null;\n let customerAddressId: string | null = null;\n\n if (customerQuery && channelQuery) {\n return { customerQuery, channelQuery, authToken: options.token ?? null };\n }\n\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n if (!token) {\n if (!customerQuery) {\n customerQuery = `QA Sales Customer ${Date.now()}`;\n await page.goto('/backend/customers/companies/create');\n await page.locator('form').getByRole('textbox').first().fill(customerQuery);\n await page.getByPlaceholder('https://example.com').fill('https://example.com');\n await page.locator('form').getByRole('button', { name: /Create Company/i }).click();\n await expect(page).toHaveURL(/\\/backend\\/customers\\/companies\\/[0-9a-f-]{36}$/i);\n }\n if (!channelQuery) {\n const timestamp = Date.now();\n channelQuery = `QA Sales Channel ${timestamp}`;\n const channelCode = `qa-sales-channel-${timestamp}`;\n await page.goto('/backend/sales/channels');\n await page.getByRole('link', { name: /Add channel/i }).click();\n const createForm = page.locator('form').first();\n await createForm.getByRole('textbox').nth(0).fill(channelQuery);\n await createForm.getByRole('textbox').nth(1).fill(channelCode);\n await page.getByRole('button', { name: /Create channel|Create/i }).last().click();\n await expect(page).toHaveURL(/\\/backend\\/sales\\/channels$/i);\n }\n return {\n customerQuery,\n channelQuery,\n authToken: options.token ?? null,\n };\n }\n\n if (!customerQuery) {\n const companyName = `QA Sales Customer ${Date.now()}`;\n const companyResponse = await apiRequest(page.request, 'POST', '/api/customers/companies', {\n token,\n data: { displayName: companyName },\n }).catch(() => null);\n if (companyResponse && companyResponse.ok()) {\n const companyBody = (await companyResponse.json().catch(() => null)) as unknown;\n customerEntityId = readId(companyBody, ['id', 'entityId', 'companyId']);\n if (customerEntityId) {\n await apiRequest(page.request, 'POST', '/api/customers/addresses', {\n token,\n data: {\n entityId: customerEntityId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n isPrimary: true,\n },\n }).then(async (response) => {\n const body = (await response.json().catch(() => null)) as unknown;\n customerAddressId = readId(body, ['id', 'addressId']);\n }).catch(() => {});\n customerQuery = companyName;\n }\n }\n if (!customerQuery) {\n customerQuery = 'Copperleaf';\n }\n }\n\n if (!channelQuery) {\n const existingChannelsResponse = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/channels?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const existingChannelsBody = (await existingChannelsResponse?.json().catch(() => null)) as { items?: ChannelListItem[] } | null;\n const existingChannels = Array.isArray(existingChannelsBody?.items) ? existingChannelsBody.items : [];\n const preferredExistingChannel =\n existingChannels.find((item) => item.code === 'online' && item.isActive !== false) ??\n existingChannels.find((item) => item.isActive !== false);\n if (preferredExistingChannel?.name) {\n channelQuery = preferredExistingChannel.name;\n channelId = preferredExistingChannel.id ?? null;\n } else {\n const timestamp = Date.now();\n const channelName = `QA Sales Channel ${timestamp}`;\n const channelCode = `qa-sales-channel-${timestamp}`;\n const channelResponse = await apiRequest(page.request, 'POST', '/api/sales/channels', {\n token,\n data: {\n name: channelName,\n code: channelCode,\n },\n }).catch(() => null);\n if (channelResponse && channelResponse.ok()) {\n channelQuery = channelName;\n const channelBody = (await channelResponse.json().catch(() => null)) as unknown;\n channelId = readId(channelBody, ['id', 'channelId']);\n } else {\n channelQuery = 'online';\n }\n }\n }\n\n return {\n customerQuery: customerQuery ?? 'Copperleaf',\n channelQuery: channelQuery ?? 'online',\n customerEntityId,\n channelId,\n customerAddressId,\n authToken: token,\n };\n}\n\nasync function selectFirstAddressIfAvailable(page: Page): Promise<void> {\n // Radix Select: trigger has placeholder text \"Select address\" rendered inside\n const addressTrigger = page\n .locator('[role=\"combobox\"]')\n .filter({ hasText: /Select address/i })\n .first();\n if ((await addressTrigger.count()) === 0) return;\n if (!(await addressTrigger.isEnabled().catch(() => false))) return;\n\n await addressTrigger.click();\n // Pick the first available option from the portal-rendered listbox\n const firstOption = page.getByRole('option').first();\n if ((await firstOption.count()) === 0) {\n // Close listbox if no options\n await page.keyboard.press('Escape');\n return;\n }\n await firstOption.click();\n}\n\nasync function ensureShippingMethodFixture(page: Page): Promise<void> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n if (!token) return;\n\n const existing = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/shipping-methods?page=1&pageSize=1&isActive=true',\n { token },\n ).catch(() => null);\n const existingBody = (await existing?.json().catch(() => null)) as { result?: { items?: unknown[] } } | null;\n const existingItems = Array.isArray(existingBody?.result?.items) ? existingBody?.result?.items : [];\n if (existingItems.length > 0) return;\n\n const stamp = Date.now();\n await apiRequest(page.request, 'POST', '/api/sales/shipping-methods', {\n token,\n data: {\n name: `QA Shipping Method ${stamp}`,\n code: `qa-shipping-${stamp}`,\n isActive: true,\n currencyCode: 'USD',\n baseRateNet: '10.00',\n baseRateGross: '10.00',\n },\n }).catch(() => {});\n}\n\nfunction lookupRootFromInput(input: Locator): Locator {\n return input.locator('xpath=ancestor::div[contains(@class,\"space-y-3\")][1]');\n}\n\nasync function waitForLookupIdle(root: Locator): Promise<void> {\n await root\n .getByText(/Searching\u2026|Searching\\.\\.\\.|Loading\u2026|Loading\\.\\.\\./i)\n .first()\n .waitFor({ state: 'hidden', timeout: 1_200 })\n .catch(() => {});\n}\n\nasync function waitForOptionalTextToDisappear(scope: Locator, pattern: RegExp, timeout = 2_500): Promise<void> {\n await scope.getByText(pattern).first().waitFor({ state: 'hidden', timeout }).catch(() => {});\n}\n\nasync function waitForStableVisibility(locator: Locator, timeout = TEST_WAIT_TIMEOUT_MS): Promise<void> {\n await expect(locator).toBeVisible({ timeout });\n let stableChecks = 0;\n const deadline = Date.now() + Math.min(timeout, 2_000);\n while (Date.now() < deadline) {\n if (await locator.isVisible().catch(() => false)) {\n stableChecks += 1;\n if (stableChecks >= 3) return;\n } else {\n stableChecks = 0;\n }\n await locator.page().waitForTimeout(50).catch(() => {});\n }\n}\n\nasync function waitForDialogFieldReady(\n dialog: Locator,\n field: Locator,\n loadingPattern?: RegExp,\n): Promise<void> {\n await expect(dialog).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n if (loadingPattern) {\n await waitForOptionalTextToDisappear(dialog, loadingPattern, TEST_WAIT_TIMEOUT_MS);\n }\n await waitForStableVisibility(field, TEST_WAIT_TIMEOUT_MS);\n await field.scrollIntoViewIfNeeded().catch(() => {});\n}\n\nasync function recoverGenericErrorPageIfPresent(page: Page): Promise<boolean> {\n const errorHeading = page.getByRole('heading', { name: /^Something went wrong$/i }).first();\n if (!(await errorHeading.isVisible().catch(() => false))) return false;\n const retryButton = page.getByRole('button', { name: /Try again/i }).first();\n if (await retryButton.isVisible().catch(() => false)) {\n await retryButton.click().catch(() => {});\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n } else {\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n }\n return true;\n}\n\nasync function resolveCustomerEntityId(\n page: Page,\n token: string,\n customerQuery: string,\n): Promise<string | null> {\n const params = new URLSearchParams({ page: '1', pageSize: '5', search: customerQuery });\n const response = await apiRequest(page.request, 'GET', `/api/customers/companies?${params.toString()}`, { token }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: Array<Record<string, unknown>> };\n items?: Array<Record<string, unknown>>;\n } | null;\n const items = Array.isArray(body?.result?.items)\n ? body.result.items\n : Array.isArray(body?.items)\n ? body.items\n : [];\n const exactMatch = items.find((item) => {\n const displayName = typeof item.displayName === 'string'\n ? item.displayName\n : typeof item.display_name === 'string'\n ? item.display_name\n : '';\n return displayName.trim().toLowerCase() === customerQuery.trim().toLowerCase();\n }) ?? items[0];\n return exactMatch ? readId(exactMatch, ['id', 'entityId', 'companyId']) : null;\n}\n\nfunction toDocumentAddressPayload(address: CustomerAddressListItem): DocumentAddressPayload | null {\n const addressLine1 = typeof address.addressLine1 === 'string'\n ? address.addressLine1\n : typeof address.address_line1 === 'string'\n ? address.address_line1\n : null;\n if (!addressLine1) return null;\n return {\n customerAddressId: typeof address.id === 'string' ? address.id : undefined,\n name: typeof address.name === 'string' ? address.name : undefined,\n purpose: typeof address.purpose === 'string' ? address.purpose : undefined,\n companyName: typeof address.companyName === 'string'\n ? address.companyName\n : typeof address.company_name === 'string'\n ? address.company_name\n : undefined,\n addressLine1,\n addressLine2: typeof address.addressLine2 === 'string'\n ? address.addressLine2\n : typeof address.address_line2 === 'string'\n ? address.address_line2\n : undefined,\n buildingNumber: typeof address.buildingNumber === 'string'\n ? address.buildingNumber\n : typeof address.building_number === 'string'\n ? address.building_number\n : undefined,\n flatNumber: typeof address.flatNumber === 'string'\n ? address.flatNumber\n : typeof address.flat_number === 'string'\n ? address.flat_number\n : undefined,\n city: typeof address.city === 'string' ? address.city : undefined,\n region: typeof address.region === 'string' ? address.region : undefined,\n postalCode: typeof address.postalCode === 'string'\n ? address.postalCode\n : typeof address.postal_code === 'string'\n ? address.postal_code\n : undefined,\n country: typeof address.country === 'string' ? address.country : undefined,\n };\n}\n\nasync function ensureCustomerAddressFixture(\n page: Page,\n token: string,\n customerEntityId: string,\n preferredAddressId?: string | null,\n): Promise<DocumentAddressPayload | null> {\n const existingResponse = await apiRequest(\n page.request,\n 'GET',\n `/api/customers/addresses?page=1&pageSize=20&entityId=${customerEntityId}`,\n { token },\n ).catch(() => null);\n const existingBody = (await existingResponse?.json().catch(() => null)) as {\n result?: { items?: CustomerAddressListItem[] };\n items?: CustomerAddressListItem[];\n } | null;\n const existingItems = Array.isArray(existingBody?.result?.items)\n ? existingBody.result.items\n : Array.isArray(existingBody?.items)\n ? existingBody.items\n : [];\n const preferredAddress = existingItems.find((item) => item.id === preferredAddressId)\n ?? existingItems.find((item) => item.purpose?.toLowerCase() === 'shipping')\n ?? existingItems[0];\n const preferredPayload = preferredAddress ? toDocumentAddressPayload(preferredAddress) : null;\n if (preferredPayload) return preferredPayload;\n\n const createResponse = await apiRequest(page.request, 'POST', '/api/customers/addresses', {\n token,\n data: {\n entityId: customerEntityId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n isPrimary: true,\n },\n }).catch(() => null);\n const createBody = (await createResponse?.json().catch(() => null)) as unknown;\n const createdAddressId = readId(createBody, ['id', 'addressId']);\n if (!createResponse?.ok() || !createdAddressId) return null;\n return {\n customerAddressId: createdAddressId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n };\n}\n\nasync function resolveSalesChannelId(page: Page, token: string, channelQuery: string): Promise<string | null> {\n const resolveItems = async (search?: string): Promise<ChannelListItem[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '5', isActive: 'true' });\n if (search && search.trim().length > 0) params.set('search', search.trim());\n const response = await apiRequest(page.request, 'GET', `/api/sales/channels?${params.toString()}`, {\n token,\n }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as { result?: { items?: ChannelListItem[] }; items?: ChannelListItem[] } | null;\n return Array.isArray(body?.result?.items)\n ? body.result.items\n : Array.isArray(body?.items)\n ? body.items\n : [];\n };\n const initialItems = await resolveItems(channelQuery);\n const items = initialItems.length > 0 ? initialItems : await resolveItems();\n const normalizedQuery = channelQuery.trim().toLowerCase();\n const exactMatch = items.find((item) => item.name?.trim().toLowerCase() === normalizedQuery)\n ?? items.find((item) => item.code?.trim().toLowerCase() === normalizedQuery)\n ?? items.find((item) => item.code === 'online')\n ?? items[0];\n return exactMatch?.id ?? null;\n}\n\nasync function resolveOrderLineId(page: Page, token: string, orderId: string): Promise<string | null> {\n const response = await apiRequest(page.request, 'GET', `/api/sales/order-lines?page=1&pageSize=20&orderId=${orderId}`, {\n token,\n }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: SalesOrderLineListItem[] };\n items?: SalesOrderLineListItem[];\n } | null;\n const items = readListItems(body);\n return items.find((item) => typeof item.id === 'string' && item.id.length > 0)?.id ?? null;\n}\n\nasync function resolveShippingMethodId(page: Page, token: string): Promise<string | null> {\n const response = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/shipping-methods?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: ChannelListItem[] };\n items?: ChannelListItem[];\n } | null;\n const items = readListItems(body);\n const preferred = items.find((item) => item.code === 'standard-ground')\n ?? items.find((item) => item.name?.toLowerCase().includes('standard'))\n ?? items[0];\n return preferred?.id ?? null;\n}\n\nasync function resolvePaymentMethodId(page: Page, token: string): Promise<string | null> {\n const response = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/payment-methods?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: PaymentMethodListItem[] };\n items?: PaymentMethodListItem[];\n } | null;\n const items = readListItems(body);\n const preferred = items.find((item) => item.code === 'bank-transfer')\n ?? items.find((item) => item.name?.toLowerCase().includes('bank'))\n ?? items[0];\n return preferred?.id ?? null;\n}\n\nasync function refreshSalesDocumentPage(page: Page, activeTabName: 'Shipments' | 'Payments'): Promise<void> {\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n await ensureSalesDocumentReady(page);\n const tab = page.getByRole('button', { name: new RegExp(`^${activeTabName}$`, 'i') }).first();\n await waitForStableVisibility(tab, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n await tab.click().catch(() => {});\n}\n\nasync function addShipmentViaApi(\n page: Page,\n shipmentNumber: string,\n trackingNumber: string,\n): Promise<boolean> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n const orderId = resolveOrderIdFromPage(page);\n if (!token || !orderId) return false;\n const [orderLineId, shippingMethodId] = await Promise.all([\n resolveOrderLineId(page, token, orderId),\n resolveShippingMethodId(page, token),\n ]);\n if (!orderLineId) return false;\n const response = await apiRequest(page.request, 'POST', '/api/sales/shipments', {\n token,\n data: {\n orderId,\n shipmentNumber,\n ...(shippingMethodId ? { shippingMethodId } : {}),\n trackingNumbers: [trackingNumber],\n shippedAt: new Date().toISOString(),\n currencyCode: 'USD',\n items: [{ orderLineId, quantity: '1' }],\n },\n }).catch(() => null);\n if (!response?.ok()) return false;\n await refreshSalesDocumentPage(page, 'Shipments');\n return true;\n}\n\nasync function addPaymentViaApi(page: Page, amount: number): Promise<boolean> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n const orderId = resolveOrderIdFromPage(page);\n if (!token || !orderId) return false;\n const paymentMethodId = await resolvePaymentMethodId(page, token);\n const response = await apiRequest(page.request, 'POST', '/api/sales/payments', {\n token,\n data: {\n orderId,\n ...(paymentMethodId ? { paymentMethodId } : {}),\n amount: amount.toFixed(2),\n currencyCode: 'USD',\n receivedAt: new Date().toISOString(),\n },\n }).catch(() => null);\n if (!response?.ok()) return false;\n await refreshSalesDocumentPage(page, 'Payments');\n return true;\n}\n\nasync function createSalesDocumentFixture(\n page: Page,\n token: string,\n kind: DocumentKind,\n customerQuery: string,\n channelQuery: string,\n ids?: { customerEntityId?: string | null; channelId?: string | null; customerAddressId?: string | null },\n): Promise<string> {\n const customerEntityId =\n ids?.customerEntityId ??\n await resolveCustomerEntityId(page, token, customerQuery);\n const channelId =\n ids?.channelId ??\n await resolveSalesChannelId(page, token, channelQuery);\n const payload: Record<string, unknown> = {\n currencyCode: 'USD',\n };\n if (customerEntityId) payload.customerEntityId = customerEntityId;\n if (channelId) payload.channelId = channelId;\n\n const response = await apiRequest(page.request, 'POST', kind === 'quote' ? '/api/sales/quotes' : '/api/sales/orders', {\n token,\n data: payload,\n });\n const body = (await response.json().catch(() => null)) as unknown;\n if (!response.ok()) {\n throw new Error(`Failed to create sales ${kind} fixture via API.`);\n }\n const id = readId(body, ['id', kind === 'quote' ? 'quoteId' : 'orderId']);\n if (!id) {\n throw new Error(`Missing sales ${kind} id in API fallback response.`);\n }\n\n if (customerEntityId) {\n const address = await ensureCustomerAddressFixture(page, token, customerEntityId, ids?.customerAddressId);\n if (address) {\n await apiRequest(page.request, 'POST', '/api/sales/document-addresses', {\n token,\n data: {\n documentId: id,\n documentKind: kind,\n ...address,\n },\n }).catch(() => {});\n }\n }\n\n return id;\n}\n\nasync function waitForDocumentLoaded(page: Page, timeout = TEST_WAIT_TIMEOUT_MS): Promise<boolean> {\n const itemsButton = page.getByRole('button', { name: /^Items$/i }).first();\n if (await itemsButton.isVisible().catch(() => false)) return true;\n const loadingIndicator = page.getByText(/Loading document\u2026|Loading document\\.\\.\\./i).first();\n const isLoading = await loadingIndicator.isVisible().catch(() => false);\n if (isLoading) {\n await loadingIndicator.waitFor({ state: 'hidden', timeout }).catch(() => {});\n }\n return await itemsButton.waitFor({ state: 'visible', timeout: Math.min(timeout, 5_000) }).then(() => true).catch(() => false);\n}\n\nasync function openSalesDocumentPage(page: Page, id: string, kind: DocumentKind): Promise<void> {\n const documentUrl = `/backend/sales/documents/${id}?kind=${kind}`;\n await page.goto(documentUrl, { waitUntil: 'domcontentloaded' });\n\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (recovered) {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n continue;\n }\n await page.goto(documentUrl, { waitUntil: 'domcontentloaded' });\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n }\n await expect(page.getByRole('button', { name: /^Items$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n}\n\nasync function ensureSalesDocumentReady(page: Page): Promise<void> {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (recovered) {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n continue;\n }\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n }\n await expect(page.getByRole('button', { name: /^Items$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n}\n\nasync function selectAnyLookupOption(root: Locator): Promise<boolean> {\n const selectButton = root.getByRole('button', { name: /^Select$/i }).first();\n if (await selectButton.isVisible().catch(() => false)) {\n await selectButton.click().catch(() => {});\n return true;\n }\n\n const row = root.locator('[role=\"button\"]').first();\n if (await row.isVisible().catch(() => false)) {\n await row.click().catch(() => {});\n return true;\n }\n\n return false;\n}\n\nasync function selectLookupValue(\n input: Locator,\n query: string,\n preferredRowPattern?: RegExp,\n): Promise<boolean> {\n if (!(await input.isVisible().catch(() => false)) && (await input.count().catch(() => 0)) === 0) return false;\n await waitForStableVisibility(input, 4_000).catch(() => {});\n await input.click().catch(() => {});\n await input.press('ControlOrMeta+a').catch(() => {});\n await input.fill(query).catch(() => {});\n\n const root = lookupRootFromInput(input);\n await waitForLookupIdle(root);\n\n const selectByPreferredRow = async (): Promise<boolean> => {\n if (!preferredRowPattern) return false;\n const row = root.locator('[role=\"button\"]').filter({ hasText: preferredRowPattern }).first();\n const action = row.getByRole('button', { name: /^Select$/i }).first();\n if (await action.isVisible().catch(() => false)) {\n await action.click();\n return true;\n }\n if ((await row.isVisible().catch(() => false))) {\n await row.click().catch(() => {});\n return true;\n }\n return false;\n };\n\n if (await selectByPreferredRow()) return true;\n\n const deadline = Date.now() + 2_000;\n while (Date.now() < deadline) {\n await waitForLookupIdle(root);\n if (await selectAnyLookupOption(root)) return true;\n if (await selectByPreferredRow()) return true;\n const selectedButton = root.getByRole('button', { name: /^Selected$/i }).first();\n if (await selectedButton.isVisible().catch(() => false)) {\n return true;\n }\n await input.page().waitForTimeout(100);\n }\n\n await input.press('ArrowDown').catch(() => {});\n await input.press('Enter').catch(() => {});\n const selectedButton = root.getByRole('button', { name: /^Selected$/i }).first();\n if (await selectedButton.isVisible().catch(() => false)) {\n return true;\n }\n return await selectAnyLookupOption(root);\n}\n\nexport async function createSalesDocument(page: Page, options: CreateDocumentOptions): Promise<string> {\n const fixtureContext = await ensureSalesDocumentFixtures(page, options);\n const customerQuery = fixtureContext.customerQuery;\n const channelQuery = fixtureContext.channelQuery;\n let fallbackToken: string | null = options.token ?? fixtureContext.authToken ?? null;\n const resolveFallbackToken = async (): Promise<string> => {\n if (fallbackToken) return fallbackToken;\n fallbackToken = await getAuthToken(page.request, 'admin');\n return fallbackToken;\n };\n\n if (options.preferApi) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n let createPageReady = false;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n await page.goto(`/backend/sales/documents/create?kind=${options.kind}`, {\n waitUntil: 'domcontentloaded',\n });\n await page.getByText(/Loading\u2026|Loading\\.\\.\\./i).first().waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n const createButton = page.getByRole('button', { name: /^Create$/i }).first();\n if (await createButton.isVisible().catch(() => false)) {\n createPageReady = true;\n break;\n }\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (!recovered && attempt === 2) {\n await expect(createButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n }\n if (!createPageReady) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n await expect(page.getByRole('button', { name: /^Create$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n\n const generateButton = page.getByRole('button', { name: /Generate/i }).first();\n const createButton = page.getByRole('button', { name: /^Create$/i }).first();\n const hasGenerateButton = (await generateButton.count()) > 0;\n if (hasGenerateButton) {\n await expect(generateButton).toBeVisible({ timeout: 10_000 });\n }\n\n await page.getByText('Document type').click();\n const customerSelected = await selectLookupValue(\n page.getByRole('textbox', { name: /Search customers/i }).first(),\n customerQuery,\n new RegExp(escapeRegExp(customerQuery), 'i'),\n );\n const channelSelected = await selectLookupValue(\n page.getByRole('textbox', { name: /Select a channel/i }).first(),\n channelQuery,\n new RegExp(escapeRegExp(channelQuery), 'i'),\n );\n if (!customerSelected || !channelSelected) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n await selectFirstAddressIfAvailable(page);\n\n const createEnabled = await createButton.isEnabled().catch(() => false);\n if (!createEnabled) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n await createButton.click();\n const navigated = await page.waitForURL(\n new RegExp(\n `/backend/sales/(?:documents/[0-9a-f-]{36}\\\\?kind=${options.kind}|${options.kind === 'order' ? 'orders' : 'quotes'}/[0-9a-f-]{36})$`,\n 'i',\n ),\n { timeout: TEST_WAIT_TIMEOUT_MS },\n ).then(() => true).catch(() => false);\n if (!navigated) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n const match = page.url().match(/\\/backend\\/sales\\/(?:documents|orders|quotes)\\/([0-9a-f-]{36})/i);\n if (!match) {\n throw new Error(`Could not resolve document id from URL: ${page.url()}`);\n }\n const loaded = await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS);\n if (!loaded) {\n await openSalesDocumentPage(page, match[1], options.kind);\n }\n return match[1];\n}\n\nfunction lineDialog(page: Page): Locator {\n return page.getByRole('dialog', { name: /Add line|Edit line/i });\n}\n\nasync function selectFirstOption(container: Locator, rowNamePattern: RegExp): Promise<void> {\n const optionRow = container.getByRole('button', { name: rowNamePattern }).first();\n await optionRow.waitFor({ state: 'visible', timeout: 4_000 }).catch(() => {});\n if ((await optionRow.count()) === 0) return;\n\n const selectButton = optionRow.getByRole('button', { name: /^Select$/i }).first();\n if ((await selectButton.count()) > 0) {\n await selectButton.click();\n return;\n }\n await optionRow.click();\n}\n\nasync function selectFirstLookupOption(input: Locator, rowNamePattern: RegExp): Promise<void> {\n const root = lookupRootFromInput(input);\n await waitForLookupIdle(root);\n await selectFirstOption(root, rowNamePattern);\n}\n\nasync function selectShipmentMethod(dialog: Locator): Promise<void> {\n const shippingMethodInput = dialog.getByPlaceholder(/Select method/i).first();\n if ((await shippingMethodInput.count()) === 0) return;\n const selected = await selectLookupValue(shippingMethodInput, 'Standard', /standard ground|express air|standard/i);\n if (!selected) {\n await selectFirstLookupOption(shippingMethodInput, /standard ground|express air|standard/i);\n }\n}\n\nasync function selectShipmentStatus(dialog: Locator): Promise<void> {\n const statusInput = dialog.getByPlaceholder(/Select shipment status/i).first();\n if ((await statusInput.count()) > 0) {\n const selected = await selectLookupValue(statusInput, 'Shipped', /shipped|in transit|packed/i);\n if (selected) return;\n await selectFirstLookupOption(statusInput, /shipped|in transit|packed/i);\n return;\n }\n}\n\nasync function selectShipmentAddress(dialog: Locator): Promise<void> {\n const addressInput = dialog.getByPlaceholder(/Select address/i).first();\n if ((await addressInput.count()) === 0) return;\n const currentValue = await addressInput.inputValue().catch(() => '');\n if (currentValue.trim().length > 0) return;\n const selected = await selectLookupValue(addressInput, 'Address', /shipping address|document address|address/i);\n if (!selected) {\n await selectFirstLookupOption(addressInput, /shipping address|document address|address/i);\n }\n}\n\nasync function fillShipmentQuantity(dialog: Locator): Promise<void> {\n const quantityInputs = dialog.getByRole('spinbutton');\n const count = await quantityInputs.count();\n for (let index = 0; index < count; index += 1) {\n const input = quantityInputs.nth(index);\n const isVisible = await input.isVisible().catch(() => false);\n const isEnabled = await input.isEnabled().catch(() => false);\n if (!isVisible || !isEnabled) continue;\n await input.fill('1').catch(() => {});\n }\n}\n\nasync function fillShipmentDates(dialog: Locator): Promise<void> {\n const now = new Date();\n const day = String(now.getDate()).padStart(2, '0');\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const year = String(now.getFullYear());\n const shippedDateValue = `${day}/${month}/${year}`;\n\n const shippedDateInput = dialog.getByLabel(/Shipped date/i).first();\n if ((await shippedDateInput.count()) > 0) {\n const currentValue = await shippedDateInput.inputValue().catch(() => '');\n if (currentValue.trim().length === 0) {\n await shippedDateInput.fill(shippedDateValue).catch(() => {});\n }\n }\n}\n\nasync function fillShipmentNumber(dialog: Locator, shipmentNumber: string): Promise<void> {\n const shipmentNumberInput = dialog.getByRole('textbox').first();\n if (!(await shipmentNumberInput.isVisible().catch(() => false)) && (await shipmentNumberInput.count().catch(() => 0)) === 0) {\n return;\n }\n await waitForStableVisibility(shipmentNumberInput, 4_000).catch(() => {});\n await shipmentNumberInput.fill(shipmentNumber).catch(() => {});\n await shipmentNumberInput.press('Tab').catch(() => {});\n}\n\nexport async function addCustomLine(page: Page, options: AddLineOptions): Promise<void> {\n await ensureSalesDocumentReady(page);\n await page.getByRole('button', { name: /^Items$/i }).click();\n const addItemButton = page.getByRole('button', { name: /Add item/i }).first();\n await expect(addItemButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await expect(addItemButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n await addItemButton.click();\n\n const dialog = lineDialog(page);\n await expect(dialog).toBeVisible();\n\n const customLineButton = dialog.getByRole('button', { name: /Custom line/i });\n await expect(customLineButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await customLineButton.click();\n\n const nameInput = dialog.getByRole('textbox', { name: /Optional line name/i });\n await expect(nameInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await nameInput.fill(options.name);\n await dialog.getByRole('textbox', { name: '0.00' }).fill(String(options.unitPriceGross));\n await dialog.getByRole('textbox', { name: '1' }).fill(String(options.quantity));\n\n if (options.taxClassName) {\n // Radix Select inside Dialog \u2014 force click on option to bypass overlay\n const taxClassTrigger = dialog\n .locator('[role=\"combobox\"]')\n .filter({ hasText: /No tax class selected/i })\n .first();\n if ((await taxClassTrigger.count()) > 0) {\n await taxClassTrigger.click();\n const opt = page.getByRole('option', { name: options.taxClassName, exact: true });\n await opt.first().waitFor({ state: 'visible', timeout: 3_000 });\n await opt.first().click({ force: true });\n }\n }\n\n const submitButton = dialog.getByRole('button', { name: /Add item/i });\n await expect(submitButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await expect(submitButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n const lineRow = page.getByRole('row', { name: new RegExp(escapeRegExp(options.name), 'i') });\n for (let attempt = 0; attempt < 2; attempt += 1) {\n await submitButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {}),\n lineRow.waitFor({ state: 'visible', timeout: 3_000 }).catch(() => {}),\n ]);\n if (await lineRow.isVisible().catch(() => false)) break;\n if (!(await dialog.isVisible().catch(() => false))) break;\n }\n\n if (await dialog.isVisible().catch(() => false)) {\n await expect(dialog).toBeHidden({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n await page.getByRole('button', { name: /^Items$/i }).click().catch(() => {});\n await expect(lineRow).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n}\n\nexport async function updateLineQuantity(page: Page, lineName: string, quantity: number): Promise<void> {\n await page.getByRole('button', { name: /^Items$/i }).click();\n const row = page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') });\n await row.click();\n\n const dialog = page.getByRole('dialog', { name: /Edit line/i });\n await expect(dialog).toBeVisible();\n await dialog.getByRole('textbox', { name: '1' }).fill(String(quantity));\n await dialog.getByRole('button', { name: /Save changes/i }).click();\n\n await expect(page.getByRole('row', { name: new RegExp(`${escapeRegExp(lineName)}.*\\\\b${quantity}\\\\b`, 'i') })).toBeVisible();\n}\n\nexport async function deleteLine(page: Page, lineName: string): Promise<void> {\n await page.getByRole('button', { name: /^Items$/i }).click();\n const row = page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') });\n await expect(row).toBeVisible();\n await row.locator('button').last().click();\n\n const confirmDialog = page.getByRole('alertdialog');\n if (await confirmDialog.isVisible().catch(() => false)) {\n await confirmDialog.getByRole('button', { name: /^Delete$/i }).first().click();\n await expect(confirmDialog).toBeHidden();\n }\n\n await expect(page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') })).toHaveCount(0);\n}\n\nexport async function addAdjustment(page: Page, options: AddAdjustmentOptions): Promise<void> {\n const adjustmentsTab = page.getByRole('button', { name: /^Adjustments$/i }).first();\n await waitForStableVisibility(adjustmentsTab, TEST_WAIT_TIMEOUT_MS);\n await adjustmentsTab.click();\n const addAdjustmentButton = page.getByRole('button', { name: /Add adjustment/i }).first();\n await waitForStableVisibility(addAdjustmentButton, TEST_WAIT_TIMEOUT_MS);\n await addAdjustmentButton.click();\n\n const dialog = page.getByRole('dialog', { name: /Add adjustment/i });\n await expect(dialog).toBeVisible();\n const adjustmentRow = page.getByRole('row', { name: new RegExp(escapeRegExp(options.label), 'i') });\n const fillAdjustmentForm = async (): Promise<void> => {\n await dialog.getByText(/Loading adjustments/i).waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {});\n // Radix Select trigger \u2014 target by CrudForm field id (kind picker)\n const kindTrigger = dialog.locator('[data-crud-field-id=\"kind\"] [role=\"combobox\"]').first();\n await expect(kindTrigger).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n\n const labelInput = dialog.getByPlaceholder(/e\\.g\\. Shipping fee/i).first();\n await expect(labelInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await labelInput.fill(options.label);\n await expect(labelInput).toHaveValue(options.label, { timeout: 2_000 });\n\n if ((await kindTrigger.count()) > 0) {\n const expectedKindValue = normalizeAdjustmentKindValue(options.kindLabel ?? 'Surcharge');\n const kindLabel = options.kindLabel ?? 'Surcharge';\n // Open Radix Select via click; then drive selection via keyboard so the\n // listbox keystroke matching jumps to the desired option (Discount /\n // Surcharge / etc.). This sidesteps modal-backdrop click interception\n // that occurs when a Radix Select is rendered inside a Radix Dialog.\n await kindTrigger.click();\n await page.waitForTimeout(150);\n // Type the first letter to jump to the matching option\n await page.keyboard.type(kindLabel.charAt(0));\n await page.waitForTimeout(150);\n await page.keyboard.press('Enter');\n void expectedKindValue;\n }\n\n const fixedAmountButton = dialog.getByRole('button', { name: /^Fixed amount$/i }).first();\n if ((await fixedAmountButton.count()) > 0) {\n await fixedAmountButton.click().catch(() => {});\n }\n\n const enabledAmountInputs = dialog.locator('input[placeholder=\"0.00\"]:not([disabled])');\n await expect(enabledAmountInputs.first()).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n if ((await enabledAmountInputs.count()) > 0) {\n await enabledAmountInputs.first().fill(String(options.netAmount));\n await expect(enabledAmountInputs.first()).toHaveValue(String(options.netAmount), { timeout: 2_000 }).catch(() => {});\n }\n };\n\n let saved = false;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n await fillAdjustmentForm();\n const submitButton = dialog.getByRole('button', { name: /Add adjustment/i }).first();\n await waitForStableVisibility(submitButton, 4_000).catch(() => {});\n await submitButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {}),\n adjustmentRow.waitFor({ state: 'visible', timeout: 3_000 }).catch(() => {}),\n ]);\n saved =\n !(await dialog.isVisible().catch(() => false)) ||\n (await adjustmentRow.isVisible().catch(() => false));\n if (saved) break;\n }\n\n if (await dialog.isVisible().catch(() => false)) {\n await expect(dialog).toBeHidden({ timeout: 5_000 });\n }\n if (!(await adjustmentRow.isVisible().catch(() => false))) {\n await adjustmentsTab.click().catch(() => {});\n await adjustmentRow.waitFor({ state: 'visible', timeout: 2_000 }).catch(() => {});\n }\n}\n\nexport async function addPayment(page: Page, amount: number): Promise<{ amountLabel: string; added: boolean }> {\n await ensureSalesDocumentReady(page);\n const paymentsTab = page.getByRole('button', { name: /^Payments$/i }).first();\n await waitForStableVisibility(paymentsTab, TEST_WAIT_TIMEOUT_MS);\n await paymentsTab.click();\n const amountLabel = amount.toFixed(2);\n const amountInputValue = String(Math.max(1, Math.round(amount)));\n const addPaymentButton = page.getByRole('button', { name: /Add payment/i }).first();\n await waitForStableVisibility(addPaymentButton, TEST_WAIT_TIMEOUT_MS);\n await expect(addPaymentButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n await addPaymentButton.click();\n\n const dialog = page.getByRole('dialog', { name: /Add payment/i });\n const amountInput = dialog.locator('input[placeholder=\"0.00\"]').first();\n await waitForDialogFieldReady(dialog, amountInput, /Loading payment methods\u2026|Loading payment methods\\.\\.\\./i);\n const setAmount = async (): Promise<void> => {\n const refreshedAmountInput = dialog.locator('input[placeholder=\"0.00\"]').first();\n await waitForStableVisibility(refreshedAmountInput, 4_000).catch(() => {});\n await refreshedAmountInput.fill(amountInputValue).catch(() => {});\n await refreshedAmountInput.press('Tab').catch(() => {});\n };\n const selectMethodInput = dialog.getByPlaceholder(/Search payment method/i).first();\n const statusInput = dialog.getByPlaceholder(/Select status/i).first();\n await setAmount();\n await waitForStableVisibility(selectMethodInput, 4_000).catch(() => {});\n await selectLookupValue(selectMethodInput, 'Bank', /bank transfer|credit card|cash on delivery/i).catch(() => false);\n await waitForStableVisibility(statusInput, 4_000).catch(() => {});\n await selectLookupValue(statusInput, 'Pending', /pending|captured/i).catch(() => false);\n const saveButton = dialog.getByRole('button', { name: /Save/i }).first();\n const operationMessage = page.getByText(/Last operation:\\s*Create payment/i).first();\n for (let attempt = 0; attempt < 2; attempt += 1) {\n await setAmount();\n await selectLookupValue(selectMethodInput, 'Bank', /bank transfer|credit card|cash on delivery/i).catch(() => false);\n await selectLookupValue(statusInput, 'Pending', /pending|captured/i).catch(() => false);\n await waitForStableVisibility(saveButton, 4_000).catch(() => {});\n await saveButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_500 }).catch(() => {}),\n operationMessage.waitFor({ state: 'visible', timeout: 3_500 }).catch(() => {}),\n dialog.getByText(/This field is required/i).first().waitFor({ state: 'visible', timeout: 3_500 }).catch(() => {}),\n ]);\n if (!(await dialog.isVisible().catch(() => false))) break;\n if (await operationMessage.isVisible().catch(() => false)) break;\n await waitForOptionalTextToDisappear(dialog, /Loading payment methods\u2026|Loading payment methods\\.\\.\\./i, 3_000);\n }\n if (await dialog.isVisible().catch(() => false)) {\n await dialog.press('Escape').catch(() => {});\n await dialog.waitFor({ state: 'hidden', timeout: 1_500 }).catch(() => {});\n }\n await operationMessage.waitFor({ state: 'visible', timeout: 2_500 }).catch(() => {});\n let added = await operationMessage.isVisible().catch(() => false);\n if (!added) {\n added = await addPaymentViaApi(page, amount);\n }\n return { amountLabel, added };\n}\n\nexport async function addShipment(page: Page): Promise<{ trackingNumber: string; shipmentNumber: string; added: boolean }> {\n await ensureSalesDocumentReady(page);\n await ensureShippingMethodFixture(page);\n const shipmentsTab = page.getByRole('button', { name: /^Shipments$/i }).first();\n await waitForStableVisibility(shipmentsTab, TEST_WAIT_TIMEOUT_MS);\n await shipmentsTab.click();\n const trackingNumber = `SHIP-${Date.now()}`;\n const shipmentNumber = String(Date.now());\n const dialog = page.getByRole('dialog', { name: /Add shipment/i });\n const openShipmentDialog = async (): Promise<boolean> => {\n const addShipmentButtons = page.getByRole('button', { name: /Add shipment/i });\n const buttonCount = await addShipmentButtons.count();\n for (let index = buttonCount - 1; index >= 0; index -= 1) {\n const button = addShipmentButtons.nth(index);\n if (!(await button.isVisible().catch(() => false))) continue;\n if (!(await button.isEnabled().catch(() => false))) continue;\n await waitForStableVisibility(button, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n await button.scrollIntoViewIfNeeded().catch(() => {});\n await button.click().catch(() => {});\n const visible = await dialog.waitFor({ state: 'visible', timeout: 2_500 }).then(() => true).catch(() => false);\n if (visible) return true;\n }\n return false;\n };\n\n let dialogReady = false;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n const opened = await openShipmentDialog();\n if (!opened) break;\n await dialog\n .getByText(/Loading shipments\u2026|Loading shipments\\.\\.\\./i)\n .first()\n .waitFor({ state: 'hidden', timeout: 5_000 })\n .catch(() => {});\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n if (await shipmentNumberInput.isVisible().catch(() => false)) {\n await waitForStableVisibility(shipmentNumberInput, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n dialogReady = true;\n break;\n }\n await dialog.getByRole('button', { name: /Close/i }).first().click().catch(() => {});\n await dialog.waitFor({ state: 'hidden', timeout: 2_000 }).catch(() => {});\n }\n if (!dialogReady) {\n const added = await addShipmentViaApi(page, shipmentNumber, trackingNumber);\n if (!added) {\n await openShipmentDialog();\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n await waitForDialogFieldReady(dialog, shipmentNumberInput, /Loading shipments\u2026|Loading shipments\\.\\.\\./i);\n } else {\n const shipmentLabel = page.getByText(new RegExp(`Shipment\\\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();\n const visible = await shipmentLabel\n .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n return { trackingNumber, shipmentNumber, added: visible };\n }\n }\n\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n await fillShipmentNumber(dialog, shipmentNumber);\n const trackingInput = dialog.getByPlaceholder(/One per line or comma separated/i).first();\n await waitForStableVisibility(trackingInput, 4_000).catch(() => {});\n await trackingInput.fill(trackingNumber).catch(() => {});\n await selectShipmentMethod(dialog);\n await selectShipmentStatus(dialog);\n await selectShipmentAddress(dialog);\n await fillShipmentQuantity(dialog);\n await fillShipmentDates(dialog);\n await fillShipmentNumber(dialog, shipmentNumber);\n\n await dialog.getByText(/Searching\u2026|Searching\\.\\.\\./i).first().waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n const saveButton = dialog.getByRole('button', { name: /^Save\\b/i }).first();\n const canClickSave = (await saveButton.count()) > 0 && (await saveButton.isVisible().catch(() => false));\n if (canClickSave) {\n await saveButton.click({ timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n } else {\n await dialog.press('ControlOrMeta+Enter').catch(() => {});\n }\n\n let closed = await dialog\n .waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n\n if (!closed) {\n for (let attempt = 0; attempt < 2; attempt += 1) {\n if (!(await dialog.isVisible().catch(() => false))) break;\n await selectShipmentMethod(dialog);\n await selectShipmentAddress(dialog);\n await fillShipmentQuantity(dialog);\n await fillShipmentDates(dialog);\n await fillShipmentNumber(dialog, shipmentNumber);\n if (canClickSave) {\n await saveButton.click({ timeout: 2_000 }).catch(() => {});\n } else {\n await dialog.press('ControlOrMeta+Enter').catch(() => {});\n }\n closed = await dialog\n .waitFor({ state: 'hidden', timeout: 2_000 })\n .then(() => true)\n .catch(() => false);\n if (closed) break;\n }\n }\n\n if (!closed) {\n return { trackingNumber, shipmentNumber, added: false };\n }\n\n await page.getByRole('button', { name: /^Shipments$/i }).click();\n const shipmentLabel = page.getByText(new RegExp(`Shipment\\\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();\n const added = await shipmentLabel\n .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n return { trackingNumber, shipmentNumber, added };\n}\n\nexport async function readGrandTotalGross(page: Page): Promise<number> {\n const row = page.getByRole('row', { name: /Grand total \\(gross\\)/i }).first();\n await expect(row).toBeVisible();\n const text = (await row.innerText()).trim();\n return parseCurrencyAmount(text);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["selectedButton", "createButton", "shipmentNumberInput", "added", "shipmentLabel"]
7
7
  }