@open-mercato/core 0.6.7-develop.6661.1.0043ed1d03 → 0.6.7-develop.6670.1.4efa7961c6

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 (494) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/inventory_balance/index.js +21 -0
  3. package/dist/generated/entities/inventory_balance/index.js.map +7 -0
  4. package/dist/generated/entities/inventory_lot/index.js +19 -0
  5. package/dist/generated/entities/inventory_lot/index.js.map +7 -0
  6. package/dist/generated/entities/inventory_movement/index.js +35 -0
  7. package/dist/generated/entities/inventory_movement/index.js.map +7 -0
  8. package/dist/generated/entities/inventory_reservation/index.js +23 -0
  9. package/dist/generated/entities/inventory_reservation/index.js.map +7 -0
  10. package/dist/generated/entities/product_inventory_profile/index.js +21 -0
  11. package/dist/generated/entities/product_inventory_profile/index.js.map +7 -0
  12. package/dist/generated/entities/sales_order_warehouse_assignment/index.js +11 -0
  13. package/dist/generated/entities/sales_order_warehouse_assignment/index.js.map +7 -0
  14. package/dist/generated/entities/warehouse/index.js +25 -0
  15. package/dist/generated/entities/warehouse/index.js.map +7 -0
  16. package/dist/generated/entities/warehouse_location/index.js +21 -0
  17. package/dist/generated/entities/warehouse_location/index.js.map +7 -0
  18. package/dist/generated/entities/warehouse_zone/index.js +11 -0
  19. package/dist/generated/entities/warehouse_zone/index.js.map +7 -0
  20. package/dist/generated/entities.ids.generated.js +12 -0
  21. package/dist/generated/entities.ids.generated.js.map +2 -2
  22. package/dist/generated/entity-fields-registry.js +98 -0
  23. package/dist/generated/entity-fields-registry.js.map +2 -2
  24. package/dist/modules/auth/backend/roles/page.js +12 -4
  25. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  26. package/dist/modules/auth/lib/backendChrome.js +1 -0
  27. package/dist/modules/auth/lib/backendChrome.js.map +2 -2
  28. package/dist/modules/auth/services/rbacService.js +16 -17
  29. package/dist/modules/auth/services/rbacService.js.map +2 -2
  30. package/dist/modules/catalog/api/products/route.js +3 -0
  31. package/dist/modules/catalog/api/products/route.js.map +2 -2
  32. package/dist/modules/catalog/api/variants/route.js +3 -0
  33. package/dist/modules/catalog/api/variants/route.js.map +2 -2
  34. package/dist/modules/customer_accounts/migrations/Migration20260724120000_customer_accounts.js +56 -0
  35. package/dist/modules/customer_accounts/migrations/Migration20260724120000_customer_accounts.js.map +7 -0
  36. package/dist/modules/directory/api/organizations/route.js +1 -1
  37. package/dist/modules/directory/api/organizations/route.js.map +1 -1
  38. package/dist/modules/entities/api/definitions.js +2 -0
  39. package/dist/modules/entities/api/definitions.js.map +2 -2
  40. package/dist/modules/entities/lib/helpers.js +1 -0
  41. package/dist/modules/entities/lib/helpers.js.map +2 -2
  42. package/dist/modules/query_index/lib/engine.js +6 -6
  43. package/dist/modules/query_index/lib/engine.js.map +2 -2
  44. package/dist/modules/sales/api/documents/factory.js +1 -0
  45. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  46. package/dist/modules/sales/api/quotes/accept/route.js +7 -2
  47. package/dist/modules/sales/api/quotes/accept/route.js.map +2 -2
  48. package/dist/modules/sales/api/quotes/public/[token]/route.js +2 -1
  49. package/dist/modules/sales/api/quotes/public/[token]/route.js.map +2 -2
  50. package/dist/modules/sales/commands/documents.js +53 -0
  51. package/dist/modules/sales/commands/documents.js.map +2 -2
  52. package/dist/modules/sales/components/documents/ItemsSection.js +51 -2
  53. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  54. package/dist/modules/sales/events.js +2 -0
  55. package/dist/modules/sales/events.js.map +2 -2
  56. package/dist/modules/sales/lib/publicQuoteTenantScope.js +24 -0
  57. package/dist/modules/sales/lib/publicQuoteTenantScope.js.map +7 -0
  58. package/dist/modules/sales/widgets/injection/order-items-context.js +11 -0
  59. package/dist/modules/sales/widgets/injection/order-items-context.js.map +7 -0
  60. package/dist/modules/wms/acl.js +18 -0
  61. package/dist/modules/wms/acl.js.map +7 -0
  62. package/dist/modules/wms/analytics.js +11 -0
  63. package/dist/modules/wms/analytics.js.map +7 -0
  64. package/dist/modules/wms/api/dashboard/operational/route.js +80 -0
  65. package/dist/modules/wms/api/dashboard/operational/route.js.map +7 -0
  66. package/dist/modules/wms/api/interceptors.js +90 -0
  67. package/dist/modules/wms/api/interceptors.js.map +7 -0
  68. package/dist/modules/wms/api/inventory/adjust/route.js +51 -0
  69. package/dist/modules/wms/api/inventory/adjust/route.js.map +7 -0
  70. package/dist/modules/wms/api/inventory/allocate/route.js +51 -0
  71. package/dist/modules/wms/api/inventory/allocate/route.js.map +7 -0
  72. package/dist/modules/wms/api/inventory/balances/route.js +172 -0
  73. package/dist/modules/wms/api/inventory/balances/route.js.map +7 -0
  74. package/dist/modules/wms/api/inventory/cycle-count/route.js +52 -0
  75. package/dist/modules/wms/api/inventory/cycle-count/route.js.map +7 -0
  76. package/dist/modules/wms/api/inventory/helpers.js +113 -0
  77. package/dist/modules/wms/api/inventory/helpers.js.map +7 -0
  78. package/dist/modules/wms/api/inventory/import/apply/route.js +46 -0
  79. package/dist/modules/wms/api/inventory/import/apply/route.js.map +7 -0
  80. package/dist/modules/wms/api/inventory/import/helpers.js +195 -0
  81. package/dist/modules/wms/api/inventory/import/helpers.js.map +7 -0
  82. package/dist/modules/wms/api/inventory/import/template/route.js +32 -0
  83. package/dist/modules/wms/api/inventory/import/template/route.js.map +7 -0
  84. package/dist/modules/wms/api/inventory/import/validate/route.js +54 -0
  85. package/dist/modules/wms/api/inventory/import/validate/route.js.map +7 -0
  86. package/dist/modules/wms/api/inventory/move/route.js +51 -0
  87. package/dist/modules/wms/api/inventory/move/route.js.map +7 -0
  88. package/dist/modules/wms/api/inventory/movements/route.js +164 -0
  89. package/dist/modules/wms/api/inventory/movements/route.js.map +7 -0
  90. package/dist/modules/wms/api/inventory/receive/route.js +50 -0
  91. package/dist/modules/wms/api/inventory/receive/route.js.map +7 -0
  92. package/dist/modules/wms/api/inventory/release/route.js +44 -0
  93. package/dist/modules/wms/api/inventory/release/route.js.map +7 -0
  94. package/dist/modules/wms/api/inventory/reservations/route.js +128 -0
  95. package/dist/modules/wms/api/inventory/reservations/route.js.map +7 -0
  96. package/dist/modules/wms/api/inventory/reserve/route.js +59 -0
  97. package/dist/modules/wms/api/inventory/reserve/route.js.map +7 -0
  98. package/dist/modules/wms/api/inventory-profiles/route.js +178 -0
  99. package/dist/modules/wms/api/inventory-profiles/route.js.map +7 -0
  100. package/dist/modules/wms/api/listEnrichers.js +181 -0
  101. package/dist/modules/wms/api/listEnrichers.js.map +7 -0
  102. package/dist/modules/wms/api/listSearch.js +77 -0
  103. package/dist/modules/wms/api/listSearch.js.map +7 -0
  104. package/dist/modules/wms/api/locations/route.js +172 -0
  105. package/dist/modules/wms/api/locations/route.js.map +7 -0
  106. package/dist/modules/wms/api/lots/route.js +204 -0
  107. package/dist/modules/wms/api/lots/route.js.map +7 -0
  108. package/dist/modules/wms/api/openapi.js +27 -0
  109. package/dist/modules/wms/api/openapi.js.map +7 -0
  110. package/dist/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.js +54 -0
  111. package/dist/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.js.map +7 -0
  112. package/dist/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.js +279 -0
  113. package/dist/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.js.map +7 -0
  114. package/dist/modules/wms/api/sales-orders/assign-warehouse/route.js +56 -0
  115. package/dist/modules/wms/api/sales-orders/assign-warehouse/route.js.map +7 -0
  116. package/dist/modules/wms/api/sales-orders/unassign-warehouse/route.js +43 -0
  117. package/dist/modules/wms/api/sales-orders/unassign-warehouse/route.js.map +7 -0
  118. package/dist/modules/wms/api/warehouses/route.js +181 -0
  119. package/dist/modules/wms/api/warehouses/route.js.map +7 -0
  120. package/dist/modules/wms/api/zones/route.js +159 -0
  121. package/dist/modules/wms/api/zones/route.js.map +7 -0
  122. package/dist/modules/wms/backend/config/wms/page.js +9 -0
  123. package/dist/modules/wms/backend/config/wms/page.js.map +7 -0
  124. package/dist/modules/wms/backend/config/wms/page.meta.js +18 -0
  125. package/dist/modules/wms/backend/config/wms/page.meta.js.map +7 -0
  126. package/dist/modules/wms/backend/page.js +9 -0
  127. package/dist/modules/wms/backend/page.js.map +7 -0
  128. package/dist/modules/wms/backend/page.meta.js +16 -0
  129. package/dist/modules/wms/backend/page.meta.js.map +7 -0
  130. package/dist/modules/wms/backend/wms/inventory/page.js +9 -0
  131. package/dist/modules/wms/backend/wms/inventory/page.js.map +7 -0
  132. package/dist/modules/wms/backend/wms/inventory/page.meta.js +18 -0
  133. package/dist/modules/wms/backend/wms/inventory/page.meta.js.map +7 -0
  134. package/dist/modules/wms/backend/wms/location/[id]/page.js +9 -0
  135. package/dist/modules/wms/backend/wms/location/[id]/page.js.map +7 -0
  136. package/dist/modules/wms/backend/wms/location/[id]/page.meta.js +18 -0
  137. package/dist/modules/wms/backend/wms/location/[id]/page.meta.js.map +7 -0
  138. package/dist/modules/wms/backend/wms/locations/page.js +10 -0
  139. package/dist/modules/wms/backend/wms/locations/page.js.map +7 -0
  140. package/dist/modules/wms/backend/wms/locations/page.meta.js +18 -0
  141. package/dist/modules/wms/backend/wms/locations/page.meta.js.map +7 -0
  142. package/dist/modules/wms/backend/wms/lot/[id]/page.js +9 -0
  143. package/dist/modules/wms/backend/wms/lot/[id]/page.js.map +7 -0
  144. package/dist/modules/wms/backend/wms/lot/[id]/page.meta.js +18 -0
  145. package/dist/modules/wms/backend/wms/lot/[id]/page.meta.js.map +7 -0
  146. package/dist/modules/wms/backend/wms/lots/page.js +9 -0
  147. package/dist/modules/wms/backend/wms/lots/page.js.map +7 -0
  148. package/dist/modules/wms/backend/wms/lots/page.meta.js +18 -0
  149. package/dist/modules/wms/backend/wms/lots/page.meta.js.map +7 -0
  150. package/dist/modules/wms/backend/wms/movements/page.js +22 -0
  151. package/dist/modules/wms/backend/wms/movements/page.js.map +7 -0
  152. package/dist/modules/wms/backend/wms/movements/page.meta.js +18 -0
  153. package/dist/modules/wms/backend/wms/movements/page.meta.js.map +7 -0
  154. package/dist/modules/wms/backend/wms/reservations/page.js +23 -0
  155. package/dist/modules/wms/backend/wms/reservations/page.js.map +7 -0
  156. package/dist/modules/wms/backend/wms/reservations/page.meta.js +18 -0
  157. package/dist/modules/wms/backend/wms/reservations/page.meta.js.map +7 -0
  158. package/dist/modules/wms/backend/wms/sku/[id]/page.js +9 -0
  159. package/dist/modules/wms/backend/wms/sku/[id]/page.js.map +7 -0
  160. package/dist/modules/wms/backend/wms/sku/[id]/page.meta.js +18 -0
  161. package/dist/modules/wms/backend/wms/sku/[id]/page.meta.js.map +7 -0
  162. package/dist/modules/wms/backend/wms/warehouses/page.js +10 -0
  163. package/dist/modules/wms/backend/wms/warehouses/page.js.map +7 -0
  164. package/dist/modules/wms/backend/wms/warehouses/page.meta.js +18 -0
  165. package/dist/modules/wms/backend/wms/warehouses/page.meta.js.map +7 -0
  166. package/dist/modules/wms/backend/wms/zones/page.js +10 -0
  167. package/dist/modules/wms/backend/wms/zones/page.js.map +7 -0
  168. package/dist/modules/wms/backend/wms/zones/page.meta.js +18 -0
  169. package/dist/modules/wms/backend/wms/zones/page.meta.js.map +7 -0
  170. package/dist/modules/wms/ce.js +80 -0
  171. package/dist/modules/wms/ce.js.map +7 -0
  172. package/dist/modules/wms/cli.js +83 -0
  173. package/dist/modules/wms/cli.js.map +7 -0
  174. package/dist/modules/wms/commands/configuration.js +1519 -0
  175. package/dist/modules/wms/commands/configuration.js.map +7 -0
  176. package/dist/modules/wms/commands/index.js +4 -0
  177. package/dist/modules/wms/commands/index.js.map +7 -0
  178. package/dist/modules/wms/commands/inventory-actions.js +1539 -0
  179. package/dist/modules/wms/commands/inventory-actions.js.map +7 -0
  180. package/dist/modules/wms/commands/sales-order-assignment.js +277 -0
  181. package/dist/modules/wms/commands/sales-order-assignment.js.map +7 -0
  182. package/dist/modules/wms/commands/shared.js +82 -0
  183. package/dist/modules/wms/commands/shared.js.map +7 -0
  184. package/dist/modules/wms/components/backend/AdjustInventoryDialog.js +755 -0
  185. package/dist/modules/wms/components/backend/AdjustInventoryDialog.js.map +7 -0
  186. package/dist/modules/wms/components/backend/ChangeLotStatusDialog.js +269 -0
  187. package/dist/modules/wms/components/backend/ChangeLotStatusDialog.js.map +7 -0
  188. package/dist/modules/wms/components/backend/CycleCountWizardDialog.js +1783 -0
  189. package/dist/modules/wms/components/backend/CycleCountWizardDialog.js.map +7 -0
  190. package/dist/modules/wms/components/backend/ImportInventoryDialog.js +766 -0
  191. package/dist/modules/wms/components/backend/ImportInventoryDialog.js.map +7 -0
  192. package/dist/modules/wms/components/backend/InventoryOperationsSection.js +119 -0
  193. package/dist/modules/wms/components/backend/InventoryOperationsSection.js.map +7 -0
  194. package/dist/modules/wms/components/backend/LocationEditDialog.js +140 -0
  195. package/dist/modules/wms/components/backend/LocationEditDialog.js.map +7 -0
  196. package/dist/modules/wms/components/backend/MoveInventoryDialog.js +791 -0
  197. package/dist/modules/wms/components/backend/MoveInventoryDialog.js.map +7 -0
  198. package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js +656 -0
  199. package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js.map +7 -0
  200. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +344 -0
  201. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +7 -0
  202. package/dist/modules/wms/components/backend/ReserveInventoryDialog.js +475 -0
  203. package/dist/modules/wms/components/backend/ReserveInventoryDialog.js.map +7 -0
  204. package/dist/modules/wms/components/backend/WmsConfigurationPage.js +1112 -0
  205. package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +7 -0
  206. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +908 -0
  207. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +7 -0
  208. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +1015 -0
  209. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +7 -0
  210. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +1049 -0
  211. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +7 -0
  212. package/dist/modules/wms/components/backend/WmsLotsListPage.js +297 -0
  213. package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +7 -0
  214. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +757 -0
  215. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +7 -0
  216. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +975 -0
  217. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +7 -0
  218. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +710 -0
  219. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +7 -0
  220. package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js +79 -0
  221. package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js.map +7 -0
  222. package/dist/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.js +24 -0
  223. package/dist/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.js.map +7 -0
  224. package/dist/modules/wms/components/backend/wmsLookupLoaders.js +55 -0
  225. package/dist/modules/wms/components/backend/wmsLookupLoaders.js.map +7 -0
  226. package/dist/modules/wms/data/enrichers.js +501 -0
  227. package/dist/modules/wms/data/enrichers.js.map +7 -0
  228. package/dist/modules/wms/data/entities.js +467 -0
  229. package/dist/modules/wms/data/entities.js.map +7 -0
  230. package/dist/modules/wms/data/validators.js +399 -0
  231. package/dist/modules/wms/data/validators.js.map +7 -0
  232. package/dist/modules/wms/di.js +27 -0
  233. package/dist/modules/wms/di.js.map +7 -0
  234. package/dist/modules/wms/events.js +42 -0
  235. package/dist/modules/wms/events.js.map +7 -0
  236. package/dist/modules/wms/index.js +17 -0
  237. package/dist/modules/wms/index.js.map +7 -0
  238. package/dist/modules/wms/lib/catalogInventoryProfileIntent.js +54 -0
  239. package/dist/modules/wms/lib/catalogInventoryProfileIntent.js.map +7 -0
  240. package/dist/modules/wms/lib/catalogInventoryProfileSync.js +144 -0
  241. package/dist/modules/wms/lib/catalogInventoryProfileSync.js.map +7 -0
  242. package/dist/modules/wms/lib/expiry.js +29 -0
  243. package/dist/modules/wms/lib/expiry.js.map +7 -0
  244. package/dist/modules/wms/lib/flashMutationError.js +51 -0
  245. package/dist/modules/wms/lib/flashMutationError.js.map +7 -0
  246. package/dist/modules/wms/lib/inventoryDisplayUi.js +188 -0
  247. package/dist/modules/wms/lib/inventoryDisplayUi.js.map +7 -0
  248. package/dist/modules/wms/lib/inventoryIdempotency.js +37 -0
  249. package/dist/modules/wms/lib/inventoryIdempotency.js.map +7 -0
  250. package/dist/modules/wms/lib/inventoryImportCsv.js +173 -0
  251. package/dist/modules/wms/lib/inventoryImportCsv.js.map +7 -0
  252. package/dist/modules/wms/lib/inventoryImportService.js +468 -0
  253. package/dist/modules/wms/lib/inventoryImportService.js.map +7 -0
  254. package/dist/modules/wms/lib/inventoryMutationUi.js +25 -0
  255. package/dist/modules/wms/lib/inventoryMutationUi.js.map +7 -0
  256. package/dist/modules/wms/lib/inventoryPolicy.js +61 -0
  257. package/dist/modules/wms/lib/inventoryPolicy.js.map +7 -0
  258. package/dist/modules/wms/lib/inventoryReconciliation.js +193 -0
  259. package/dist/modules/wms/lib/inventoryReconciliation.js.map +7 -0
  260. package/dist/modules/wms/lib/inventoryTrackingValidation.js +13 -0
  261. package/dist/modules/wms/lib/inventoryTrackingValidation.js.map +7 -0
  262. package/dist/modules/wms/lib/loadOperationalDashboard.js +580 -0
  263. package/dist/modules/wms/lib/loadOperationalDashboard.js.map +7 -0
  264. package/dist/modules/wms/lib/lowStockBalanceFilter.js +49 -0
  265. package/dist/modules/wms/lib/lowStockBalanceFilter.js.map +7 -0
  266. package/dist/modules/wms/lib/primaryWarehousePolicy.js +32 -0
  267. package/dist/modules/wms/lib/primaryWarehousePolicy.js.map +7 -0
  268. package/dist/modules/wms/lib/roleFeatures.js +30 -0
  269. package/dist/modules/wms/lib/roleFeatures.js.map +7 -0
  270. package/dist/modules/wms/lib/salesOrderInventoryAutomation.js +291 -0
  271. package/dist/modules/wms/lib/salesOrderInventoryAutomation.js.map +7 -0
  272. package/dist/modules/wms/lib/salesOrderWarehouseAssignment.js +54 -0
  273. package/dist/modules/wms/lib/salesOrderWarehouseAssignment.js.map +7 -0
  274. package/dist/modules/wms/lib/wmsIntegrationToggles.js +71 -0
  275. package/dist/modules/wms/lib/wmsIntegrationToggles.js.map +7 -0
  276. package/dist/modules/wms/migrations/Migration20260428110546.js +78 -0
  277. package/dist/modules/wms/migrations/Migration20260428110546.js.map +7 -0
  278. package/dist/modules/wms/migrations/Migration20260527120000.js +15 -0
  279. package/dist/modules/wms/migrations/Migration20260527120000.js.map +7 -0
  280. package/dist/modules/wms/migrations/Migration20260527140000.js +37 -0
  281. package/dist/modules/wms/migrations/Migration20260527140000.js.map +7 -0
  282. package/dist/modules/wms/migrations/Migration20260613120000.js +23 -0
  283. package/dist/modules/wms/migrations/Migration20260613120000.js.map +7 -0
  284. package/dist/modules/wms/migrations/Migration20260616090000.js +13 -0
  285. package/dist/modules/wms/migrations/Migration20260616090000.js.map +7 -0
  286. package/dist/modules/wms/migrations/Migration20260707180000.js +15 -0
  287. package/dist/modules/wms/migrations/Migration20260707180000.js.map +7 -0
  288. package/dist/modules/wms/notifications.client.js +18 -0
  289. package/dist/modules/wms/notifications.client.js.map +7 -0
  290. package/dist/modules/wms/notifications.js +53 -0
  291. package/dist/modules/wms/notifications.js.map +7 -0
  292. package/dist/modules/wms/search.js +196 -0
  293. package/dist/modules/wms/search.js.map +7 -0
  294. package/dist/modules/wms/setup.js +30 -0
  295. package/dist/modules/wms/setup.js.map +7 -0
  296. package/dist/modules/wms/subscribers/low-stock-notification.js +40 -0
  297. package/dist/modules/wms/subscribers/low-stock-notification.js.map +7 -0
  298. package/dist/modules/wms/subscribers/reservation-shortfall-notification.js +69 -0
  299. package/dist/modules/wms/subscribers/reservation-shortfall-notification.js.map +7 -0
  300. package/dist/modules/wms/subscribers/sales-order-cancelled-release.js +14 -0
  301. package/dist/modules/wms/subscribers/sales-order-cancelled-release.js.map +7 -0
  302. package/dist/modules/wms/subscribers/sales-order-confirmed-reserve.js +14 -0
  303. package/dist/modules/wms/subscribers/sales-order-confirmed-reserve.js.map +7 -0
  304. package/dist/modules/wms/translations.js +10 -0
  305. package/dist/modules/wms/translations.js.map +7 -0
  306. package/dist/modules/wms/vector.js +9 -0
  307. package/dist/modules/wms/vector.js.map +7 -0
  308. package/dist/modules/wms/widgets/injection/catalog-inventory-profile/widget.js +200 -0
  309. package/dist/modules/wms/widgets/injection/catalog-inventory-profile/widget.js.map +7 -0
  310. package/dist/modules/wms/widgets/injection/order-items-stock-column/widget.js +104 -0
  311. package/dist/modules/wms/widgets/injection/order-items-stock-column/widget.js.map +7 -0
  312. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js +389 -0
  313. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js.map +7 -0
  314. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.js +16 -0
  315. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.js.map +7 -0
  316. package/dist/modules/wms/widgets/injection-table.js +36 -0
  317. package/dist/modules/wms/widgets/injection-table.js.map +7 -0
  318. package/dist/modules/wms/widgets/notifications/WmsLowStockRenderer.js +150 -0
  319. package/dist/modules/wms/widgets/notifications/WmsLowStockRenderer.js.map +7 -0
  320. package/dist/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.js +186 -0
  321. package/dist/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.js.map +7 -0
  322. package/dist/modules/wms/widgets/notifications/index.js +7 -0
  323. package/dist/modules/wms/widgets/notifications/index.js.map +7 -0
  324. package/generated/entities/inventory_balance/index.ts +9 -0
  325. package/generated/entities/inventory_lot/index.ts +8 -0
  326. package/generated/entities/inventory_movement/index.ts +16 -0
  327. package/generated/entities/inventory_reservation/index.ts +10 -0
  328. package/generated/entities/product_inventory_profile/index.ts +9 -0
  329. package/generated/entities/sales_order_warehouse_assignment/index.ts +4 -0
  330. package/generated/entities/warehouse/index.ts +11 -0
  331. package/generated/entities/warehouse_location/index.ts +9 -0
  332. package/generated/entities/warehouse_zone/index.ts +4 -0
  333. package/generated/entities.ids.generated.ts +12 -0
  334. package/generated/entity-fields-registry.ts +98 -0
  335. package/package.json +7 -7
  336. package/src/modules/auth/backend/roles/page.tsx +13 -4
  337. package/src/modules/auth/i18n/de.json +2 -0
  338. package/src/modules/auth/i18n/en.json +2 -0
  339. package/src/modules/auth/i18n/es.json +2 -0
  340. package/src/modules/auth/i18n/pl.json +2 -0
  341. package/src/modules/auth/lib/backendChrome.tsx +1 -0
  342. package/src/modules/auth/services/rbacService.ts +25 -21
  343. package/src/modules/catalog/api/products/route.ts +3 -0
  344. package/src/modules/catalog/api/variants/route.ts +3 -0
  345. package/src/modules/customer_accounts/migrations/Migration20260724120000_customer_accounts.ts +96 -0
  346. package/src/modules/directory/api/organizations/route.ts +1 -1
  347. package/src/modules/entities/api/definitions.ts +2 -0
  348. package/src/modules/entities/lib/helpers.ts +1 -0
  349. package/src/modules/query_index/lib/engine.ts +18 -6
  350. package/src/modules/sales/api/documents/factory.ts +1 -0
  351. package/src/modules/sales/api/quotes/accept/route.ts +9 -2
  352. package/src/modules/sales/api/quotes/public/[token]/route.ts +2 -1
  353. package/src/modules/sales/commands/documents.ts +71 -0
  354. package/src/modules/sales/components/documents/ItemsSection.tsx +58 -0
  355. package/src/modules/sales/events.ts +2 -0
  356. package/src/modules/sales/lib/publicQuoteTenantScope.ts +49 -0
  357. package/src/modules/sales/widgets/injection/order-items-context.ts +15 -0
  358. package/src/modules/wms/acl.ts +14 -0
  359. package/src/modules/wms/analytics.ts +9 -0
  360. package/src/modules/wms/api/dashboard/operational/route.ts +83 -0
  361. package/src/modules/wms/api/interceptors.ts +108 -0
  362. package/src/modules/wms/api/inventory/adjust/route.ts +50 -0
  363. package/src/modules/wms/api/inventory/allocate/route.ts +50 -0
  364. package/src/modules/wms/api/inventory/balances/route.ts +178 -0
  365. package/src/modules/wms/api/inventory/cycle-count/route.ts +51 -0
  366. package/src/modules/wms/api/inventory/helpers.ts +128 -0
  367. package/src/modules/wms/api/inventory/import/apply/route.ts +47 -0
  368. package/src/modules/wms/api/inventory/import/helpers.ts +223 -0
  369. package/src/modules/wms/api/inventory/import/template/route.ts +31 -0
  370. package/src/modules/wms/api/inventory/import/validate/route.ts +56 -0
  371. package/src/modules/wms/api/inventory/move/route.ts +50 -0
  372. package/src/modules/wms/api/inventory/movements/route.ts +164 -0
  373. package/src/modules/wms/api/inventory/receive/route.ts +49 -0
  374. package/src/modules/wms/api/inventory/release/route.ts +43 -0
  375. package/src/modules/wms/api/inventory/reservations/route.ts +128 -0
  376. package/src/modules/wms/api/inventory/reserve/route.ts +59 -0
  377. package/src/modules/wms/api/inventory-profiles/route.ts +177 -0
  378. package/src/modules/wms/api/listEnrichers.ts +312 -0
  379. package/src/modules/wms/api/listSearch.ts +121 -0
  380. package/src/modules/wms/api/locations/route.ts +171 -0
  381. package/src/modules/wms/api/lots/route.ts +205 -0
  382. package/src/modules/wms/api/openapi.ts +28 -0
  383. package/src/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.ts +58 -0
  384. package/src/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.ts +306 -0
  385. package/src/modules/wms/api/sales-orders/assign-warehouse/route.ts +57 -0
  386. package/src/modules/wms/api/sales-orders/unassign-warehouse/route.ts +43 -0
  387. package/src/modules/wms/api/warehouses/route.ts +181 -0
  388. package/src/modules/wms/api/zones/route.ts +158 -0
  389. package/src/modules/wms/backend/config/wms/page.meta.ts +14 -0
  390. package/src/modules/wms/backend/config/wms/page.tsx +5 -0
  391. package/src/modules/wms/backend/page.meta.ts +12 -0
  392. package/src/modules/wms/backend/page.tsx +5 -0
  393. package/src/modules/wms/backend/wms/inventory/page.meta.ts +14 -0
  394. package/src/modules/wms/backend/wms/inventory/page.tsx +5 -0
  395. package/src/modules/wms/backend/wms/location/[id]/page.meta.ts +14 -0
  396. package/src/modules/wms/backend/wms/location/[id]/page.tsx +5 -0
  397. package/src/modules/wms/backend/wms/locations/page.meta.ts +14 -0
  398. package/src/modules/wms/backend/wms/locations/page.tsx +12 -0
  399. package/src/modules/wms/backend/wms/lot/[id]/page.meta.ts +14 -0
  400. package/src/modules/wms/backend/wms/lot/[id]/page.tsx +5 -0
  401. package/src/modules/wms/backend/wms/lots/page.meta.ts +14 -0
  402. package/src/modules/wms/backend/wms/lots/page.tsx +5 -0
  403. package/src/modules/wms/backend/wms/movements/page.meta.ts +14 -0
  404. package/src/modules/wms/backend/wms/movements/page.tsx +23 -0
  405. package/src/modules/wms/backend/wms/reservations/page.meta.ts +14 -0
  406. package/src/modules/wms/backend/wms/reservations/page.tsx +24 -0
  407. package/src/modules/wms/backend/wms/sku/[id]/page.meta.ts +14 -0
  408. package/src/modules/wms/backend/wms/sku/[id]/page.tsx +5 -0
  409. package/src/modules/wms/backend/wms/warehouses/page.meta.ts +14 -0
  410. package/src/modules/wms/backend/wms/warehouses/page.tsx +12 -0
  411. package/src/modules/wms/backend/wms/zones/page.meta.ts +14 -0
  412. package/src/modules/wms/backend/wms/zones/page.tsx +12 -0
  413. package/src/modules/wms/ce.ts +76 -0
  414. package/src/modules/wms/cli.ts +96 -0
  415. package/src/modules/wms/commands/configuration.ts +1844 -0
  416. package/src/modules/wms/commands/index.ts +3 -0
  417. package/src/modules/wms/commands/inventory-actions.ts +1866 -0
  418. package/src/modules/wms/commands/sales-order-assignment.ts +346 -0
  419. package/src/modules/wms/commands/shared.ts +90 -0
  420. package/src/modules/wms/components/backend/AdjustInventoryDialog.tsx +820 -0
  421. package/src/modules/wms/components/backend/ChangeLotStatusDialog.tsx +312 -0
  422. package/src/modules/wms/components/backend/CycleCountWizardDialog.tsx +2007 -0
  423. package/src/modules/wms/components/backend/ImportInventoryDialog.tsx +1018 -0
  424. package/src/modules/wms/components/backend/InventoryOperationsSection.tsx +159 -0
  425. package/src/modules/wms/components/backend/LocationEditDialog.tsx +185 -0
  426. package/src/modules/wms/components/backend/MoveInventoryDialog.tsx +907 -0
  427. package/src/modules/wms/components/backend/ReceiveInventoryDialog.tsx +695 -0
  428. package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +424 -0
  429. package/src/modules/wms/components/backend/ReserveInventoryDialog.tsx +511 -0
  430. package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +1340 -0
  431. package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +1132 -0
  432. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +1310 -0
  433. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +1355 -0
  434. package/src/modules/wms/components/backend/WmsLotsListPage.tsx +359 -0
  435. package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +958 -0
  436. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +1245 -0
  437. package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +960 -0
  438. package/src/modules/wms/components/backend/useWmsInventoryMutationAccess.ts +89 -0
  439. package/src/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.ts +32 -0
  440. package/src/modules/wms/components/backend/wmsLookupLoaders.ts +78 -0
  441. package/src/modules/wms/data/enrichers.ts +718 -0
  442. package/src/modules/wms/data/entities.ts +436 -0
  443. package/src/modules/wms/data/validators.ts +463 -0
  444. package/src/modules/wms/di.ts +25 -0
  445. package/src/modules/wms/events.ts +41 -0
  446. package/src/modules/wms/i18n/de.json +1051 -0
  447. package/src/modules/wms/i18n/en.json +1051 -0
  448. package/src/modules/wms/i18n/es.json +1051 -0
  449. package/src/modules/wms/i18n/pl.json +1051 -0
  450. package/src/modules/wms/index.ts +15 -0
  451. package/src/modules/wms/lib/catalogInventoryProfileIntent.ts +65 -0
  452. package/src/modules/wms/lib/catalogInventoryProfileSync.ts +199 -0
  453. package/src/modules/wms/lib/expiry.ts +30 -0
  454. package/src/modules/wms/lib/flashMutationError.ts +74 -0
  455. package/src/modules/wms/lib/inventoryDisplayUi.ts +249 -0
  456. package/src/modules/wms/lib/inventoryIdempotency.ts +54 -0
  457. package/src/modules/wms/lib/inventoryImportCsv.ts +212 -0
  458. package/src/modules/wms/lib/inventoryImportService.ts +629 -0
  459. package/src/modules/wms/lib/inventoryMutationUi.ts +21 -0
  460. package/src/modules/wms/lib/inventoryPolicy.ts +111 -0
  461. package/src/modules/wms/lib/inventoryReconciliation.ts +263 -0
  462. package/src/modules/wms/lib/inventoryTrackingValidation.ts +23 -0
  463. package/src/modules/wms/lib/loadOperationalDashboard.ts +776 -0
  464. package/src/modules/wms/lib/lowStockBalanceFilter.ts +74 -0
  465. package/src/modules/wms/lib/primaryWarehousePolicy.ts +46 -0
  466. package/src/modules/wms/lib/roleFeatures.ts +32 -0
  467. package/src/modules/wms/lib/salesOrderInventoryAutomation.ts +390 -0
  468. package/src/modules/wms/lib/salesOrderWarehouseAssignment.ts +78 -0
  469. package/src/modules/wms/lib/wmsIntegrationToggles.ts +81 -0
  470. package/src/modules/wms/migrations/.snapshot-open-mercato.json +2880 -0
  471. package/src/modules/wms/migrations/Migration20260428110546.ts +91 -0
  472. package/src/modules/wms/migrations/Migration20260527120000.ts +15 -0
  473. package/src/modules/wms/migrations/Migration20260527140000.ts +35 -0
  474. package/src/modules/wms/migrations/Migration20260613120000.ts +21 -0
  475. package/src/modules/wms/migrations/Migration20260616090000.ts +11 -0
  476. package/src/modules/wms/migrations/Migration20260707180000.ts +13 -0
  477. package/src/modules/wms/notifications.client.ts +18 -0
  478. package/src/modules/wms/notifications.ts +51 -0
  479. package/src/modules/wms/search.ts +230 -0
  480. package/src/modules/wms/setup.ts +29 -0
  481. package/src/modules/wms/subscribers/low-stock-notification.ts +54 -0
  482. package/src/modules/wms/subscribers/reservation-shortfall-notification.ts +98 -0
  483. package/src/modules/wms/subscribers/sales-order-cancelled-release.ts +21 -0
  484. package/src/modules/wms/subscribers/sales-order-confirmed-reserve.ts +21 -0
  485. package/src/modules/wms/translations.ts +6 -0
  486. package/src/modules/wms/vector.ts +7 -0
  487. package/src/modules/wms/widgets/injection/catalog-inventory-profile/widget.ts +238 -0
  488. package/src/modules/wms/widgets/injection/order-items-stock-column/widget.tsx +153 -0
  489. package/src/modules/wms/widgets/injection/sales-order-stock-context/widget.client.tsx +476 -0
  490. package/src/modules/wms/widgets/injection/sales-order-stock-context/widget.ts +15 -0
  491. package/src/modules/wms/widgets/injection-table.ts +34 -0
  492. package/src/modules/wms/widgets/notifications/WmsLowStockRenderer.tsx +153 -0
  493. package/src/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.tsx +194 -0
  494. package/src/modules/wms/widgets/notifications/index.ts +2 -0
@@ -0,0 +1,475 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { z } from "zod";
5
+ import { useQueryClient } from "@tanstack/react-query";
6
+ import { ShieldCheck } from "lucide-react";
7
+ import { flash } from "@open-mercato/ui/backend/FlashMessages";
8
+ import { flashMutationError } from "../../lib/flashMutationError.js";
9
+ import { useGuardedMutation } from "@open-mercato/ui/backend/injection/useGuardedMutation";
10
+ import { ComboboxInput } from "@open-mercato/ui/backend/inputs/ComboboxInput";
11
+ import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
12
+ import { raiseCrudError, readJsonSafe } from "@open-mercato/ui/backend/utils/serverErrors";
13
+ import { Button } from "@open-mercato/ui/primitives/button";
14
+ import {
15
+ Dialog,
16
+ DialogContent,
17
+ DialogDescription,
18
+ DialogFooter,
19
+ DialogHeader,
20
+ DialogTitle
21
+ } from "@open-mercato/ui/primitives/dialog";
22
+ import { FormField } from "@open-mercato/ui/primitives/form-field";
23
+ import { Input } from "@open-mercato/ui/primitives/input";
24
+ import { KbdShortcut } from "@open-mercato/ui/primitives/kbd";
25
+ import {
26
+ Select,
27
+ SelectContent,
28
+ SelectItem,
29
+ SelectTrigger,
30
+ SelectValue
31
+ } from "@open-mercato/ui/primitives/select";
32
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
33
+ import { buildInventoryMutationReferenceId } from "../../lib/inventoryMutationUi.js";
34
+ import {
35
+ loadCatalogVariantOptions,
36
+ loadInventoryProfileForVariant,
37
+ loadLotNumberOptions,
38
+ loadWarehouseOptions,
39
+ resolveCatalogVariantLabel,
40
+ resolveLotNumberFromId,
41
+ resolveWarehouseLabel
42
+ } from "./inventoryMutationLoaders.js";
43
+ const RESERVE_SOURCE_TYPES = ["manual", "order", "transfer"];
44
+ const reserveSuccessSchema = z.object({
45
+ ok: z.literal(true),
46
+ reservationId: z.string().uuid(),
47
+ allocatedBuckets: z.array(
48
+ z.object({
49
+ locationId: z.string().uuid(),
50
+ lotId: z.string().uuid().nullable(),
51
+ quantity: z.string()
52
+ })
53
+ )
54
+ });
55
+ function ReserveInventoryDialog({
56
+ open,
57
+ onOpenChange,
58
+ access,
59
+ initialWarehouseId = "",
60
+ initialCatalogVariantId = ""
61
+ }) {
62
+ const t = useT();
63
+ const queryClient = useQueryClient();
64
+ const { runMutation, retryLastMutation } = useGuardedMutation({
65
+ contextId: "wms-inventory-reserve"
66
+ });
67
+ const mutationContext = React.useMemo(() => ({ retryLastMutation }), [retryLastMutation]);
68
+ const [warehouseId, setWarehouseId] = React.useState(initialWarehouseId);
69
+ const [catalogVariantId, setCatalogVariantId] = React.useState(initialCatalogVariantId);
70
+ const [lotId, setLotId] = React.useState("");
71
+ const warehouseLabelCacheRef = React.useRef({});
72
+ const variantLabelCacheRef = React.useRef({});
73
+ const lotLabelCacheRef = React.useRef({});
74
+ const [serialNumber, setSerialNumber] = React.useState("");
75
+ const [quantity, setQuantity] = React.useState("1");
76
+ const [sourceType, setSourceType] = React.useState("manual");
77
+ const [submitting, setSubmitting] = React.useState(false);
78
+ const [fieldErrors, setFieldErrors] = React.useState({});
79
+ const [trackingProfile, setTrackingProfile] = React.useState(null);
80
+ const resetDialog = React.useCallback(() => {
81
+ setWarehouseId(initialWarehouseId);
82
+ setCatalogVariantId(initialCatalogVariantId);
83
+ setLotId("");
84
+ setSerialNumber("");
85
+ setQuantity("1");
86
+ setSourceType("manual");
87
+ setSubmitting(false);
88
+ setFieldErrors({});
89
+ setTrackingProfile(null);
90
+ }, [initialWarehouseId, initialCatalogVariantId]);
91
+ const closeDialog = React.useCallback(() => {
92
+ onOpenChange(false);
93
+ resetDialog();
94
+ }, [onOpenChange, resetDialog]);
95
+ React.useEffect(() => {
96
+ if (open) resetDialog();
97
+ }, [open, resetDialog]);
98
+ React.useEffect(() => {
99
+ if (!open || !catalogVariantId.trim()) {
100
+ setTrackingProfile(null);
101
+ return;
102
+ }
103
+ let cancelled = false;
104
+ void loadInventoryProfileForVariant(catalogVariantId.trim()).then((profile) => {
105
+ if (cancelled) return;
106
+ if (!profile) {
107
+ setTrackingProfile(null);
108
+ return;
109
+ }
110
+ setTrackingProfile({
111
+ trackLot: profile.track_lot === true,
112
+ trackSerial: profile.track_serial === true
113
+ });
114
+ });
115
+ return () => {
116
+ cancelled = true;
117
+ };
118
+ }, [catalogVariantId, open]);
119
+ const loadWarehouseSuggestions = React.useCallback(async (query) => {
120
+ const options = await loadWarehouseOptions(query);
121
+ for (const option of options) warehouseLabelCacheRef.current[option.value] = option.label;
122
+ return options;
123
+ }, []);
124
+ const resolveWarehouseComboboxLabel = React.useCallback(async (value) => {
125
+ const cached = warehouseLabelCacheRef.current[value];
126
+ if (cached) return cached;
127
+ const label = await resolveWarehouseLabel(value);
128
+ if (label) warehouseLabelCacheRef.current[value] = label;
129
+ return label ?? value;
130
+ }, []);
131
+ const loadVariantSuggestions = React.useCallback(async (query) => {
132
+ const options = await loadCatalogVariantOptions(query);
133
+ for (const option of options) variantLabelCacheRef.current[option.value] = option.label;
134
+ return options;
135
+ }, []);
136
+ const resolveVariantComboboxLabel = React.useCallback(async (value) => {
137
+ const cached = variantLabelCacheRef.current[value];
138
+ if (cached) return cached;
139
+ const label = await resolveCatalogVariantLabel(value);
140
+ if (label) variantLabelCacheRef.current[value] = label;
141
+ return label ?? value;
142
+ }, []);
143
+ const loadLotSuggestions = React.useCallback(
144
+ async (query) => {
145
+ const options = await loadLotNumberOptions(catalogVariantId.trim(), query);
146
+ for (const option of options) lotLabelCacheRef.current[option.value] = option.label;
147
+ return options;
148
+ },
149
+ [catalogVariantId]
150
+ );
151
+ const resolveLotComboboxLabel = React.useCallback(async (value) => {
152
+ const cached = lotLabelCacheRef.current[value];
153
+ if (cached) return cached;
154
+ const label = await resolveLotNumberFromId(value);
155
+ if (label) lotLabelCacheRef.current[value] = label;
156
+ return label ?? value;
157
+ }, []);
158
+ const handleSubmit = React.useCallback(
159
+ async (event) => {
160
+ event?.preventDefault();
161
+ setFieldErrors({});
162
+ const nextErrors = {};
163
+ if (!warehouseId.trim()) {
164
+ nextErrors.warehouseId = t(
165
+ "wms.backend.inventory.reserve.errors.warehouseRequired",
166
+ "Select a warehouse."
167
+ );
168
+ }
169
+ if (!catalogVariantId.trim()) {
170
+ nextErrors.catalogVariantId = t(
171
+ "wms.backend.inventory.reserve.errors.variantRequired",
172
+ "Select a variant."
173
+ );
174
+ }
175
+ const qty = Number(quantity);
176
+ if (!Number.isFinite(qty) || qty <= 0) {
177
+ nextErrors.quantity = t(
178
+ "wms.backend.inventory.reserve.errors.quantityInvalid",
179
+ "Enter a positive quantity."
180
+ );
181
+ }
182
+ if (trackingProfile?.trackLot && !lotId.trim()) {
183
+ nextErrors.lotId = t(
184
+ "wms.backend.inventory.reserve.errors.lotRequired",
185
+ "Select a lot for this variant."
186
+ );
187
+ }
188
+ if (trackingProfile?.trackSerial && !serialNumber.trim()) {
189
+ nextErrors.serialNumber = t(
190
+ "wms.backend.inventory.reserve.errors.serialRequired",
191
+ "Enter a serial number for this variant."
192
+ );
193
+ }
194
+ if (Object.keys(nextErrors).length > 0) {
195
+ setFieldErrors(nextErrors);
196
+ return;
197
+ }
198
+ setSubmitting(true);
199
+ try {
200
+ const body = {
201
+ organizationId: access.organizationId,
202
+ tenantId: access.tenantId,
203
+ warehouseId: warehouseId.trim(),
204
+ catalogVariantId: catalogVariantId.trim(),
205
+ quantity: qty,
206
+ sourceType,
207
+ sourceId: buildInventoryMutationReferenceId()
208
+ };
209
+ if (lotId.trim()) body.lotId = lotId.trim();
210
+ const serial = serialNumber.trim();
211
+ if (serial) body.serialNumber = serial;
212
+ await runMutation({
213
+ operation: async () => {
214
+ const call = await apiCall(
215
+ "/api/wms/inventory/reserve",
216
+ {
217
+ method: "POST",
218
+ headers: { "content-type": "application/json" },
219
+ body: JSON.stringify(body)
220
+ }
221
+ );
222
+ if (!call.ok) {
223
+ const errorBody = await readJsonSafe(call.response.clone(), null);
224
+ if (errorBody?.error === "insufficient_stock") {
225
+ throw new Error(
226
+ t(
227
+ "wms.backend.inventory.reserve.errors.insufficientStock",
228
+ "Not enough available stock to fulfil this reservation."
229
+ )
230
+ );
231
+ }
232
+ await raiseCrudError(
233
+ call.response,
234
+ t("wms.backend.inventory.reserve.errors.failed", "Failed to reserve inventory.")
235
+ );
236
+ }
237
+ return call.result ?? {};
238
+ },
239
+ context: mutationContext,
240
+ mutationPayload: body
241
+ });
242
+ flash(
243
+ t("wms.backend.inventory.reserve.success", "Reservation created successfully."),
244
+ "success"
245
+ );
246
+ await queryClient.invalidateQueries({ queryKey: ["wms-inventory-console"] });
247
+ closeDialog();
248
+ } catch (error) {
249
+ flashMutationError(error, t("wms.backend.inventory.reserve.errors.failed", "Failed to reserve inventory."), t);
250
+ } finally {
251
+ setSubmitting(false);
252
+ }
253
+ },
254
+ [
255
+ access.organizationId,
256
+ access.tenantId,
257
+ catalogVariantId,
258
+ closeDialog,
259
+ lotId,
260
+ mutationContext,
261
+ quantity,
262
+ queryClient,
263
+ runMutation,
264
+ serialNumber,
265
+ sourceType,
266
+ t,
267
+ trackingProfile,
268
+ warehouseId
269
+ ]
270
+ );
271
+ const handleKeyDown = React.useCallback(
272
+ (e) => {
273
+ if ((e.metaKey || e.ctrlKey) && e.key === "Enter") {
274
+ e.preventDefault();
275
+ void handleSubmit();
276
+ }
277
+ },
278
+ [handleSubmit]
279
+ );
280
+ const isMutating = submitting;
281
+ return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: closeDialog, children: /* @__PURE__ */ jsxs(DialogContent, { onKeyDown: handleKeyDown, children: [
282
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
283
+ /* @__PURE__ */ jsx(DialogTitle, { children: t("wms.backend.inventory.reserve.title", "Reserve inventory") }),
284
+ /* @__PURE__ */ jsx(DialogDescription, { children: t(
285
+ "wms.backend.inventory.reserve.description",
286
+ "Commit stock from available inventory. The system allocates using the configured rotation strategy."
287
+ ) })
288
+ ] }),
289
+ /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, children: [
290
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-4 py-2", children: [
291
+ /* @__PURE__ */ jsx(
292
+ FormField,
293
+ {
294
+ label: t("wms.backend.inventory.reserve.fields.warehouse", "Warehouse"),
295
+ required: true,
296
+ error: fieldErrors.warehouseId,
297
+ children: /* @__PURE__ */ jsx(
298
+ ComboboxInput,
299
+ {
300
+ value: warehouseId,
301
+ onChange: (next) => {
302
+ setWarehouseId(next.trim());
303
+ setFieldErrors((e) => ({ ...e, warehouseId: "" }));
304
+ },
305
+ loadSuggestions: loadWarehouseSuggestions,
306
+ resolveLabel: resolveWarehouseComboboxLabel,
307
+ placeholder: t(
308
+ "wms.backend.inventory.reserve.fields.warehousePlaceholder",
309
+ "Select warehouse\u2026"
310
+ ),
311
+ allowCustomValues: false,
312
+ disabled: isMutating
313
+ }
314
+ )
315
+ }
316
+ ),
317
+ /* @__PURE__ */ jsx(
318
+ FormField,
319
+ {
320
+ label: t("wms.backend.inventory.reserve.fields.variant", "Variant / SKU"),
321
+ required: true,
322
+ error: fieldErrors.catalogVariantId,
323
+ children: /* @__PURE__ */ jsx(
324
+ ComboboxInput,
325
+ {
326
+ value: catalogVariantId,
327
+ onChange: (next) => {
328
+ setCatalogVariantId(next.trim());
329
+ setLotId("");
330
+ setSerialNumber("");
331
+ setFieldErrors((e) => ({ ...e, catalogVariantId: "" }));
332
+ },
333
+ loadSuggestions: loadVariantSuggestions,
334
+ resolveLabel: resolveVariantComboboxLabel,
335
+ placeholder: t(
336
+ "wms.backend.inventory.reserve.fields.variantPlaceholder",
337
+ "Search SKU or name\u2026"
338
+ ),
339
+ allowCustomValues: false,
340
+ disabled: isMutating
341
+ }
342
+ )
343
+ }
344
+ ),
345
+ /* @__PURE__ */ jsx(
346
+ FormField,
347
+ {
348
+ label: t("wms.backend.inventory.reserve.fields.quantity", "Quantity"),
349
+ required: true,
350
+ error: fieldErrors.quantity,
351
+ children: /* @__PURE__ */ jsx(
352
+ Input,
353
+ {
354
+ type: "number",
355
+ min: "0.001",
356
+ step: "any",
357
+ value: quantity,
358
+ onChange: (e) => {
359
+ setQuantity(e.target.value);
360
+ setFieldErrors((err) => ({ ...err, quantity: "" }));
361
+ },
362
+ placeholder: "1",
363
+ disabled: isMutating
364
+ }
365
+ )
366
+ }
367
+ ),
368
+ /* @__PURE__ */ jsx(
369
+ FormField,
370
+ {
371
+ label: t("wms.backend.inventory.reserve.fields.sourceType", "Reservation type"),
372
+ children: /* @__PURE__ */ jsxs(
373
+ Select,
374
+ {
375
+ value: sourceType,
376
+ onValueChange: (v) => setSourceType(v),
377
+ disabled: isMutating,
378
+ children: [
379
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }),
380
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
381
+ /* @__PURE__ */ jsx(SelectItem, { value: "manual", children: t("wms.backend.inventory.reserve.sourceType.manual", "Manual hold") }),
382
+ /* @__PURE__ */ jsx(SelectItem, { value: "order", children: t("wms.backend.inventory.reserve.sourceType.order", "Order") }),
383
+ /* @__PURE__ */ jsx(SelectItem, { value: "transfer", children: t("wms.backend.inventory.reserve.sourceType.transfer", "Transfer") })
384
+ ] })
385
+ ]
386
+ }
387
+ )
388
+ }
389
+ ),
390
+ catalogVariantId.trim() ? /* @__PURE__ */ jsx(
391
+ FormField,
392
+ {
393
+ label: t(
394
+ "wms.backend.inventory.reserve.fields.lot",
395
+ trackingProfile?.trackLot ? "Lot" : "Lot (optional)"
396
+ ),
397
+ required: trackingProfile?.trackLot === true,
398
+ error: fieldErrors.lotId,
399
+ children: /* @__PURE__ */ jsx(
400
+ ComboboxInput,
401
+ {
402
+ value: lotId,
403
+ onChange: (next) => {
404
+ setLotId(next.trim());
405
+ setFieldErrors((e) => ({ ...e, lotId: "" }));
406
+ },
407
+ loadSuggestions: loadLotSuggestions,
408
+ resolveLabel: resolveLotComboboxLabel,
409
+ placeholder: t(
410
+ trackingProfile?.trackLot ? "wms.backend.inventory.reserve.fields.lotRequiredPlaceholder" : "wms.backend.inventory.reserve.fields.lotPlaceholder",
411
+ trackingProfile?.trackLot ? "Select lot\u2026" : "Any lot (system selects)\u2026"
412
+ ),
413
+ allowCustomValues: false,
414
+ clearable: !trackingProfile?.trackLot,
415
+ disabled: isMutating
416
+ }
417
+ )
418
+ }
419
+ ) : null,
420
+ catalogVariantId.trim() && trackingProfile?.trackSerial ? /* @__PURE__ */ jsx(
421
+ FormField,
422
+ {
423
+ label: t("wms.backend.inventory.reserve.fields.serial", "Serial number"),
424
+ required: true,
425
+ error: fieldErrors.serialNumber,
426
+ children: /* @__PURE__ */ jsx(
427
+ Input,
428
+ {
429
+ value: serialNumber,
430
+ onChange: (e) => {
431
+ setSerialNumber(e.target.value);
432
+ setFieldErrors((err) => ({ ...err, serialNumber: "" }));
433
+ },
434
+ placeholder: t(
435
+ "wms.backend.inventory.reserve.fields.serialPlaceholder",
436
+ "Enter serial number\u2026"
437
+ ),
438
+ disabled: isMutating
439
+ }
440
+ )
441
+ }
442
+ ) : null
443
+ ] }),
444
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [
445
+ /* @__PURE__ */ jsx(
446
+ Button,
447
+ {
448
+ type: "button",
449
+ variant: "outline",
450
+ onClick: closeDialog,
451
+ disabled: isMutating,
452
+ children: t("wms.backend.inventory.reserve.cancel", "Cancel")
453
+ }
454
+ ),
455
+ /* @__PURE__ */ jsxs(
456
+ Button,
457
+ {
458
+ type: "button",
459
+ onClick: () => void handleSubmit(),
460
+ disabled: isMutating,
461
+ children: [
462
+ /* @__PURE__ */ jsx(ShieldCheck, { className: "size-4" }),
463
+ isMutating ? t("wms.backend.inventory.reserve.submitting", "Reserving\u2026") : t("wms.backend.inventory.reserve.submit", "Reserve"),
464
+ !isMutating && /* @__PURE__ */ jsx(KbdShortcut, { keys: ["\u2318", "\u21B5"] })
465
+ ]
466
+ }
467
+ )
468
+ ] })
469
+ ] })
470
+ ] }) });
471
+ }
472
+ export {
473
+ ReserveInventoryDialog
474
+ };
475
+ //# sourceMappingURL=ReserveInventoryDialog.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/wms/components/backend/ReserveInventoryDialog.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { ShieldCheck } from 'lucide-react'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { flashMutationError } from '../../lib/flashMutationError'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { ComboboxInput } from '@open-mercato/ui/backend/inputs/ComboboxInput'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError, readJsonSafe } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { FormField } from '@open-mercato/ui/primitives/form-field'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { KbdShortcut } from '@open-mercato/ui/primitives/kbd'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { buildInventoryMutationReferenceId } from '../../lib/inventoryMutationUi'\nimport {\n loadCatalogVariantOptions,\n loadInventoryProfileForVariant,\n loadLotNumberOptions,\n loadWarehouseOptions,\n resolveCatalogVariantLabel,\n resolveLotNumberFromId,\n resolveWarehouseLabel,\n} from './inventoryMutationLoaders'\nimport type { WmsInventoryMutationAccess } from './useWmsInventoryMutationAccess'\n\nconst RESERVE_SOURCE_TYPES = ['manual', 'order', 'transfer'] as const\ntype ReserveSourceType = (typeof RESERVE_SOURCE_TYPES)[number]\n\ntype ReserveInventoryDialogProps = {\n open: boolean\n onOpenChange: (open: boolean) => void\n access: WmsInventoryMutationAccess\n initialWarehouseId?: string\n initialCatalogVariantId?: string\n}\n\nconst reserveSuccessSchema = z.object({\n ok: z.literal(true),\n reservationId: z.string().uuid(),\n allocatedBuckets: z.array(\n z.object({\n locationId: z.string().uuid(),\n lotId: z.string().uuid().nullable(),\n quantity: z.string(),\n }),\n ),\n})\n\nexport function ReserveInventoryDialog({\n open,\n onOpenChange,\n access,\n initialWarehouseId = '',\n initialCatalogVariantId = '',\n}: ReserveInventoryDialogProps) {\n const t = useT()\n const queryClient = useQueryClient()\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: 'wms-inventory-reserve',\n })\n const mutationContext = React.useMemo(() => ({ retryLastMutation }), [retryLastMutation])\n\n const [warehouseId, setWarehouseId] = React.useState(initialWarehouseId)\n const [catalogVariantId, setCatalogVariantId] = React.useState(initialCatalogVariantId)\n const [lotId, setLotId] = React.useState('')\n // Plain refs (not state): these caches only memoize already-resolved labels\n // for the async `resolveLabel`/`loadSuggestions` callbacks below. Mutating\n // them in place \u2014 instead of `setState` with a freshly spread object every\n // fetch \u2014 keeps those callbacks referentially stable across renders, which\n // in turn keeps ComboboxInput's internal suggestion-fetch effect from\n // retriggering itself forever (a new object identity on every keystroke's\n // suggestion fetch previously caused an infinite refetch loop).\n const warehouseLabelCacheRef = React.useRef<Record<string, string>>({})\n const variantLabelCacheRef = React.useRef<Record<string, string>>({})\n const lotLabelCacheRef = React.useRef<Record<string, string>>({})\n const [serialNumber, setSerialNumber] = React.useState('')\n const [quantity, setQuantity] = React.useState<string>('1')\n const [sourceType, setSourceType] = React.useState<ReserveSourceType>('manual')\n const [submitting, setSubmitting] = React.useState(false)\n const [fieldErrors, setFieldErrors] = React.useState<Record<string, string>>({})\n const [trackingProfile, setTrackingProfile] = React.useState<{\n trackLot: boolean\n trackSerial: boolean\n } | null>(null)\n\n const resetDialog = React.useCallback(() => {\n setWarehouseId(initialWarehouseId)\n setCatalogVariantId(initialCatalogVariantId)\n setLotId('')\n setSerialNumber('')\n setQuantity('1')\n setSourceType('manual')\n setSubmitting(false)\n setFieldErrors({})\n setTrackingProfile(null)\n }, [initialWarehouseId, initialCatalogVariantId])\n\n const closeDialog = React.useCallback(() => {\n onOpenChange(false)\n resetDialog()\n }, [onOpenChange, resetDialog])\n\n React.useEffect(() => {\n if (open) resetDialog()\n }, [open, resetDialog])\n\n React.useEffect(() => {\n if (!open || !catalogVariantId.trim()) {\n setTrackingProfile(null)\n return\n }\n let cancelled = false\n void loadInventoryProfileForVariant(catalogVariantId.trim()).then((profile) => {\n if (cancelled) return\n if (!profile) {\n setTrackingProfile(null)\n return\n }\n setTrackingProfile({\n trackLot: profile.track_lot === true,\n trackSerial: profile.track_serial === true,\n })\n })\n return () => {\n cancelled = true\n }\n }, [catalogVariantId, open])\n\n const loadWarehouseSuggestions = React.useCallback(async (query?: string) => {\n const options = await loadWarehouseOptions(query)\n for (const option of options) warehouseLabelCacheRef.current[option.value] = option.label\n return options\n }, [])\n\n const resolveWarehouseComboboxLabel = React.useCallback(async (value: string) => {\n const cached = warehouseLabelCacheRef.current[value]\n if (cached) return cached\n const label = await resolveWarehouseLabel(value)\n if (label) warehouseLabelCacheRef.current[value] = label\n return label ?? value\n }, [])\n\n const loadVariantSuggestions = React.useCallback(async (query?: string) => {\n const options = await loadCatalogVariantOptions(query)\n for (const option of options) variantLabelCacheRef.current[option.value] = option.label\n return options\n }, [])\n\n const resolveVariantComboboxLabel = React.useCallback(async (value: string) => {\n const cached = variantLabelCacheRef.current[value]\n if (cached) return cached\n const label = await resolveCatalogVariantLabel(value)\n if (label) variantLabelCacheRef.current[value] = label\n return label ?? value\n }, [])\n\n const loadLotSuggestions = React.useCallback(\n async (query?: string) => {\n const options = await loadLotNumberOptions(catalogVariantId.trim(), query)\n for (const option of options) lotLabelCacheRef.current[option.value] = option.label\n return options\n },\n [catalogVariantId],\n )\n\n const resolveLotComboboxLabel = React.useCallback(async (value: string) => {\n const cached = lotLabelCacheRef.current[value]\n if (cached) return cached\n const label = await resolveLotNumberFromId(value)\n if (label) lotLabelCacheRef.current[value] = label\n return label ?? value\n }, [])\n\n const handleSubmit = React.useCallback(\n async (event?: React.FormEvent) => {\n event?.preventDefault()\n setFieldErrors({})\n\n const nextErrors: Record<string, string> = {}\n if (!warehouseId.trim()) {\n nextErrors.warehouseId = t(\n 'wms.backend.inventory.reserve.errors.warehouseRequired',\n 'Select a warehouse.',\n )\n }\n if (!catalogVariantId.trim()) {\n nextErrors.catalogVariantId = t(\n 'wms.backend.inventory.reserve.errors.variantRequired',\n 'Select a variant.',\n )\n }\n const qty = Number(quantity)\n if (!Number.isFinite(qty) || qty <= 0) {\n nextErrors.quantity = t(\n 'wms.backend.inventory.reserve.errors.quantityInvalid',\n 'Enter a positive quantity.',\n )\n }\n if (trackingProfile?.trackLot && !lotId.trim()) {\n nextErrors.lotId = t(\n 'wms.backend.inventory.reserve.errors.lotRequired',\n 'Select a lot for this variant.',\n )\n }\n if (trackingProfile?.trackSerial && !serialNumber.trim()) {\n nextErrors.serialNumber = t(\n 'wms.backend.inventory.reserve.errors.serialRequired',\n 'Enter a serial number for this variant.',\n )\n }\n if (Object.keys(nextErrors).length > 0) {\n setFieldErrors(nextErrors)\n return\n }\n\n setSubmitting(true)\n try {\n const body: Record<string, unknown> = {\n organizationId: access.organizationId,\n tenantId: access.tenantId,\n warehouseId: warehouseId.trim(),\n catalogVariantId: catalogVariantId.trim(),\n quantity: qty,\n sourceType,\n sourceId: buildInventoryMutationReferenceId(),\n }\n if (lotId.trim()) body.lotId = lotId.trim()\n const serial = serialNumber.trim()\n if (serial) body.serialNumber = serial\n\n await runMutation({\n operation: async () => {\n const call = await apiCall<z.infer<typeof reserveSuccessSchema>>(\n '/api/wms/inventory/reserve',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n },\n )\n if (!call.ok) {\n const errorBody = await readJsonSafe<{ error?: string }>(call.response.clone(), null)\n if (errorBody?.error === 'insufficient_stock') {\n throw new Error(\n t(\n 'wms.backend.inventory.reserve.errors.insufficientStock',\n 'Not enough available stock to fulfil this reservation.',\n ),\n )\n }\n await raiseCrudError(\n call.response,\n t('wms.backend.inventory.reserve.errors.failed', 'Failed to reserve inventory.'),\n )\n }\n return call.result ?? {}\n },\n context: mutationContext,\n mutationPayload: body,\n })\n\n flash(\n t('wms.backend.inventory.reserve.success', 'Reservation created successfully.'),\n 'success',\n )\n await queryClient.invalidateQueries({ queryKey: ['wms-inventory-console'] })\n closeDialog()\n } catch (error) {\n flashMutationError(error, t('wms.backend.inventory.reserve.errors.failed', 'Failed to reserve inventory.'), t)\n } finally {\n setSubmitting(false)\n }\n },\n [\n access.organizationId,\n access.tenantId,\n catalogVariantId,\n closeDialog,\n lotId,\n mutationContext,\n quantity,\n queryClient,\n runMutation,\n serialNumber,\n sourceType,\n t,\n trackingProfile,\n warehouseId,\n ],\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault()\n void handleSubmit()\n }\n },\n [handleSubmit],\n )\n\n const isMutating = submitting\n\n return (\n <Dialog open={open} onOpenChange={closeDialog}>\n <DialogContent onKeyDown={handleKeyDown}>\n <DialogHeader>\n <DialogTitle>\n {t('wms.backend.inventory.reserve.title', 'Reserve inventory')}\n </DialogTitle>\n <DialogDescription>\n {t(\n 'wms.backend.inventory.reserve.description',\n 'Commit stock from available inventory. The system allocates using the configured rotation strategy.',\n )}\n </DialogDescription>\n </DialogHeader>\n\n <form onSubmit={handleSubmit}>\n <div className=\"grid gap-4 py-2\">\n <FormField\n label={t('wms.backend.inventory.reserve.fields.warehouse', 'Warehouse')}\n required\n error={fieldErrors.warehouseId}\n >\n <ComboboxInput\n value={warehouseId}\n onChange={(next) => {\n setWarehouseId(next.trim())\n setFieldErrors((e) => ({ ...e, warehouseId: '' }))\n }}\n loadSuggestions={loadWarehouseSuggestions}\n resolveLabel={resolveWarehouseComboboxLabel}\n placeholder={t(\n 'wms.backend.inventory.reserve.fields.warehousePlaceholder',\n 'Select warehouse\u2026',\n )}\n allowCustomValues={false}\n disabled={isMutating}\n />\n </FormField>\n\n <FormField\n label={t('wms.backend.inventory.reserve.fields.variant', 'Variant / SKU')}\n required\n error={fieldErrors.catalogVariantId}\n >\n <ComboboxInput\n value={catalogVariantId}\n onChange={(next) => {\n setCatalogVariantId(next.trim())\n setLotId('')\n setSerialNumber('')\n setFieldErrors((e) => ({ ...e, catalogVariantId: '' }))\n }}\n loadSuggestions={loadVariantSuggestions}\n resolveLabel={resolveVariantComboboxLabel}\n placeholder={t(\n 'wms.backend.inventory.reserve.fields.variantPlaceholder',\n 'Search SKU or name\u2026',\n )}\n allowCustomValues={false}\n disabled={isMutating}\n />\n </FormField>\n\n <FormField\n label={t('wms.backend.inventory.reserve.fields.quantity', 'Quantity')}\n required\n error={fieldErrors.quantity}\n >\n <Input\n type=\"number\"\n min=\"0.001\"\n step=\"any\"\n value={quantity}\n onChange={(e) => {\n setQuantity(e.target.value)\n setFieldErrors((err) => ({ ...err, quantity: '' }))\n }}\n placeholder=\"1\"\n disabled={isMutating}\n />\n </FormField>\n\n <FormField\n label={t('wms.backend.inventory.reserve.fields.sourceType', 'Reservation type')}\n >\n <Select\n value={sourceType}\n onValueChange={(v) => setSourceType(v as ReserveSourceType)}\n disabled={isMutating}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"manual\">\n {t('wms.backend.inventory.reserve.sourceType.manual', 'Manual hold')}\n </SelectItem>\n <SelectItem value=\"order\">\n {t('wms.backend.inventory.reserve.sourceType.order', 'Order')}\n </SelectItem>\n <SelectItem value=\"transfer\">\n {t('wms.backend.inventory.reserve.sourceType.transfer', 'Transfer')}\n </SelectItem>\n </SelectContent>\n </Select>\n </FormField>\n\n {catalogVariantId.trim() ? (\n <FormField\n label={t(\n 'wms.backend.inventory.reserve.fields.lot',\n trackingProfile?.trackLot ? 'Lot' : 'Lot (optional)',\n )}\n required={trackingProfile?.trackLot === true}\n error={fieldErrors.lotId}\n >\n <ComboboxInput\n value={lotId}\n onChange={(next) => {\n setLotId(next.trim())\n setFieldErrors((e) => ({ ...e, lotId: '' }))\n }}\n loadSuggestions={loadLotSuggestions}\n resolveLabel={resolveLotComboboxLabel}\n placeholder={t(\n trackingProfile?.trackLot\n ? 'wms.backend.inventory.reserve.fields.lotRequiredPlaceholder'\n : 'wms.backend.inventory.reserve.fields.lotPlaceholder',\n trackingProfile?.trackLot\n ? 'Select lot\u2026'\n : 'Any lot (system selects)\u2026',\n )}\n allowCustomValues={false}\n clearable={!trackingProfile?.trackLot}\n disabled={isMutating}\n />\n </FormField>\n ) : null}\n\n {catalogVariantId.trim() && trackingProfile?.trackSerial ? (\n <FormField\n label={t('wms.backend.inventory.reserve.fields.serial', 'Serial number')}\n required\n error={fieldErrors.serialNumber}\n >\n <Input\n value={serialNumber}\n onChange={(e) => {\n setSerialNumber(e.target.value)\n setFieldErrors((err) => ({ ...err, serialNumber: '' }))\n }}\n placeholder={t(\n 'wms.backend.inventory.reserve.fields.serialPlaceholder',\n 'Enter serial number\u2026',\n )}\n disabled={isMutating}\n />\n </FormField>\n ) : null}\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={closeDialog}\n disabled={isMutating}\n >\n {t('wms.backend.inventory.reserve.cancel', 'Cancel')}\n </Button>\n <Button\n type=\"button\"\n onClick={() => void handleSubmit()}\n disabled={isMutating}\n >\n <ShieldCheck className=\"size-4\" />\n {isMutating\n ? t('wms.backend.inventory.reserve.submitting', 'Reserving\u2026')\n : t('wms.backend.inventory.reserve.submit', 'Reserve')}\n {!isMutating && <KbdShortcut keys={['\u2318', '\u21B5']} />}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
+ "mappings": ";AAuUQ,SACE,KADF;AArUR,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AACnC,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,SAAS,gBAAgB,oBAAoB;AAC7C,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,YAAY;AACrB,SAAS,yCAAyC;AAClD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,MAAM,uBAAuB,CAAC,UAAU,SAAS,UAAU;AAW3D,MAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,QAAQ,IAAI;AAAA,EAClB,eAAe,EAAE,OAAO,EAAE,KAAK;AAAA,EAC/B,kBAAkB,EAAE;AAAA,IAClB,EAAE,OAAO;AAAA,MACP,YAAY,EAAE,OAAO,EAAE,KAAK;AAAA,MAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,MAClC,UAAU,EAAE,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AACF,CAAC;AAEM,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,0BAA0B;AAC5B,GAAgC;AAC9B,QAAM,IAAI,KAAK;AACf,QAAM,cAAc,eAAe;AACnC,QAAM,EAAE,aAAa,kBAAkB,IAAI,mBAExC;AAAA,IACD,WAAW;AAAA,EACb,CAAC;AACD,QAAM,kBAAkB,MAAM,QAAQ,OAAO,EAAE,kBAAkB,IAAI,CAAC,iBAAiB,CAAC;AAExF,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,kBAAkB;AACvE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,uBAAuB;AACtF,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAQ3C,QAAM,yBAAyB,MAAM,OAA+B,CAAC,CAAC;AACtE,QAAM,uBAAuB,MAAM,OAA+B,CAAC,CAAC;AACpE,QAAM,mBAAmB,MAAM,OAA+B,CAAC,CAAC;AAChE,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,EAAE;AACzD,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAiB,GAAG;AAC1D,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAA4B,QAAQ;AAC9E,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAiC,CAAC,CAAC;AAC/E,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAG1C,IAAI;AAEd,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,mBAAe,kBAAkB;AACjC,wBAAoB,uBAAuB;AAC3C,aAAS,EAAE;AACX,oBAAgB,EAAE;AAClB,gBAAY,GAAG;AACf,kBAAc,QAAQ;AACtB,kBAAc,KAAK;AACnB,mBAAe,CAAC,CAAC;AACjB,uBAAmB,IAAI;AAAA,EACzB,GAAG,CAAC,oBAAoB,uBAAuB,CAAC;AAEhD,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,iBAAa,KAAK;AAClB,gBAAY;AAAA,EACd,GAAG,CAAC,cAAc,WAAW,CAAC;AAE9B,QAAM,UAAU,MAAM;AACpB,QAAI,KAAM,aAAY;AAAA,EACxB,GAAG,CAAC,MAAM,WAAW,CAAC;AAEtB,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,iBAAiB,KAAK,GAAG;AACrC,yBAAmB,IAAI;AACvB;AAAA,IACF;AACA,QAAI,YAAY;AAChB,SAAK,+BAA+B,iBAAiB,KAAK,CAAC,EAAE,KAAK,CAAC,YAAY;AAC7E,UAAI,UAAW;AACf,UAAI,CAAC,SAAS;AACZ,2BAAmB,IAAI;AACvB;AAAA,MACF;AACA,yBAAmB;AAAA,QACjB,UAAU,QAAQ,cAAc;AAAA,QAChC,aAAa,QAAQ,iBAAiB;AAAA,MACxC,CAAC;AAAA,IACH,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,kBAAkB,IAAI,CAAC;AAE3B,QAAM,2BAA2B,MAAM,YAAY,OAAO,UAAmB;AAC3E,UAAM,UAAU,MAAM,qBAAqB,KAAK;AAChD,eAAW,UAAU,QAAS,wBAAuB,QAAQ,OAAO,KAAK,IAAI,OAAO;AACpF,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,gCAAgC,MAAM,YAAY,OAAO,UAAkB;AAC/E,UAAM,SAAS,uBAAuB,QAAQ,KAAK;AACnD,QAAI,OAAQ,QAAO;AACnB,UAAM,QAAQ,MAAM,sBAAsB,KAAK;AAC/C,QAAI,MAAO,wBAAuB,QAAQ,KAAK,IAAI;AACnD,WAAO,SAAS;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAyB,MAAM,YAAY,OAAO,UAAmB;AACzE,UAAM,UAAU,MAAM,0BAA0B,KAAK;AACrD,eAAW,UAAU,QAAS,sBAAqB,QAAQ,OAAO,KAAK,IAAI,OAAO;AAClF,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,8BAA8B,MAAM,YAAY,OAAO,UAAkB;AAC7E,UAAM,SAAS,qBAAqB,QAAQ,KAAK;AACjD,QAAI,OAAQ,QAAO;AACnB,UAAM,QAAQ,MAAM,2BAA2B,KAAK;AACpD,QAAI,MAAO,sBAAqB,QAAQ,KAAK,IAAI;AACjD,WAAO,SAAS;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM;AAAA,IAC/B,OAAO,UAAmB;AACxB,YAAM,UAAU,MAAM,qBAAqB,iBAAiB,KAAK,GAAG,KAAK;AACzE,iBAAW,UAAU,QAAS,kBAAiB,QAAQ,OAAO,KAAK,IAAI,OAAO;AAC9E,aAAO;AAAA,IACT;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,0BAA0B,MAAM,YAAY,OAAO,UAAkB;AACzE,UAAM,SAAS,iBAAiB,QAAQ,KAAK;AAC7C,QAAI,OAAQ,QAAO;AACnB,UAAM,QAAQ,MAAM,uBAAuB,KAAK;AAChD,QAAI,MAAO,kBAAiB,QAAQ,KAAK,IAAI;AAC7C,WAAO,SAAS;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,MAAM;AAAA,IACzB,OAAO,UAA4B;AACjC,aAAO,eAAe;AACtB,qBAAe,CAAC,CAAC;AAEjB,YAAM,aAAqC,CAAC;AAC5C,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB,mBAAW,cAAc;AAAA,UACvB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,iBAAiB,KAAK,GAAG;AAC5B,mBAAW,mBAAmB;AAAA,UAC5B;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,MAAM,OAAO,QAAQ;AAC3B,UAAI,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO,GAAG;AACrC,mBAAW,WAAW;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,iBAAiB,YAAY,CAAC,MAAM,KAAK,GAAG;AAC9C,mBAAW,QAAQ;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,iBAAiB,eAAe,CAAC,aAAa,KAAK,GAAG;AACxD,mBAAW,eAAe;AAAA,UACxB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,uBAAe,UAAU;AACzB;AAAA,MACF;AAEA,oBAAc,IAAI;AAClB,UAAI;AACF,cAAM,OAAgC;AAAA,UACpC,gBAAgB,OAAO;AAAA,UACvB,UAAU,OAAO;AAAA,UACjB,aAAa,YAAY,KAAK;AAAA,UAC9B,kBAAkB,iBAAiB,KAAK;AAAA,UACxC,UAAU;AAAA,UACV;AAAA,UACA,UAAU,kCAAkC;AAAA,QAC9C;AACA,YAAI,MAAM,KAAK,EAAG,MAAK,QAAQ,MAAM,KAAK;AAC1C,cAAM,SAAS,aAAa,KAAK;AACjC,YAAI,OAAQ,MAAK,eAAe;AAEhC,cAAM,YAAY;AAAA,UAChB,WAAW,YAAY;AACrB,kBAAM,OAAO,MAAM;AAAA,cACjB;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,gBAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,cAC3B;AAAA,YACF;AACA,gBAAI,CAAC,KAAK,IAAI;AACZ,oBAAM,YAAY,MAAM,aAAiC,KAAK,SAAS,MAAM,GAAG,IAAI;AACpF,kBAAI,WAAW,UAAU,sBAAsB;AAC7C,sBAAM,IAAI;AAAA,kBACR;AAAA,oBACE;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AACA,oBAAM;AAAA,gBACJ,KAAK;AAAA,gBACL,EAAE,+CAA+C,8BAA8B;AAAA,cACjF;AAAA,YACF;AACA,mBAAO,KAAK,UAAU,CAAC;AAAA,UACzB;AAAA,UACA,SAAS;AAAA,UACT,iBAAiB;AAAA,QACnB,CAAC;AAED;AAAA,UACE,EAAE,yCAAyC,mCAAmC;AAAA,UAC9E;AAAA,QACF;AACA,cAAM,YAAY,kBAAkB,EAAE,UAAU,CAAC,uBAAuB,EAAE,CAAC;AAC3E,oBAAY;AAAA,MACd,SAAS,OAAO;AACd,2BAAmB,OAAO,EAAE,+CAA+C,8BAA8B,GAAG,CAAC;AAAA,MAC/G,UAAE;AACA,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM;AAAA,IAC1B,CAAC,MAA2B;AAC1B,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,SAAS;AACjD,UAAE,eAAe;AACjB,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,aAAa;AAEnB,SACE,oBAAC,UAAO,MAAY,cAAc,aAChC,+BAAC,iBAAc,WAAW,eACxB;AAAA,yBAAC,gBACC;AAAA,0BAAC,eACE,YAAE,uCAAuC,mBAAmB,GAC/D;AAAA,MACA,oBAAC,qBACE;AAAA,QACC;AAAA,QACA;AAAA,MACF,GACF;AAAA,OACF;AAAA,IAEA,qBAAC,UAAK,UAAU,cACd;AAAA,2BAAC,SAAI,WAAU,mBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,kDAAkD,WAAW;AAAA,YACtE,UAAQ;AAAA,YACR,OAAO,YAAY;AAAA,YAEnB;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,SAAS;AAClB,iCAAe,KAAK,KAAK,CAAC;AAC1B,iCAAe,CAAC,OAAO,EAAE,GAAG,GAAG,aAAa,GAAG,EAAE;AAAA,gBACnD;AAAA,gBACA,iBAAiB;AAAA,gBACjB,cAAc;AAAA,gBACd,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBACF;AAAA,gBACA,mBAAmB;AAAA,gBACnB,UAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,gDAAgD,eAAe;AAAA,YACxE,UAAQ;AAAA,YACR,OAAO,YAAY;AAAA,YAEnB;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,SAAS;AAClB,sCAAoB,KAAK,KAAK,CAAC;AAC/B,2BAAS,EAAE;AACX,kCAAgB,EAAE;AAClB,iCAAe,CAAC,OAAO,EAAE,GAAG,GAAG,kBAAkB,GAAG,EAAE;AAAA,gBACxD;AAAA,gBACA,iBAAiB;AAAA,gBACjB,cAAc;AAAA,gBACd,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBACF;AAAA,gBACA,mBAAmB;AAAA,gBACnB,UAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,iDAAiD,UAAU;AAAA,YACpE,UAAQ;AAAA,YACR,OAAO,YAAY;AAAA,YAEnB;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,KAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM;AACf,8BAAY,EAAE,OAAO,KAAK;AAC1B,iCAAe,CAAC,SAAS,EAAE,GAAG,KAAK,UAAU,GAAG,EAAE;AAAA,gBACpD;AAAA,gBACA,aAAY;AAAA,gBACZ,UAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,mDAAmD,kBAAkB;AAAA,YAE9E;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,eAAe,CAAC,MAAM,cAAc,CAAsB;AAAA,gBAC1D,UAAU;AAAA,gBAEV;AAAA,sCAAC,iBACC,8BAAC,eAAY,GACf;AAAA,kBACA,qBAAC,iBACC;AAAA,wCAAC,cAAW,OAAM,UACf,YAAE,mDAAmD,aAAa,GACrE;AAAA,oBACA,oBAAC,cAAW,OAAM,SACf,YAAE,kDAAkD,OAAO,GAC9D;AAAA,oBACA,oBAAC,cAAW,OAAM,YACf,YAAE,qDAAqD,UAAU,GACpE;AAAA,qBACF;AAAA;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEC,iBAAiB,KAAK,IACrB;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL;AAAA,cACA,iBAAiB,WAAW,QAAQ;AAAA,YACtC;AAAA,YACA,UAAU,iBAAiB,aAAa;AAAA,YACxC,OAAO,YAAY;AAAA,YAEnB;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,SAAS;AAClB,2BAAS,KAAK,KAAK,CAAC;AACpB,iCAAe,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,GAAG,EAAE;AAAA,gBAC7C;AAAA,gBACA,iBAAiB;AAAA,gBACjB,cAAc;AAAA,gBACd,aAAa;AAAA,kBACX,iBAAiB,WACb,gEACA;AAAA,kBACJ,iBAAiB,WACb,qBACA;AAAA,gBACN;AAAA,gBACA,mBAAmB;AAAA,gBACnB,WAAW,CAAC,iBAAiB;AAAA,gBAC7B,UAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF,IACE;AAAA,QAEH,iBAAiB,KAAK,KAAK,iBAAiB,cAC3C;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,+CAA+C,eAAe;AAAA,YACvE,UAAQ;AAAA,YACR,OAAO,YAAY;AAAA,YAEnB;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM;AACf,kCAAgB,EAAE,OAAO,KAAK;AAC9B,iCAAe,CAAC,SAAS,EAAE,GAAG,KAAK,cAAc,GAAG,EAAE;AAAA,gBACxD;AAAA,gBACA,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBACF;AAAA,gBACA,UAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF,IACE;AAAA,SACN;AAAA,MAEA,qBAAC,gBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS;AAAA,YACT,UAAU;AAAA,YAET,YAAE,wCAAwC,QAAQ;AAAA;AAAA,QACrD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,KAAK,aAAa;AAAA,YACjC,UAAU;AAAA,YAEV;AAAA,kCAAC,eAAY,WAAU,UAAS;AAAA,cAC/B,aACG,EAAE,4CAA4C,iBAAY,IAC1D,EAAE,wCAAwC,SAAS;AAAA,cACtD,CAAC,cAAc,oBAAC,eAAY,MAAM,CAAC,UAAK,QAAG,GAAG;AAAA;AAAA;AAAA,QACjD;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;",
6
+ "names": []
7
+ }