@open-mercato/core 0.6.7-develop.6669.1.40b669666b → 0.6.7-develop.6671.1.4b925c5096

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 (473) 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/query_index/lib/engine.js +6 -6
  35. package/dist/modules/query_index/lib/engine.js.map +2 -2
  36. package/dist/modules/sales/api/documents/factory.js +1 -0
  37. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  38. package/dist/modules/sales/commands/documents.js +53 -0
  39. package/dist/modules/sales/commands/documents.js.map +2 -2
  40. package/dist/modules/sales/components/documents/ItemsSection.js +51 -2
  41. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  42. package/dist/modules/sales/events.js +2 -0
  43. package/dist/modules/sales/events.js.map +2 -2
  44. package/dist/modules/sales/widgets/injection/order-items-context.js +11 -0
  45. package/dist/modules/sales/widgets/injection/order-items-context.js.map +7 -0
  46. package/dist/modules/wms/acl.js +18 -0
  47. package/dist/modules/wms/acl.js.map +7 -0
  48. package/dist/modules/wms/analytics.js +11 -0
  49. package/dist/modules/wms/analytics.js.map +7 -0
  50. package/dist/modules/wms/api/dashboard/operational/route.js +80 -0
  51. package/dist/modules/wms/api/dashboard/operational/route.js.map +7 -0
  52. package/dist/modules/wms/api/interceptors.js +90 -0
  53. package/dist/modules/wms/api/interceptors.js.map +7 -0
  54. package/dist/modules/wms/api/inventory/adjust/route.js +51 -0
  55. package/dist/modules/wms/api/inventory/adjust/route.js.map +7 -0
  56. package/dist/modules/wms/api/inventory/allocate/route.js +51 -0
  57. package/dist/modules/wms/api/inventory/allocate/route.js.map +7 -0
  58. package/dist/modules/wms/api/inventory/balances/route.js +172 -0
  59. package/dist/modules/wms/api/inventory/balances/route.js.map +7 -0
  60. package/dist/modules/wms/api/inventory/cycle-count/route.js +52 -0
  61. package/dist/modules/wms/api/inventory/cycle-count/route.js.map +7 -0
  62. package/dist/modules/wms/api/inventory/helpers.js +113 -0
  63. package/dist/modules/wms/api/inventory/helpers.js.map +7 -0
  64. package/dist/modules/wms/api/inventory/import/apply/route.js +46 -0
  65. package/dist/modules/wms/api/inventory/import/apply/route.js.map +7 -0
  66. package/dist/modules/wms/api/inventory/import/helpers.js +195 -0
  67. package/dist/modules/wms/api/inventory/import/helpers.js.map +7 -0
  68. package/dist/modules/wms/api/inventory/import/template/route.js +32 -0
  69. package/dist/modules/wms/api/inventory/import/template/route.js.map +7 -0
  70. package/dist/modules/wms/api/inventory/import/validate/route.js +54 -0
  71. package/dist/modules/wms/api/inventory/import/validate/route.js.map +7 -0
  72. package/dist/modules/wms/api/inventory/move/route.js +51 -0
  73. package/dist/modules/wms/api/inventory/move/route.js.map +7 -0
  74. package/dist/modules/wms/api/inventory/movements/route.js +164 -0
  75. package/dist/modules/wms/api/inventory/movements/route.js.map +7 -0
  76. package/dist/modules/wms/api/inventory/receive/route.js +50 -0
  77. package/dist/modules/wms/api/inventory/receive/route.js.map +7 -0
  78. package/dist/modules/wms/api/inventory/release/route.js +44 -0
  79. package/dist/modules/wms/api/inventory/release/route.js.map +7 -0
  80. package/dist/modules/wms/api/inventory/reservations/route.js +128 -0
  81. package/dist/modules/wms/api/inventory/reservations/route.js.map +7 -0
  82. package/dist/modules/wms/api/inventory/reserve/route.js +59 -0
  83. package/dist/modules/wms/api/inventory/reserve/route.js.map +7 -0
  84. package/dist/modules/wms/api/inventory-profiles/route.js +178 -0
  85. package/dist/modules/wms/api/inventory-profiles/route.js.map +7 -0
  86. package/dist/modules/wms/api/listEnrichers.js +181 -0
  87. package/dist/modules/wms/api/listEnrichers.js.map +7 -0
  88. package/dist/modules/wms/api/listSearch.js +77 -0
  89. package/dist/modules/wms/api/listSearch.js.map +7 -0
  90. package/dist/modules/wms/api/locations/route.js +172 -0
  91. package/dist/modules/wms/api/locations/route.js.map +7 -0
  92. package/dist/modules/wms/api/lots/route.js +204 -0
  93. package/dist/modules/wms/api/lots/route.js.map +7 -0
  94. package/dist/modules/wms/api/openapi.js +27 -0
  95. package/dist/modules/wms/api/openapi.js.map +7 -0
  96. package/dist/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.js +54 -0
  97. package/dist/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.js.map +7 -0
  98. package/dist/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.js +279 -0
  99. package/dist/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.js.map +7 -0
  100. package/dist/modules/wms/api/sales-orders/assign-warehouse/route.js +56 -0
  101. package/dist/modules/wms/api/sales-orders/assign-warehouse/route.js.map +7 -0
  102. package/dist/modules/wms/api/sales-orders/unassign-warehouse/route.js +43 -0
  103. package/dist/modules/wms/api/sales-orders/unassign-warehouse/route.js.map +7 -0
  104. package/dist/modules/wms/api/warehouses/route.js +181 -0
  105. package/dist/modules/wms/api/warehouses/route.js.map +7 -0
  106. package/dist/modules/wms/api/zones/route.js +159 -0
  107. package/dist/modules/wms/api/zones/route.js.map +7 -0
  108. package/dist/modules/wms/backend/config/wms/page.js +9 -0
  109. package/dist/modules/wms/backend/config/wms/page.js.map +7 -0
  110. package/dist/modules/wms/backend/config/wms/page.meta.js +18 -0
  111. package/dist/modules/wms/backend/config/wms/page.meta.js.map +7 -0
  112. package/dist/modules/wms/backend/page.js +9 -0
  113. package/dist/modules/wms/backend/page.js.map +7 -0
  114. package/dist/modules/wms/backend/page.meta.js +16 -0
  115. package/dist/modules/wms/backend/page.meta.js.map +7 -0
  116. package/dist/modules/wms/backend/wms/inventory/page.js +9 -0
  117. package/dist/modules/wms/backend/wms/inventory/page.js.map +7 -0
  118. package/dist/modules/wms/backend/wms/inventory/page.meta.js +18 -0
  119. package/dist/modules/wms/backend/wms/inventory/page.meta.js.map +7 -0
  120. package/dist/modules/wms/backend/wms/location/[id]/page.js +9 -0
  121. package/dist/modules/wms/backend/wms/location/[id]/page.js.map +7 -0
  122. package/dist/modules/wms/backend/wms/location/[id]/page.meta.js +18 -0
  123. package/dist/modules/wms/backend/wms/location/[id]/page.meta.js.map +7 -0
  124. package/dist/modules/wms/backend/wms/locations/page.js +10 -0
  125. package/dist/modules/wms/backend/wms/locations/page.js.map +7 -0
  126. package/dist/modules/wms/backend/wms/locations/page.meta.js +18 -0
  127. package/dist/modules/wms/backend/wms/locations/page.meta.js.map +7 -0
  128. package/dist/modules/wms/backend/wms/lot/[id]/page.js +9 -0
  129. package/dist/modules/wms/backend/wms/lot/[id]/page.js.map +7 -0
  130. package/dist/modules/wms/backend/wms/lot/[id]/page.meta.js +18 -0
  131. package/dist/modules/wms/backend/wms/lot/[id]/page.meta.js.map +7 -0
  132. package/dist/modules/wms/backend/wms/lots/page.js +9 -0
  133. package/dist/modules/wms/backend/wms/lots/page.js.map +7 -0
  134. package/dist/modules/wms/backend/wms/lots/page.meta.js +18 -0
  135. package/dist/modules/wms/backend/wms/lots/page.meta.js.map +7 -0
  136. package/dist/modules/wms/backend/wms/movements/page.js +22 -0
  137. package/dist/modules/wms/backend/wms/movements/page.js.map +7 -0
  138. package/dist/modules/wms/backend/wms/movements/page.meta.js +18 -0
  139. package/dist/modules/wms/backend/wms/movements/page.meta.js.map +7 -0
  140. package/dist/modules/wms/backend/wms/reservations/page.js +23 -0
  141. package/dist/modules/wms/backend/wms/reservations/page.js.map +7 -0
  142. package/dist/modules/wms/backend/wms/reservations/page.meta.js +18 -0
  143. package/dist/modules/wms/backend/wms/reservations/page.meta.js.map +7 -0
  144. package/dist/modules/wms/backend/wms/sku/[id]/page.js +9 -0
  145. package/dist/modules/wms/backend/wms/sku/[id]/page.js.map +7 -0
  146. package/dist/modules/wms/backend/wms/sku/[id]/page.meta.js +18 -0
  147. package/dist/modules/wms/backend/wms/sku/[id]/page.meta.js.map +7 -0
  148. package/dist/modules/wms/backend/wms/warehouses/page.js +10 -0
  149. package/dist/modules/wms/backend/wms/warehouses/page.js.map +7 -0
  150. package/dist/modules/wms/backend/wms/warehouses/page.meta.js +18 -0
  151. package/dist/modules/wms/backend/wms/warehouses/page.meta.js.map +7 -0
  152. package/dist/modules/wms/backend/wms/zones/page.js +10 -0
  153. package/dist/modules/wms/backend/wms/zones/page.js.map +7 -0
  154. package/dist/modules/wms/backend/wms/zones/page.meta.js +18 -0
  155. package/dist/modules/wms/backend/wms/zones/page.meta.js.map +7 -0
  156. package/dist/modules/wms/ce.js +80 -0
  157. package/dist/modules/wms/ce.js.map +7 -0
  158. package/dist/modules/wms/cli.js +83 -0
  159. package/dist/modules/wms/cli.js.map +7 -0
  160. package/dist/modules/wms/commands/configuration.js +1519 -0
  161. package/dist/modules/wms/commands/configuration.js.map +7 -0
  162. package/dist/modules/wms/commands/index.js +4 -0
  163. package/dist/modules/wms/commands/index.js.map +7 -0
  164. package/dist/modules/wms/commands/inventory-actions.js +1539 -0
  165. package/dist/modules/wms/commands/inventory-actions.js.map +7 -0
  166. package/dist/modules/wms/commands/sales-order-assignment.js +277 -0
  167. package/dist/modules/wms/commands/sales-order-assignment.js.map +7 -0
  168. package/dist/modules/wms/commands/shared.js +82 -0
  169. package/dist/modules/wms/commands/shared.js.map +7 -0
  170. package/dist/modules/wms/components/backend/AdjustInventoryDialog.js +755 -0
  171. package/dist/modules/wms/components/backend/AdjustInventoryDialog.js.map +7 -0
  172. package/dist/modules/wms/components/backend/ChangeLotStatusDialog.js +269 -0
  173. package/dist/modules/wms/components/backend/ChangeLotStatusDialog.js.map +7 -0
  174. package/dist/modules/wms/components/backend/CycleCountWizardDialog.js +1783 -0
  175. package/dist/modules/wms/components/backend/CycleCountWizardDialog.js.map +7 -0
  176. package/dist/modules/wms/components/backend/ImportInventoryDialog.js +766 -0
  177. package/dist/modules/wms/components/backend/ImportInventoryDialog.js.map +7 -0
  178. package/dist/modules/wms/components/backend/InventoryOperationsSection.js +119 -0
  179. package/dist/modules/wms/components/backend/InventoryOperationsSection.js.map +7 -0
  180. package/dist/modules/wms/components/backend/LocationEditDialog.js +140 -0
  181. package/dist/modules/wms/components/backend/LocationEditDialog.js.map +7 -0
  182. package/dist/modules/wms/components/backend/MoveInventoryDialog.js +791 -0
  183. package/dist/modules/wms/components/backend/MoveInventoryDialog.js.map +7 -0
  184. package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js +656 -0
  185. package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js.map +7 -0
  186. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +344 -0
  187. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +7 -0
  188. package/dist/modules/wms/components/backend/ReserveInventoryDialog.js +475 -0
  189. package/dist/modules/wms/components/backend/ReserveInventoryDialog.js.map +7 -0
  190. package/dist/modules/wms/components/backend/WmsConfigurationPage.js +1112 -0
  191. package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +7 -0
  192. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +908 -0
  193. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +7 -0
  194. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +1015 -0
  195. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +7 -0
  196. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +1049 -0
  197. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +7 -0
  198. package/dist/modules/wms/components/backend/WmsLotsListPage.js +297 -0
  199. package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +7 -0
  200. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +757 -0
  201. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +7 -0
  202. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +975 -0
  203. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +7 -0
  204. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +710 -0
  205. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +7 -0
  206. package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js +79 -0
  207. package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js.map +7 -0
  208. package/dist/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.js +24 -0
  209. package/dist/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.js.map +7 -0
  210. package/dist/modules/wms/components/backend/wmsLookupLoaders.js +55 -0
  211. package/dist/modules/wms/components/backend/wmsLookupLoaders.js.map +7 -0
  212. package/dist/modules/wms/data/enrichers.js +501 -0
  213. package/dist/modules/wms/data/enrichers.js.map +7 -0
  214. package/dist/modules/wms/data/entities.js +467 -0
  215. package/dist/modules/wms/data/entities.js.map +7 -0
  216. package/dist/modules/wms/data/validators.js +399 -0
  217. package/dist/modules/wms/data/validators.js.map +7 -0
  218. package/dist/modules/wms/di.js +27 -0
  219. package/dist/modules/wms/di.js.map +7 -0
  220. package/dist/modules/wms/events.js +42 -0
  221. package/dist/modules/wms/events.js.map +7 -0
  222. package/dist/modules/wms/index.js +17 -0
  223. package/dist/modules/wms/index.js.map +7 -0
  224. package/dist/modules/wms/lib/catalogInventoryProfileIntent.js +54 -0
  225. package/dist/modules/wms/lib/catalogInventoryProfileIntent.js.map +7 -0
  226. package/dist/modules/wms/lib/catalogInventoryProfileSync.js +144 -0
  227. package/dist/modules/wms/lib/catalogInventoryProfileSync.js.map +7 -0
  228. package/dist/modules/wms/lib/expiry.js +29 -0
  229. package/dist/modules/wms/lib/expiry.js.map +7 -0
  230. package/dist/modules/wms/lib/flashMutationError.js +51 -0
  231. package/dist/modules/wms/lib/flashMutationError.js.map +7 -0
  232. package/dist/modules/wms/lib/inventoryDisplayUi.js +188 -0
  233. package/dist/modules/wms/lib/inventoryDisplayUi.js.map +7 -0
  234. package/dist/modules/wms/lib/inventoryIdempotency.js +37 -0
  235. package/dist/modules/wms/lib/inventoryIdempotency.js.map +7 -0
  236. package/dist/modules/wms/lib/inventoryImportCsv.js +173 -0
  237. package/dist/modules/wms/lib/inventoryImportCsv.js.map +7 -0
  238. package/dist/modules/wms/lib/inventoryImportService.js +468 -0
  239. package/dist/modules/wms/lib/inventoryImportService.js.map +7 -0
  240. package/dist/modules/wms/lib/inventoryMutationUi.js +25 -0
  241. package/dist/modules/wms/lib/inventoryMutationUi.js.map +7 -0
  242. package/dist/modules/wms/lib/inventoryPolicy.js +61 -0
  243. package/dist/modules/wms/lib/inventoryPolicy.js.map +7 -0
  244. package/dist/modules/wms/lib/inventoryReconciliation.js +193 -0
  245. package/dist/modules/wms/lib/inventoryReconciliation.js.map +7 -0
  246. package/dist/modules/wms/lib/inventoryTrackingValidation.js +13 -0
  247. package/dist/modules/wms/lib/inventoryTrackingValidation.js.map +7 -0
  248. package/dist/modules/wms/lib/loadOperationalDashboard.js +580 -0
  249. package/dist/modules/wms/lib/loadOperationalDashboard.js.map +7 -0
  250. package/dist/modules/wms/lib/lowStockBalanceFilter.js +49 -0
  251. package/dist/modules/wms/lib/lowStockBalanceFilter.js.map +7 -0
  252. package/dist/modules/wms/lib/primaryWarehousePolicy.js +32 -0
  253. package/dist/modules/wms/lib/primaryWarehousePolicy.js.map +7 -0
  254. package/dist/modules/wms/lib/roleFeatures.js +30 -0
  255. package/dist/modules/wms/lib/roleFeatures.js.map +7 -0
  256. package/dist/modules/wms/lib/salesOrderInventoryAutomation.js +291 -0
  257. package/dist/modules/wms/lib/salesOrderInventoryAutomation.js.map +7 -0
  258. package/dist/modules/wms/lib/salesOrderWarehouseAssignment.js +54 -0
  259. package/dist/modules/wms/lib/salesOrderWarehouseAssignment.js.map +7 -0
  260. package/dist/modules/wms/lib/wmsIntegrationToggles.js +71 -0
  261. package/dist/modules/wms/lib/wmsIntegrationToggles.js.map +7 -0
  262. package/dist/modules/wms/migrations/Migration20260428110546.js +78 -0
  263. package/dist/modules/wms/migrations/Migration20260428110546.js.map +7 -0
  264. package/dist/modules/wms/migrations/Migration20260527120000.js +15 -0
  265. package/dist/modules/wms/migrations/Migration20260527120000.js.map +7 -0
  266. package/dist/modules/wms/migrations/Migration20260527140000.js +37 -0
  267. package/dist/modules/wms/migrations/Migration20260527140000.js.map +7 -0
  268. package/dist/modules/wms/migrations/Migration20260613120000.js +23 -0
  269. package/dist/modules/wms/migrations/Migration20260613120000.js.map +7 -0
  270. package/dist/modules/wms/migrations/Migration20260616090000.js +13 -0
  271. package/dist/modules/wms/migrations/Migration20260616090000.js.map +7 -0
  272. package/dist/modules/wms/migrations/Migration20260707180000.js +15 -0
  273. package/dist/modules/wms/migrations/Migration20260707180000.js.map +7 -0
  274. package/dist/modules/wms/notifications.client.js +18 -0
  275. package/dist/modules/wms/notifications.client.js.map +7 -0
  276. package/dist/modules/wms/notifications.js +53 -0
  277. package/dist/modules/wms/notifications.js.map +7 -0
  278. package/dist/modules/wms/search.js +196 -0
  279. package/dist/modules/wms/search.js.map +7 -0
  280. package/dist/modules/wms/setup.js +30 -0
  281. package/dist/modules/wms/setup.js.map +7 -0
  282. package/dist/modules/wms/subscribers/low-stock-notification.js +40 -0
  283. package/dist/modules/wms/subscribers/low-stock-notification.js.map +7 -0
  284. package/dist/modules/wms/subscribers/reservation-shortfall-notification.js +69 -0
  285. package/dist/modules/wms/subscribers/reservation-shortfall-notification.js.map +7 -0
  286. package/dist/modules/wms/subscribers/sales-order-cancelled-release.js +14 -0
  287. package/dist/modules/wms/subscribers/sales-order-cancelled-release.js.map +7 -0
  288. package/dist/modules/wms/subscribers/sales-order-confirmed-reserve.js +14 -0
  289. package/dist/modules/wms/subscribers/sales-order-confirmed-reserve.js.map +7 -0
  290. package/dist/modules/wms/translations.js +10 -0
  291. package/dist/modules/wms/translations.js.map +7 -0
  292. package/dist/modules/wms/vector.js +9 -0
  293. package/dist/modules/wms/vector.js.map +7 -0
  294. package/dist/modules/wms/widgets/injection/catalog-inventory-profile/widget.js +200 -0
  295. package/dist/modules/wms/widgets/injection/catalog-inventory-profile/widget.js.map +7 -0
  296. package/dist/modules/wms/widgets/injection/order-items-stock-column/widget.js +104 -0
  297. package/dist/modules/wms/widgets/injection/order-items-stock-column/widget.js.map +7 -0
  298. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js +389 -0
  299. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js.map +7 -0
  300. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.js +16 -0
  301. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.js.map +7 -0
  302. package/dist/modules/wms/widgets/injection-table.js +36 -0
  303. package/dist/modules/wms/widgets/injection-table.js.map +7 -0
  304. package/dist/modules/wms/widgets/notifications/WmsLowStockRenderer.js +150 -0
  305. package/dist/modules/wms/widgets/notifications/WmsLowStockRenderer.js.map +7 -0
  306. package/dist/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.js +186 -0
  307. package/dist/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.js.map +7 -0
  308. package/dist/modules/wms/widgets/notifications/index.js +7 -0
  309. package/dist/modules/wms/widgets/notifications/index.js.map +7 -0
  310. package/generated/entities/inventory_balance/index.ts +9 -0
  311. package/generated/entities/inventory_lot/index.ts +8 -0
  312. package/generated/entities/inventory_movement/index.ts +16 -0
  313. package/generated/entities/inventory_reservation/index.ts +10 -0
  314. package/generated/entities/product_inventory_profile/index.ts +9 -0
  315. package/generated/entities/sales_order_warehouse_assignment/index.ts +4 -0
  316. package/generated/entities/warehouse/index.ts +11 -0
  317. package/generated/entities/warehouse_location/index.ts +9 -0
  318. package/generated/entities/warehouse_zone/index.ts +4 -0
  319. package/generated/entities.ids.generated.ts +12 -0
  320. package/generated/entity-fields-registry.ts +98 -0
  321. package/package.json +7 -7
  322. package/src/modules/auth/backend/roles/page.tsx +13 -4
  323. package/src/modules/auth/i18n/de.json +2 -0
  324. package/src/modules/auth/i18n/en.json +2 -0
  325. package/src/modules/auth/i18n/es.json +2 -0
  326. package/src/modules/auth/i18n/pl.json +2 -0
  327. package/src/modules/auth/lib/backendChrome.tsx +1 -0
  328. package/src/modules/auth/services/rbacService.ts +25 -21
  329. package/src/modules/catalog/api/products/route.ts +3 -0
  330. package/src/modules/catalog/api/variants/route.ts +3 -0
  331. package/src/modules/query_index/lib/engine.ts +18 -6
  332. package/src/modules/sales/api/documents/factory.ts +1 -0
  333. package/src/modules/sales/commands/documents.ts +71 -0
  334. package/src/modules/sales/components/documents/ItemsSection.tsx +58 -0
  335. package/src/modules/sales/events.ts +2 -0
  336. package/src/modules/sales/widgets/injection/order-items-context.ts +15 -0
  337. package/src/modules/wms/acl.ts +14 -0
  338. package/src/modules/wms/analytics.ts +9 -0
  339. package/src/modules/wms/api/dashboard/operational/route.ts +83 -0
  340. package/src/modules/wms/api/interceptors.ts +108 -0
  341. package/src/modules/wms/api/inventory/adjust/route.ts +50 -0
  342. package/src/modules/wms/api/inventory/allocate/route.ts +50 -0
  343. package/src/modules/wms/api/inventory/balances/route.ts +178 -0
  344. package/src/modules/wms/api/inventory/cycle-count/route.ts +51 -0
  345. package/src/modules/wms/api/inventory/helpers.ts +128 -0
  346. package/src/modules/wms/api/inventory/import/apply/route.ts +47 -0
  347. package/src/modules/wms/api/inventory/import/helpers.ts +223 -0
  348. package/src/modules/wms/api/inventory/import/template/route.ts +31 -0
  349. package/src/modules/wms/api/inventory/import/validate/route.ts +56 -0
  350. package/src/modules/wms/api/inventory/move/route.ts +50 -0
  351. package/src/modules/wms/api/inventory/movements/route.ts +164 -0
  352. package/src/modules/wms/api/inventory/receive/route.ts +49 -0
  353. package/src/modules/wms/api/inventory/release/route.ts +43 -0
  354. package/src/modules/wms/api/inventory/reservations/route.ts +128 -0
  355. package/src/modules/wms/api/inventory/reserve/route.ts +59 -0
  356. package/src/modules/wms/api/inventory-profiles/route.ts +177 -0
  357. package/src/modules/wms/api/listEnrichers.ts +312 -0
  358. package/src/modules/wms/api/listSearch.ts +121 -0
  359. package/src/modules/wms/api/locations/route.ts +171 -0
  360. package/src/modules/wms/api/lots/route.ts +205 -0
  361. package/src/modules/wms/api/openapi.ts +28 -0
  362. package/src/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.ts +58 -0
  363. package/src/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.ts +306 -0
  364. package/src/modules/wms/api/sales-orders/assign-warehouse/route.ts +57 -0
  365. package/src/modules/wms/api/sales-orders/unassign-warehouse/route.ts +43 -0
  366. package/src/modules/wms/api/warehouses/route.ts +181 -0
  367. package/src/modules/wms/api/zones/route.ts +158 -0
  368. package/src/modules/wms/backend/config/wms/page.meta.ts +14 -0
  369. package/src/modules/wms/backend/config/wms/page.tsx +5 -0
  370. package/src/modules/wms/backend/page.meta.ts +12 -0
  371. package/src/modules/wms/backend/page.tsx +5 -0
  372. package/src/modules/wms/backend/wms/inventory/page.meta.ts +14 -0
  373. package/src/modules/wms/backend/wms/inventory/page.tsx +5 -0
  374. package/src/modules/wms/backend/wms/location/[id]/page.meta.ts +14 -0
  375. package/src/modules/wms/backend/wms/location/[id]/page.tsx +5 -0
  376. package/src/modules/wms/backend/wms/locations/page.meta.ts +14 -0
  377. package/src/modules/wms/backend/wms/locations/page.tsx +12 -0
  378. package/src/modules/wms/backend/wms/lot/[id]/page.meta.ts +14 -0
  379. package/src/modules/wms/backend/wms/lot/[id]/page.tsx +5 -0
  380. package/src/modules/wms/backend/wms/lots/page.meta.ts +14 -0
  381. package/src/modules/wms/backend/wms/lots/page.tsx +5 -0
  382. package/src/modules/wms/backend/wms/movements/page.meta.ts +14 -0
  383. package/src/modules/wms/backend/wms/movements/page.tsx +23 -0
  384. package/src/modules/wms/backend/wms/reservations/page.meta.ts +14 -0
  385. package/src/modules/wms/backend/wms/reservations/page.tsx +24 -0
  386. package/src/modules/wms/backend/wms/sku/[id]/page.meta.ts +14 -0
  387. package/src/modules/wms/backend/wms/sku/[id]/page.tsx +5 -0
  388. package/src/modules/wms/backend/wms/warehouses/page.meta.ts +14 -0
  389. package/src/modules/wms/backend/wms/warehouses/page.tsx +12 -0
  390. package/src/modules/wms/backend/wms/zones/page.meta.ts +14 -0
  391. package/src/modules/wms/backend/wms/zones/page.tsx +12 -0
  392. package/src/modules/wms/ce.ts +76 -0
  393. package/src/modules/wms/cli.ts +96 -0
  394. package/src/modules/wms/commands/configuration.ts +1844 -0
  395. package/src/modules/wms/commands/index.ts +3 -0
  396. package/src/modules/wms/commands/inventory-actions.ts +1866 -0
  397. package/src/modules/wms/commands/sales-order-assignment.ts +346 -0
  398. package/src/modules/wms/commands/shared.ts +90 -0
  399. package/src/modules/wms/components/backend/AdjustInventoryDialog.tsx +820 -0
  400. package/src/modules/wms/components/backend/ChangeLotStatusDialog.tsx +312 -0
  401. package/src/modules/wms/components/backend/CycleCountWizardDialog.tsx +2007 -0
  402. package/src/modules/wms/components/backend/ImportInventoryDialog.tsx +1018 -0
  403. package/src/modules/wms/components/backend/InventoryOperationsSection.tsx +159 -0
  404. package/src/modules/wms/components/backend/LocationEditDialog.tsx +185 -0
  405. package/src/modules/wms/components/backend/MoveInventoryDialog.tsx +907 -0
  406. package/src/modules/wms/components/backend/ReceiveInventoryDialog.tsx +695 -0
  407. package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +424 -0
  408. package/src/modules/wms/components/backend/ReserveInventoryDialog.tsx +511 -0
  409. package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +1340 -0
  410. package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +1132 -0
  411. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +1310 -0
  412. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +1355 -0
  413. package/src/modules/wms/components/backend/WmsLotsListPage.tsx +359 -0
  414. package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +958 -0
  415. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +1245 -0
  416. package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +960 -0
  417. package/src/modules/wms/components/backend/useWmsInventoryMutationAccess.ts +89 -0
  418. package/src/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.ts +32 -0
  419. package/src/modules/wms/components/backend/wmsLookupLoaders.ts +78 -0
  420. package/src/modules/wms/data/enrichers.ts +718 -0
  421. package/src/modules/wms/data/entities.ts +436 -0
  422. package/src/modules/wms/data/validators.ts +463 -0
  423. package/src/modules/wms/di.ts +25 -0
  424. package/src/modules/wms/events.ts +41 -0
  425. package/src/modules/wms/i18n/de.json +1051 -0
  426. package/src/modules/wms/i18n/en.json +1051 -0
  427. package/src/modules/wms/i18n/es.json +1051 -0
  428. package/src/modules/wms/i18n/pl.json +1051 -0
  429. package/src/modules/wms/index.ts +15 -0
  430. package/src/modules/wms/lib/catalogInventoryProfileIntent.ts +65 -0
  431. package/src/modules/wms/lib/catalogInventoryProfileSync.ts +199 -0
  432. package/src/modules/wms/lib/expiry.ts +30 -0
  433. package/src/modules/wms/lib/flashMutationError.ts +74 -0
  434. package/src/modules/wms/lib/inventoryDisplayUi.ts +249 -0
  435. package/src/modules/wms/lib/inventoryIdempotency.ts +54 -0
  436. package/src/modules/wms/lib/inventoryImportCsv.ts +212 -0
  437. package/src/modules/wms/lib/inventoryImportService.ts +629 -0
  438. package/src/modules/wms/lib/inventoryMutationUi.ts +21 -0
  439. package/src/modules/wms/lib/inventoryPolicy.ts +111 -0
  440. package/src/modules/wms/lib/inventoryReconciliation.ts +263 -0
  441. package/src/modules/wms/lib/inventoryTrackingValidation.ts +23 -0
  442. package/src/modules/wms/lib/loadOperationalDashboard.ts +776 -0
  443. package/src/modules/wms/lib/lowStockBalanceFilter.ts +74 -0
  444. package/src/modules/wms/lib/primaryWarehousePolicy.ts +46 -0
  445. package/src/modules/wms/lib/roleFeatures.ts +32 -0
  446. package/src/modules/wms/lib/salesOrderInventoryAutomation.ts +390 -0
  447. package/src/modules/wms/lib/salesOrderWarehouseAssignment.ts +78 -0
  448. package/src/modules/wms/lib/wmsIntegrationToggles.ts +81 -0
  449. package/src/modules/wms/migrations/.snapshot-open-mercato.json +2880 -0
  450. package/src/modules/wms/migrations/Migration20260428110546.ts +91 -0
  451. package/src/modules/wms/migrations/Migration20260527120000.ts +15 -0
  452. package/src/modules/wms/migrations/Migration20260527140000.ts +35 -0
  453. package/src/modules/wms/migrations/Migration20260613120000.ts +21 -0
  454. package/src/modules/wms/migrations/Migration20260616090000.ts +11 -0
  455. package/src/modules/wms/migrations/Migration20260707180000.ts +13 -0
  456. package/src/modules/wms/notifications.client.ts +18 -0
  457. package/src/modules/wms/notifications.ts +51 -0
  458. package/src/modules/wms/search.ts +230 -0
  459. package/src/modules/wms/setup.ts +29 -0
  460. package/src/modules/wms/subscribers/low-stock-notification.ts +54 -0
  461. package/src/modules/wms/subscribers/reservation-shortfall-notification.ts +98 -0
  462. package/src/modules/wms/subscribers/sales-order-cancelled-release.ts +21 -0
  463. package/src/modules/wms/subscribers/sales-order-confirmed-reserve.ts +21 -0
  464. package/src/modules/wms/translations.ts +6 -0
  465. package/src/modules/wms/vector.ts +7 -0
  466. package/src/modules/wms/widgets/injection/catalog-inventory-profile/widget.ts +238 -0
  467. package/src/modules/wms/widgets/injection/order-items-stock-column/widget.tsx +153 -0
  468. package/src/modules/wms/widgets/injection/sales-order-stock-context/widget.client.tsx +476 -0
  469. package/src/modules/wms/widgets/injection/sales-order-stock-context/widget.ts +15 -0
  470. package/src/modules/wms/widgets/injection-table.ts +34 -0
  471. package/src/modules/wms/widgets/notifications/WmsLowStockRenderer.tsx +153 -0
  472. package/src/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.tsx +194 -0
  473. package/src/modules/wms/widgets/notifications/index.ts +2 -0
@@ -0,0 +1,501 @@
1
+ import { findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
2
+ import { E } from "../../../generated/entities.ids.generated.js";
3
+ import { InventoryBalance, InventoryReservation, ProductInventoryProfile, SalesOrderWarehouseAssignment, Warehouse } from "./entities.js";
4
+ import { resolvePrimaryWarehouseId } from "../lib/primaryWarehousePolicy.js";
5
+ import { resolveWmsIntegrationToggleEnabled } from "../lib/wmsIntegrationToggles.js";
6
+ const EMPTY_ENRICHMENT = {
7
+ _wms: {
8
+ assignedWarehouseId: null,
9
+ assignedWarehouseName: null,
10
+ isExplicitlyAssigned: false,
11
+ stockSummary: [],
12
+ reservationSummary: {
13
+ status: "unreserved",
14
+ reservationIds: []
15
+ }
16
+ }
17
+ };
18
+ const EMPTY_CATALOG_ENRICHMENT = {
19
+ _wms: {
20
+ inventoryProfile: null,
21
+ stockSummary: [],
22
+ reorderStatus: {
23
+ state: "no_profile",
24
+ available: "0",
25
+ reorderPoint: "0",
26
+ safetyStock: "0"
27
+ }
28
+ }
29
+ };
30
+ function extractRecordId(record) {
31
+ return typeof record.id === "string" && record.id.trim().length > 0 ? record.id : null;
32
+ }
33
+ function extractOrderIdFromLine(line) {
34
+ return typeof line.order_id === "string" && line.order_id.length > 0 ? line.order_id : null;
35
+ }
36
+ function extractProductIdFromVariant(variant) {
37
+ return typeof variant.product_id === "string" && variant.product_id.length > 0 ? variant.product_id : null;
38
+ }
39
+ function extractWarehouseId(reservation) {
40
+ const relation = reservation.warehouse;
41
+ return typeof relation?.id === "string" ? relation.id : null;
42
+ }
43
+ function addToMap(map, key, value) {
44
+ const numeric = typeof value === "number" ? value : Number(value ?? 0);
45
+ map.set(key, (map.get(key) ?? 0) + numeric);
46
+ }
47
+ function formatQuantity(value) {
48
+ if (!Number.isFinite(value) || value === 0) return "0";
49
+ const normalized = value.toFixed(4).replace(/\.?0+$/, "");
50
+ return normalized.length > 0 ? normalized : "0";
51
+ }
52
+ function toInventoryProfileSummary(profile) {
53
+ return {
54
+ profileId: profile.id,
55
+ catalogProductId: profile.catalogProductId,
56
+ catalogVariantId: profile.catalogVariantId ?? null,
57
+ defaultUom: profile.defaultUom,
58
+ defaultStrategy: profile.defaultStrategy,
59
+ trackLot: profile.trackLot,
60
+ trackSerial: profile.trackSerial,
61
+ trackExpiration: profile.trackExpiration,
62
+ reorderPoint: profile.reorderPoint,
63
+ safetyStock: profile.safetyStock
64
+ };
65
+ }
66
+ function resolveReservationStatus(requiredQuantity, reservedQuantity) {
67
+ if (requiredQuantity <= 0 || reservedQuantity <= 0) return "unreserved";
68
+ if (reservedQuantity + 1e-4 < requiredQuantity) return "partially_reserved";
69
+ return "fully_reserved";
70
+ }
71
+ function resolveReorderStatus(availableQuantity, profile) {
72
+ if (!profile) {
73
+ return {
74
+ state: "no_profile",
75
+ available: formatQuantity(availableQuantity),
76
+ reorderPoint: "0",
77
+ safetyStock: "0"
78
+ };
79
+ }
80
+ const reorderPoint = Number(profile.reorderPoint);
81
+ const safetyStock = Number(profile.safetyStock);
82
+ let state = "healthy";
83
+ if (availableQuantity <= safetyStock) {
84
+ state = "below_safety_stock";
85
+ } else if (availableQuantity <= reorderPoint) {
86
+ state = "below_reorder_point";
87
+ }
88
+ return {
89
+ state,
90
+ available: formatQuantity(availableQuantity),
91
+ reorderPoint: profile.reorderPoint,
92
+ safetyStock: profile.safetyStock
93
+ };
94
+ }
95
+ function buildBalanceSummaryByVariant(balances) {
96
+ const byVariant = /* @__PURE__ */ new Map();
97
+ for (const balance of balances) {
98
+ const current = byVariant.get(balance.catalogVariantId) ?? {
99
+ onHand: 0,
100
+ reserved: 0,
101
+ allocated: 0,
102
+ available: 0
103
+ };
104
+ current.onHand += Number(balance.quantityOnHand);
105
+ current.reserved += Number(balance.quantityReserved);
106
+ current.allocated += Number(balance.quantityAllocated);
107
+ current.available += Number(balance.quantityOnHand) - Number(balance.quantityReserved) - Number(balance.quantityAllocated);
108
+ byVariant.set(balance.catalogVariantId, current);
109
+ }
110
+ return byVariant;
111
+ }
112
+ function buildStockSummaryItem(catalogVariantId, aggregate) {
113
+ return {
114
+ catalogVariantId,
115
+ onHand: formatQuantity(aggregate?.onHand ?? 0),
116
+ reserved: formatQuantity(aggregate?.reserved ?? 0),
117
+ allocated: formatQuantity(aggregate?.allocated ?? 0),
118
+ available: formatQuantity(aggregate?.available ?? 0)
119
+ };
120
+ }
121
+ async function isSalesOrderInventoryEnabled(context) {
122
+ const container = context.container;
123
+ if (!container?.resolve) return true;
124
+ try {
125
+ const featureTogglesService = container.resolve("featureTogglesService");
126
+ const em = container.resolve("em");
127
+ if (!featureTogglesService || !em) return true;
128
+ return resolveWmsIntegrationToggleEnabled(
129
+ featureTogglesService,
130
+ em,
131
+ "wms_integration_sales_order_inventory",
132
+ context.tenantId
133
+ );
134
+ } catch {
135
+ return true;
136
+ }
137
+ }
138
+ async function loadExplicitAssignments(em, orderIds, scope) {
139
+ if (orderIds.length === 0) return [];
140
+ return findWithDecryption(
141
+ em,
142
+ SalesOrderWarehouseAssignment,
143
+ {
144
+ salesOrderId: { $in: orderIds },
145
+ organizationId: scope.organizationId,
146
+ tenantId: scope.tenantId,
147
+ deletedAt: null
148
+ },
149
+ void 0,
150
+ scope
151
+ );
152
+ }
153
+ async function loadWarehousesByIds(em, warehouseIds, scope) {
154
+ if (warehouseIds.length === 0) return [];
155
+ return findWithDecryption(
156
+ em,
157
+ Warehouse,
158
+ {
159
+ id: { $in: warehouseIds },
160
+ organizationId: scope.organizationId,
161
+ tenantId: scope.tenantId,
162
+ deletedAt: null
163
+ },
164
+ void 0,
165
+ scope
166
+ );
167
+ }
168
+ async function loadOrderLines(context, orderIds, scope) {
169
+ if (orderIds.length === 0) return [];
170
+ const container = context.container;
171
+ const queryEngine = container.resolve("queryEngine");
172
+ const result = await queryEngine.query(E.sales.sales_order_line, {
173
+ tenantId: scope.tenantId,
174
+ organizationId: scope.organizationId,
175
+ filters: { order_id: { $in: orderIds } },
176
+ fields: ["id", "order_id", "product_variant_id", "quantity", "line_number", "status"],
177
+ sort: [{ field: "line_number", dir: "asc" }],
178
+ page: { page: 1, pageSize: 5e3 }
179
+ });
180
+ return result.items;
181
+ }
182
+ async function loadReservations(em, orderIds, scope) {
183
+ if (orderIds.length === 0) return [];
184
+ return findWithDecryption(
185
+ em,
186
+ InventoryReservation,
187
+ {
188
+ sourceType: "order",
189
+ sourceId: { $in: orderIds },
190
+ organizationId: scope.organizationId,
191
+ tenantId: scope.tenantId,
192
+ deletedAt: null
193
+ },
194
+ { orderBy: { createdAt: "asc" } },
195
+ scope
196
+ );
197
+ }
198
+ async function loadBalances(em, variantIds, scope) {
199
+ if (variantIds.length === 0) return [];
200
+ return findWithDecryption(
201
+ em,
202
+ InventoryBalance,
203
+ {
204
+ catalogVariantId: { $in: variantIds },
205
+ organizationId: scope.organizationId,
206
+ tenantId: scope.tenantId,
207
+ deletedAt: null
208
+ },
209
+ void 0,
210
+ scope
211
+ );
212
+ }
213
+ async function loadCatalogVariants(context, productIds, scope) {
214
+ if (productIds.length === 0) return [];
215
+ const container = context.container;
216
+ const queryEngine = container.resolve("queryEngine");
217
+ const result = await queryEngine.query(E.catalog.catalog_product_variant, {
218
+ tenantId: scope.tenantId,
219
+ organizationId: scope.organizationId,
220
+ filters: { product_id: { $in: productIds } },
221
+ fields: ["id", "product_id"],
222
+ sort: [{ field: "created_at", dir: "asc" }],
223
+ page: { page: 1, pageSize: 5e3 }
224
+ });
225
+ return result.items;
226
+ }
227
+ async function loadProductInventoryProfiles(em, productIds, scope) {
228
+ if (productIds.length === 0) return [];
229
+ return findWithDecryption(
230
+ em,
231
+ ProductInventoryProfile,
232
+ {
233
+ catalogProductId: { $in: productIds },
234
+ catalogVariantId: null,
235
+ organizationId: scope.organizationId,
236
+ tenantId: scope.tenantId,
237
+ deletedAt: null
238
+ },
239
+ void 0,
240
+ scope
241
+ );
242
+ }
243
+ async function loadVariantInventoryProfiles(em, variantIds, scope) {
244
+ if (variantIds.length === 0) return [];
245
+ return findWithDecryption(
246
+ em,
247
+ ProductInventoryProfile,
248
+ {
249
+ catalogVariantId: { $in: variantIds },
250
+ organizationId: scope.organizationId,
251
+ tenantId: scope.tenantId,
252
+ deletedAt: null
253
+ },
254
+ void 0,
255
+ scope
256
+ );
257
+ }
258
+ const salesOrderInventoryEnricher = {
259
+ id: "wms.sales-order-inventory",
260
+ targetEntity: E.sales.sales_order,
261
+ features: ["wms.view"],
262
+ priority: 40,
263
+ timeout: 2e3,
264
+ fallback: EMPTY_ENRICHMENT,
265
+ async enrichOne(record, context) {
266
+ return (await this.enrichMany([record], context))[0];
267
+ },
268
+ async enrichMany(records, context) {
269
+ if (records.length === 0) return records;
270
+ const enabled = await isSalesOrderInventoryEnabled(context);
271
+ if (!enabled) return records;
272
+ const orderIds = records.map(extractRecordId).filter((value) => Boolean(value));
273
+ if (orderIds.length === 0) {
274
+ return records.map((record) => ({ ...record, ...EMPTY_ENRICHMENT }));
275
+ }
276
+ const em = context.em.fork();
277
+ const scope = { organizationId: context.organizationId, tenantId: context.tenantId };
278
+ const lines = await loadOrderLines(context, orderIds, scope);
279
+ const variantIds = Array.from(
280
+ new Set(
281
+ lines.map((line) => line.product_variant_id).filter((value) => typeof value === "string" && value.length > 0)
282
+ )
283
+ );
284
+ const [reservations, balances, primaryWarehouseId, explicitAssignments] = await Promise.all([
285
+ loadReservations(em, orderIds, scope),
286
+ loadBalances(em, variantIds, scope),
287
+ resolvePrimaryWarehouseId(em, scope),
288
+ loadExplicitAssignments(em, orderIds, scope)
289
+ ]);
290
+ const explicitWarehouseIdsByOrder = /* @__PURE__ */ new Map();
291
+ for (const assignment of explicitAssignments) {
292
+ const warehouseRel = assignment.warehouse;
293
+ const warehouseId = warehouseRel?.id;
294
+ if (warehouseId) {
295
+ explicitWarehouseIdsByOrder.set(assignment.salesOrderId, warehouseId);
296
+ }
297
+ }
298
+ const reservationWarehouseIds = reservations.map(extractWarehouseId).filter((value) => typeof value === "string" && value.length > 0);
299
+ const allRelevantWarehouseIds = Array.from(
300
+ /* @__PURE__ */ new Set([
301
+ ...Array.from(explicitWarehouseIdsByOrder.values()),
302
+ ...reservationWarehouseIds,
303
+ ...primaryWarehouseId ? [primaryWarehouseId] : []
304
+ ])
305
+ );
306
+ const warehouses = await loadWarehousesByIds(em, allRelevantWarehouseIds, scope);
307
+ const warehouseNamesById = new Map(warehouses.map((w) => [w.id, w.name]));
308
+ const variantAvailability = /* @__PURE__ */ new Map();
309
+ const variantReserved = /* @__PURE__ */ new Map();
310
+ for (const balance of balances) {
311
+ addToMap(
312
+ variantAvailability,
313
+ balance.catalogVariantId,
314
+ Number(balance.quantityOnHand) - Number(balance.quantityReserved) - Number(balance.quantityAllocated)
315
+ );
316
+ addToMap(variantReserved, balance.catalogVariantId, balance.quantityReserved);
317
+ }
318
+ const variantOrderBySalesOrder = /* @__PURE__ */ new Map();
319
+ const requiredBySalesOrder = /* @__PURE__ */ new Map();
320
+ for (const line of lines) {
321
+ const orderId = extractOrderIdFromLine(line);
322
+ const variantId = line.product_variant_id ?? null;
323
+ if (!orderId || !variantId) continue;
324
+ const variantOrder = variantOrderBySalesOrder.get(orderId) ?? [];
325
+ if (!variantOrder.includes(variantId)) {
326
+ variantOrder.push(variantId);
327
+ variantOrderBySalesOrder.set(orderId, variantOrder);
328
+ }
329
+ requiredBySalesOrder.set(orderId, (requiredBySalesOrder.get(orderId) ?? 0) + Number(line.quantity));
330
+ }
331
+ const activeReservationsBySalesOrder = /* @__PURE__ */ new Map();
332
+ const reservedBySalesOrder = /* @__PURE__ */ new Map();
333
+ for (const reservation of reservations) {
334
+ if (reservation.status !== "active") continue;
335
+ const orderId = reservation.sourceId;
336
+ const activeReservations = activeReservationsBySalesOrder.get(orderId) ?? [];
337
+ activeReservations.push(reservation);
338
+ activeReservationsBySalesOrder.set(orderId, activeReservations);
339
+ reservedBySalesOrder.set(orderId, (reservedBySalesOrder.get(orderId) ?? 0) + Number(reservation.quantity));
340
+ }
341
+ return records.map((record) => {
342
+ const orderId = extractRecordId(record);
343
+ if (!orderId) {
344
+ return { ...record, ...EMPTY_ENRICHMENT };
345
+ }
346
+ const reservationsForOrder = activeReservationsBySalesOrder.get(orderId) ?? [];
347
+ const warehouseIds = Array.from(
348
+ new Set(
349
+ reservationsForOrder.map(extractWarehouseId).filter((value) => typeof value === "string" && value.length > 0)
350
+ )
351
+ );
352
+ const variantIdsForOrder = variantOrderBySalesOrder.get(orderId) ?? [];
353
+ const explicitWarehouseId = explicitWarehouseIdsByOrder.get(orderId) ?? null;
354
+ const isExplicitlyAssigned = explicitWarehouseId !== null;
355
+ let assignedWarehouseId;
356
+ if (isExplicitlyAssigned) {
357
+ assignedWarehouseId = explicitWarehouseId;
358
+ } else if (warehouseIds.length === 1) {
359
+ assignedWarehouseId = warehouseIds[0];
360
+ } else if (warehouseIds.length === 0 && primaryWarehouseId) {
361
+ assignedWarehouseId = primaryWarehouseId;
362
+ } else {
363
+ assignedWarehouseId = null;
364
+ }
365
+ const assignedWarehouseName = assignedWarehouseId ? warehouseNamesById.get(assignedWarehouseId) ?? null : null;
366
+ return {
367
+ ...record,
368
+ _wms: {
369
+ assignedWarehouseId,
370
+ assignedWarehouseName,
371
+ isExplicitlyAssigned,
372
+ stockSummary: variantIdsForOrder.map((catalogVariantId) => ({
373
+ catalogVariantId,
374
+ available: formatQuantity(variantAvailability.get(catalogVariantId) ?? 0),
375
+ reserved: formatQuantity(variantReserved.get(catalogVariantId) ?? 0)
376
+ })),
377
+ reservationSummary: {
378
+ status: resolveReservationStatus(
379
+ requiredBySalesOrder.get(orderId) ?? 0,
380
+ reservedBySalesOrder.get(orderId) ?? 0
381
+ ),
382
+ reservationIds: reservationsForOrder.map((reservation) => reservation.id)
383
+ }
384
+ }
385
+ };
386
+ });
387
+ }
388
+ };
389
+ const catalogProductInventoryEnricher = {
390
+ id: "wms.catalog-product-inventory",
391
+ targetEntity: E.catalog.catalog_product,
392
+ features: ["wms.view"],
393
+ priority: 40,
394
+ timeout: 2e3,
395
+ fallback: EMPTY_CATALOG_ENRICHMENT,
396
+ async enrichOne(record, context) {
397
+ return (await this.enrichMany([record], context))[0];
398
+ },
399
+ async enrichMany(records, context) {
400
+ if (records.length === 0) return records;
401
+ const productIds = records.map(extractRecordId).filter((value) => Boolean(value));
402
+ if (productIds.length === 0) {
403
+ return records.map((record) => ({ ...record, ...EMPTY_CATALOG_ENRICHMENT }));
404
+ }
405
+ const em = context.em.fork();
406
+ const scope = { organizationId: context.organizationId, tenantId: context.tenantId };
407
+ const variants = await loadCatalogVariants(context, productIds, scope);
408
+ const variantIds = variants.map((variant) => variant.id).filter((value) => typeof value === "string" && value.length > 0);
409
+ const [productProfiles, balances] = await Promise.all([
410
+ loadProductInventoryProfiles(em, productIds, scope),
411
+ loadBalances(em, variantIds, scope)
412
+ ]);
413
+ const profileByProductId = new Map(
414
+ productProfiles.map((profile) => [profile.catalogProductId, profile])
415
+ );
416
+ const balanceByVariantId = buildBalanceSummaryByVariant(balances);
417
+ const variantIdsByProductId = /* @__PURE__ */ new Map();
418
+ for (const variant of variants) {
419
+ const productId = extractProductIdFromVariant(variant);
420
+ if (!productId || typeof variant.id !== "string") continue;
421
+ const entries = variantIdsByProductId.get(productId) ?? [];
422
+ entries.push(variant.id);
423
+ variantIdsByProductId.set(productId, entries);
424
+ }
425
+ return records.map((record) => {
426
+ const productId = extractRecordId(record);
427
+ if (!productId) {
428
+ return { ...record, ...EMPTY_CATALOG_ENRICHMENT };
429
+ }
430
+ const profile = profileByProductId.get(productId) ?? null;
431
+ const stockSummary = (variantIdsByProductId.get(productId) ?? []).map(
432
+ (variantId) => buildStockSummaryItem(variantId, balanceByVariantId.get(variantId))
433
+ );
434
+ const totalAvailable = stockSummary.reduce(
435
+ (sum, item) => sum + Number(item.available),
436
+ 0
437
+ );
438
+ return {
439
+ ...record,
440
+ _wms: {
441
+ inventoryProfile: profile ? toInventoryProfileSummary(profile) : null,
442
+ stockSummary,
443
+ reorderStatus: resolveReorderStatus(totalAvailable, profile)
444
+ }
445
+ };
446
+ });
447
+ }
448
+ };
449
+ const catalogVariantInventoryEnricher = {
450
+ id: "wms.catalog-variant-inventory",
451
+ targetEntity: E.catalog.catalog_product_variant,
452
+ features: ["wms.view"],
453
+ priority: 40,
454
+ timeout: 2e3,
455
+ fallback: EMPTY_CATALOG_ENRICHMENT,
456
+ async enrichOne(record, context) {
457
+ return (await this.enrichMany([record], context))[0];
458
+ },
459
+ async enrichMany(records, context) {
460
+ if (records.length === 0) return records;
461
+ const variantIds = records.map(extractRecordId).filter((value) => Boolean(value));
462
+ if (variantIds.length === 0) {
463
+ return records.map((record) => ({ ...record, ...EMPTY_CATALOG_ENRICHMENT }));
464
+ }
465
+ const em = context.em.fork();
466
+ const scope = { organizationId: context.organizationId, tenantId: context.tenantId };
467
+ const [profiles, balances] = await Promise.all([
468
+ loadVariantInventoryProfiles(em, variantIds, scope),
469
+ loadBalances(em, variantIds, scope)
470
+ ]);
471
+ const profileByVariantId = new Map(
472
+ profiles.filter((profile) => typeof profile.catalogVariantId === "string").map((profile) => [profile.catalogVariantId, profile])
473
+ );
474
+ const balanceByVariantId = buildBalanceSummaryByVariant(balances);
475
+ return records.map((record) => {
476
+ const variantId = extractRecordId(record);
477
+ if (!variantId) {
478
+ return { ...record, ...EMPTY_CATALOG_ENRICHMENT };
479
+ }
480
+ const profile = profileByVariantId.get(variantId) ?? null;
481
+ const stockSummary = [buildStockSummaryItem(variantId, balanceByVariantId.get(variantId))];
482
+ return {
483
+ ...record,
484
+ _wms: {
485
+ inventoryProfile: profile ? toInventoryProfileSummary(profile) : null,
486
+ stockSummary,
487
+ reorderStatus: resolveReorderStatus(Number(stockSummary[0]?.available ?? 0), profile)
488
+ }
489
+ };
490
+ });
491
+ }
492
+ };
493
+ const enrichers = [
494
+ salesOrderInventoryEnricher,
495
+ catalogProductInventoryEnricher,
496
+ catalogVariantInventoryEnricher
497
+ ];
498
+ export {
499
+ enrichers
500
+ };
501
+ //# sourceMappingURL=enrichers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/wms/data/enrichers.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { ResponseEnricher, EnricherContext } from '@open-mercato/shared/lib/crud/response-enricher'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport type { FeatureTogglesService } from '@open-mercato/core/modules/feature_toggles/lib/feature-flag-check'\nimport type { QueryEngine } from '@open-mercato/shared/lib/query/types'\nimport { E } from '#generated/entities.ids.generated'\nimport { InventoryBalance, InventoryReservation, ProductInventoryProfile, SalesOrderWarehouseAssignment, Warehouse } from './entities'\nimport { resolvePrimaryWarehouseId } from '../lib/primaryWarehousePolicy'\n\ntype SalesOrderRecord = Record<string, unknown> & { id?: string }\ntype CatalogProductRecord = Record<string, unknown> & { id?: string }\ntype CatalogVariantRecord = Record<string, unknown> & { id?: string; product_id?: string; productId?: string }\n\ntype SalesOrderLineRow = {\n id?: string\n order_id?: string | null\n product_variant_id?: string | null\n quantity?: string | number | null\n line_number?: number | null\n status?: string | null\n}\n\ntype CatalogVariantRow = {\n id?: string\n product_id?: string | null\n}\ntype ReservationStatus = 'unreserved' | 'partially_reserved' | 'fully_reserved'\ntype ReorderState = 'no_profile' | 'healthy' | 'below_reorder_point' | 'below_safety_stock'\n\ntype InventoryProfileSummary = {\n profileId: string\n catalogProductId: string\n catalogVariantId: string | null\n defaultUom: string\n defaultStrategy: string\n trackLot: boolean\n trackSerial: boolean\n trackExpiration: boolean\n reorderPoint: string\n safetyStock: string\n}\n\ntype StockSummaryItem = {\n catalogVariantId: string\n onHand: string\n reserved: string\n allocated: string\n available: string\n}\n\ntype ReorderStatus = {\n state: ReorderState\n available: string\n reorderPoint: string\n safetyStock: string\n}\n\ntype SalesOrderWmsEnrichment = {\n _wms: {\n assignedWarehouseId: string | null\n assignedWarehouseName: string | null\n isExplicitlyAssigned: boolean\n stockSummary: Array<{\n catalogVariantId: string\n available: string\n reserved: string\n }>\n reservationSummary: {\n status: ReservationStatus\n reservationIds: string[]\n }\n }\n}\n\ntype CatalogWmsEnrichment = {\n _wms: {\n inventoryProfile: InventoryProfileSummary | null\n stockSummary: StockSummaryItem[]\n reorderStatus: ReorderStatus\n }\n}\n\ntype EnricherScope = EnricherContext & { em: EntityManager }\ntype Scope = { organizationId: string; tenantId: string }\ntype BalanceAggregate = { onHand: number; reserved: number; allocated: number; available: number }\n\nimport { resolveWmsIntegrationToggleEnabled } from '../lib/wmsIntegrationToggles'\nconst EMPTY_ENRICHMENT: SalesOrderWmsEnrichment = {\n _wms: {\n assignedWarehouseId: null,\n assignedWarehouseName: null,\n isExplicitlyAssigned: false,\n stockSummary: [],\n reservationSummary: {\n status: 'unreserved',\n reservationIds: [],\n },\n },\n}\n\nconst EMPTY_CATALOG_ENRICHMENT: CatalogWmsEnrichment = {\n _wms: {\n inventoryProfile: null,\n stockSummary: [],\n reorderStatus: {\n state: 'no_profile',\n available: '0',\n reorderPoint: '0',\n safetyStock: '0',\n },\n },\n}\n\nfunction extractRecordId(record: SalesOrderRecord): string | null {\n return typeof record.id === 'string' && record.id.trim().length > 0 ? record.id : null\n}\n\nfunction extractOrderIdFromLine(line: SalesOrderLineRow): string | null {\n return typeof line.order_id === 'string' && line.order_id.length > 0 ? line.order_id : null\n}\n\nfunction extractProductIdFromVariant(variant: CatalogVariantRow): string | null {\n return typeof variant.product_id === 'string' && variant.product_id.length > 0\n ? variant.product_id\n : null\n}\n\nfunction extractWarehouseId(reservation: InventoryReservation): string | null {\n const relation = reservation.warehouse as { id?: string } | undefined\n return typeof relation?.id === 'string' ? relation.id : null\n}\n\nfunction addToMap(map: Map<string, number>, key: string, value: string | number | null | undefined) {\n const numeric = typeof value === 'number' ? value : Number(value ?? 0)\n map.set(key, (map.get(key) ?? 0) + numeric)\n}\n\nfunction formatQuantity(value: number): string {\n if (!Number.isFinite(value) || value === 0) return '0'\n const normalized = value.toFixed(4).replace(/\\.?0+$/, '')\n return normalized.length > 0 ? normalized : '0'\n}\n\nfunction toInventoryProfileSummary(profile: ProductInventoryProfile): InventoryProfileSummary {\n return {\n profileId: profile.id,\n catalogProductId: profile.catalogProductId,\n catalogVariantId: profile.catalogVariantId ?? null,\n defaultUom: profile.defaultUom,\n defaultStrategy: profile.defaultStrategy,\n trackLot: profile.trackLot,\n trackSerial: profile.trackSerial,\n trackExpiration: profile.trackExpiration,\n reorderPoint: profile.reorderPoint,\n safetyStock: profile.safetyStock,\n }\n}\n\nfunction resolveReservationStatus(requiredQuantity: number, reservedQuantity: number): ReservationStatus {\n if (requiredQuantity <= 0 || reservedQuantity <= 0) return 'unreserved'\n if (reservedQuantity + 0.0001 < requiredQuantity) return 'partially_reserved'\n return 'fully_reserved'\n}\n\nfunction resolveReorderStatus(\n availableQuantity: number,\n profile: ProductInventoryProfile | null | undefined,\n): ReorderStatus {\n if (!profile) {\n return {\n state: 'no_profile',\n available: formatQuantity(availableQuantity),\n reorderPoint: '0',\n safetyStock: '0',\n }\n }\n\n const reorderPoint = Number(profile.reorderPoint)\n const safetyStock = Number(profile.safetyStock)\n let state: ReorderState = 'healthy'\n\n if (availableQuantity <= safetyStock) {\n state = 'below_safety_stock'\n } else if (availableQuantity <= reorderPoint) {\n state = 'below_reorder_point'\n }\n\n return {\n state,\n available: formatQuantity(availableQuantity),\n reorderPoint: profile.reorderPoint,\n safetyStock: profile.safetyStock,\n }\n}\n\nfunction buildBalanceSummaryByVariant(\n balances: InventoryBalance[],\n): Map<string, BalanceAggregate> {\n const byVariant = new Map<string, BalanceAggregate>()\n\n for (const balance of balances) {\n const current = byVariant.get(balance.catalogVariantId) ?? {\n onHand: 0,\n reserved: 0,\n allocated: 0,\n available: 0,\n }\n\n current.onHand += Number(balance.quantityOnHand)\n current.reserved += Number(balance.quantityReserved)\n current.allocated += Number(balance.quantityAllocated)\n current.available +=\n Number(balance.quantityOnHand) - Number(balance.quantityReserved) - Number(balance.quantityAllocated)\n\n byVariant.set(balance.catalogVariantId, current)\n }\n\n return byVariant\n}\n\nfunction buildStockSummaryItem(\n catalogVariantId: string,\n aggregate: BalanceAggregate | undefined,\n): StockSummaryItem {\n return {\n catalogVariantId,\n onHand: formatQuantity(aggregate?.onHand ?? 0),\n reserved: formatQuantity(aggregate?.reserved ?? 0),\n allocated: formatQuantity(aggregate?.allocated ?? 0),\n available: formatQuantity(aggregate?.available ?? 0),\n }\n}\n\nasync function isSalesOrderInventoryEnabled(context: EnricherContext): Promise<boolean> {\n const container = context.container as { resolve?: (name: string) => unknown } | undefined\n if (!container?.resolve) return true\n try {\n const featureTogglesService = container.resolve('featureTogglesService') as FeatureTogglesService | undefined\n const em = container.resolve('em') as EntityManager | undefined\n if (!featureTogglesService || !em) return true\n return resolveWmsIntegrationToggleEnabled(\n featureTogglesService,\n em,\n 'wms_integration_sales_order_inventory',\n context.tenantId,\n )\n } catch {\n return true\n }\n}\n\nasync function loadExplicitAssignments(\n em: EntityManager,\n orderIds: string[],\n scope: Scope,\n): Promise<SalesOrderWarehouseAssignment[]> {\n if (orderIds.length === 0) return []\n return findWithDecryption(\n em,\n SalesOrderWarehouseAssignment,\n {\n salesOrderId: { $in: orderIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nasync function loadWarehousesByIds(\n em: EntityManager,\n warehouseIds: string[],\n scope: Scope,\n): Promise<Warehouse[]> {\n if (warehouseIds.length === 0) return []\n return findWithDecryption(\n em,\n Warehouse,\n {\n id: { $in: warehouseIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nasync function loadOrderLines(\n context: EnricherContext,\n orderIds: string[],\n scope: Scope,\n): Promise<SalesOrderLineRow[]> {\n if (orderIds.length === 0) return []\n // Read sales order lines via QueryEngine instead of importing the sales ORM\n // entity. Keeps the WMS module decoupled from sales internals; queryEngine\n // resolves the base table via Mikro-ORM metadata.\n const container = context.container as { resolve: (name: string) => unknown }\n const queryEngine = container.resolve('queryEngine') as QueryEngine\n const result = await queryEngine.query<SalesOrderLineRow>(E.sales.sales_order_line, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n filters: { order_id: { $in: orderIds } },\n fields: ['id', 'order_id', 'product_variant_id', 'quantity', 'line_number', 'status'],\n sort: [{ field: 'line_number', dir: 'asc' as never }],\n page: { page: 1, pageSize: 5000 },\n })\n return result.items\n}\n\nasync function loadReservations(\n em: EntityManager,\n orderIds: string[],\n scope: Scope,\n): Promise<InventoryReservation[]> {\n if (orderIds.length === 0) return []\n return findWithDecryption(\n em,\n InventoryReservation,\n {\n sourceType: 'order',\n sourceId: { $in: orderIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n { orderBy: { createdAt: 'asc' } },\n scope,\n )\n}\n\nasync function loadBalances(\n em: EntityManager,\n variantIds: string[],\n scope: Scope,\n): Promise<InventoryBalance[]> {\n if (variantIds.length === 0) return []\n return findWithDecryption(\n em,\n InventoryBalance,\n {\n catalogVariantId: { $in: variantIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nasync function loadCatalogVariants(\n context: EnricherContext,\n productIds: string[],\n scope: Scope,\n): Promise<CatalogVariantRow[]> {\n if (productIds.length === 0) return []\n const container = context.container as { resolve: (name: string) => unknown }\n const queryEngine = container.resolve('queryEngine') as QueryEngine\n const result = await queryEngine.query<CatalogVariantRow>(E.catalog.catalog_product_variant, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n filters: { product_id: { $in: productIds } },\n fields: ['id', 'product_id'],\n sort: [{ field: 'created_at', dir: 'asc' as never }],\n page: { page: 1, pageSize: 5000 },\n })\n return result.items\n}\n\nasync function loadProductInventoryProfiles(\n em: EntityManager,\n productIds: string[],\n scope: Scope,\n): Promise<ProductInventoryProfile[]> {\n if (productIds.length === 0) return []\n return findWithDecryption(\n em,\n ProductInventoryProfile,\n {\n catalogProductId: { $in: productIds },\n catalogVariantId: null,\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nasync function loadVariantInventoryProfiles(\n em: EntityManager,\n variantIds: string[],\n scope: Scope,\n): Promise<ProductInventoryProfile[]> {\n if (variantIds.length === 0) return []\n return findWithDecryption(\n em,\n ProductInventoryProfile,\n {\n catalogVariantId: { $in: variantIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nconst salesOrderInventoryEnricher: ResponseEnricher<SalesOrderRecord, SalesOrderWmsEnrichment> = {\n id: 'wms.sales-order-inventory',\n targetEntity: E.sales.sales_order,\n features: ['wms.view'],\n priority: 40,\n timeout: 2000,\n fallback: EMPTY_ENRICHMENT,\n\n async enrichOne(record, context: EnricherScope) {\n return (await this.enrichMany!([record], context))[0]\n },\n\n async enrichMany(records, context: EnricherScope) {\n if (records.length === 0) return records as Array<SalesOrderRecord & SalesOrderWmsEnrichment>\n const enabled = await isSalesOrderInventoryEnabled(context)\n if (!enabled) return records as Array<SalesOrderRecord & SalesOrderWmsEnrichment>\n\n const orderIds = records\n .map(extractRecordId)\n .filter((value): value is string => Boolean(value))\n\n if (orderIds.length === 0) {\n return records.map((record) => ({ ...record, ...EMPTY_ENRICHMENT }))\n }\n\n const em = context.em.fork()\n const scope = { organizationId: context.organizationId, tenantId: context.tenantId }\n\n const lines = await loadOrderLines(context, orderIds, scope)\n\n const variantIds = Array.from(\n new Set(\n lines\n .map((line) => line.product_variant_id)\n .filter((value): value is string => typeof value === 'string' && value.length > 0),\n ),\n )\n\n const [reservations, balances, primaryWarehouseId, explicitAssignments] = await Promise.all([\n loadReservations(em, orderIds, scope),\n loadBalances(em, variantIds, scope),\n resolvePrimaryWarehouseId(em, scope),\n loadExplicitAssignments(em, orderIds, scope),\n ])\n\n const explicitWarehouseIdsByOrder = new Map<string, string>()\n for (const assignment of explicitAssignments) {\n const warehouseRel = assignment.warehouse as { id?: string } | undefined\n const warehouseId = warehouseRel?.id\n if (warehouseId) {\n explicitWarehouseIdsByOrder.set(assignment.salesOrderId, warehouseId)\n }\n }\n\n const reservationWarehouseIds = reservations\n .map(extractWarehouseId)\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n const allRelevantWarehouseIds = Array.from(\n new Set([\n ...Array.from(explicitWarehouseIdsByOrder.values()),\n ...reservationWarehouseIds,\n ...(primaryWarehouseId ? [primaryWarehouseId] : []),\n ]),\n )\n const warehouses = await loadWarehousesByIds(em, allRelevantWarehouseIds, scope)\n const warehouseNamesById = new Map(warehouses.map((w) => [w.id, w.name]))\n\n const variantAvailability = new Map<string, number>()\n const variantReserved = new Map<string, number>()\n for (const balance of balances) {\n addToMap(\n variantAvailability,\n balance.catalogVariantId,\n Number(balance.quantityOnHand) - Number(balance.quantityReserved) - Number(balance.quantityAllocated),\n )\n addToMap(variantReserved, balance.catalogVariantId, balance.quantityReserved)\n }\n\n const variantOrderBySalesOrder = new Map<string, string[]>()\n const requiredBySalesOrder = new Map<string, number>()\n\n for (const line of lines) {\n const orderId = extractOrderIdFromLine(line)\n const variantId = line.product_variant_id ?? null\n if (!orderId || !variantId) continue\n\n const variantOrder = variantOrderBySalesOrder.get(orderId) ?? []\n if (!variantOrder.includes(variantId)) {\n variantOrder.push(variantId)\n variantOrderBySalesOrder.set(orderId, variantOrder)\n }\n requiredBySalesOrder.set(orderId, (requiredBySalesOrder.get(orderId) ?? 0) + Number(line.quantity))\n }\n\n const activeReservationsBySalesOrder = new Map<string, InventoryReservation[]>()\n const reservedBySalesOrder = new Map<string, number>()\n\n for (const reservation of reservations) {\n if (reservation.status !== 'active') continue\n const orderId = reservation.sourceId\n const activeReservations = activeReservationsBySalesOrder.get(orderId) ?? []\n activeReservations.push(reservation)\n activeReservationsBySalesOrder.set(orderId, activeReservations)\n reservedBySalesOrder.set(orderId, (reservedBySalesOrder.get(orderId) ?? 0) + Number(reservation.quantity))\n }\n\n return records.map((record) => {\n const orderId = extractRecordId(record)\n if (!orderId) {\n return { ...record, ...EMPTY_ENRICHMENT }\n }\n\n const reservationsForOrder = activeReservationsBySalesOrder.get(orderId) ?? []\n const warehouseIds = Array.from(\n new Set(\n reservationsForOrder\n .map(extractWarehouseId)\n .filter((value): value is string => typeof value === 'string' && value.length > 0),\n ),\n )\n const variantIdsForOrder = variantOrderBySalesOrder.get(orderId) ?? []\n\n const explicitWarehouseId = explicitWarehouseIdsByOrder.get(orderId) ?? null\n const isExplicitlyAssigned = explicitWarehouseId !== null\n\n let assignedWarehouseId: string | null\n if (isExplicitlyAssigned) {\n assignedWarehouseId = explicitWarehouseId\n } else if (warehouseIds.length === 1) {\n assignedWarehouseId = warehouseIds[0]\n } else if (warehouseIds.length === 0 && primaryWarehouseId) {\n assignedWarehouseId = primaryWarehouseId\n } else {\n assignedWarehouseId = null\n }\n\n const assignedWarehouseName = assignedWarehouseId\n ? (warehouseNamesById.get(assignedWarehouseId) ?? null)\n : null\n\n return {\n ...record,\n _wms: {\n assignedWarehouseId,\n assignedWarehouseName,\n isExplicitlyAssigned,\n stockSummary: variantIdsForOrder.map((catalogVariantId) => ({\n catalogVariantId,\n available: formatQuantity(variantAvailability.get(catalogVariantId) ?? 0),\n reserved: formatQuantity(variantReserved.get(catalogVariantId) ?? 0),\n })),\n reservationSummary: {\n status: resolveReservationStatus(\n requiredBySalesOrder.get(orderId) ?? 0,\n reservedBySalesOrder.get(orderId) ?? 0,\n ),\n reservationIds: reservationsForOrder.map((reservation) => reservation.id),\n },\n },\n }\n })\n },\n}\n\nconst catalogProductInventoryEnricher: ResponseEnricher<CatalogProductRecord, CatalogWmsEnrichment> = {\n id: 'wms.catalog-product-inventory',\n targetEntity: E.catalog.catalog_product,\n features: ['wms.view'],\n priority: 40,\n timeout: 2000,\n fallback: EMPTY_CATALOG_ENRICHMENT,\n\n async enrichOne(record, context: EnricherScope) {\n return (await this.enrichMany!([record], context))[0]\n },\n\n async enrichMany(records, context: EnricherScope) {\n if (records.length === 0) return records as Array<CatalogProductRecord & CatalogWmsEnrichment>\n\n const productIds = records\n .map(extractRecordId)\n .filter((value): value is string => Boolean(value))\n\n if (productIds.length === 0) {\n return records.map((record) => ({ ...record, ...EMPTY_CATALOG_ENRICHMENT }))\n }\n\n const em = context.em.fork()\n const scope = { organizationId: context.organizationId, tenantId: context.tenantId }\n\n const variants = await loadCatalogVariants(context, productIds, scope)\n const variantIds = variants\n .map((variant) => variant.id)\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n const [productProfiles, balances] = await Promise.all([\n loadProductInventoryProfiles(em, productIds, scope),\n loadBalances(em, variantIds, scope),\n ])\n\n const profileByProductId = new Map(\n productProfiles.map((profile) => [profile.catalogProductId, profile] as const),\n )\n const balanceByVariantId = buildBalanceSummaryByVariant(balances)\n const variantIdsByProductId = new Map<string, string[]>()\n\n for (const variant of variants) {\n const productId = extractProductIdFromVariant(variant)\n if (!productId || typeof variant.id !== 'string') continue\n const entries = variantIdsByProductId.get(productId) ?? []\n entries.push(variant.id)\n variantIdsByProductId.set(productId, entries)\n }\n\n return records.map((record) => {\n const productId = extractRecordId(record)\n if (!productId) {\n return { ...record, ...EMPTY_CATALOG_ENRICHMENT }\n }\n\n const profile = profileByProductId.get(productId) ?? null\n const stockSummary = (variantIdsByProductId.get(productId) ?? []).map((variantId) =>\n buildStockSummaryItem(variantId, balanceByVariantId.get(variantId)),\n )\n const totalAvailable = stockSummary.reduce(\n (sum, item) => sum + Number(item.available),\n 0,\n )\n\n return {\n ...record,\n _wms: {\n inventoryProfile: profile ? toInventoryProfileSummary(profile) : null,\n stockSummary,\n reorderStatus: resolveReorderStatus(totalAvailable, profile),\n },\n }\n })\n },\n}\n\nconst catalogVariantInventoryEnricher: ResponseEnricher<CatalogVariantRecord, CatalogWmsEnrichment> = {\n id: 'wms.catalog-variant-inventory',\n targetEntity: E.catalog.catalog_product_variant,\n features: ['wms.view'],\n priority: 40,\n timeout: 2000,\n fallback: EMPTY_CATALOG_ENRICHMENT,\n\n async enrichOne(record, context: EnricherScope) {\n return (await this.enrichMany!([record], context))[0]\n },\n\n async enrichMany(records, context: EnricherScope) {\n if (records.length === 0) return records as Array<CatalogVariantRecord & CatalogWmsEnrichment>\n\n const variantIds = records\n .map(extractRecordId)\n .filter((value): value is string => Boolean(value))\n\n if (variantIds.length === 0) {\n return records.map((record) => ({ ...record, ...EMPTY_CATALOG_ENRICHMENT }))\n }\n\n const em = context.em.fork()\n const scope = { organizationId: context.organizationId, tenantId: context.tenantId }\n\n const [profiles, balances] = await Promise.all([\n loadVariantInventoryProfiles(em, variantIds, scope),\n loadBalances(em, variantIds, scope),\n ])\n\n const profileByVariantId = new Map(\n profiles\n .filter((profile): profile is ProductInventoryProfile & { catalogVariantId: string } => typeof profile.catalogVariantId === 'string')\n .map((profile) => [profile.catalogVariantId, profile] as const),\n )\n const balanceByVariantId = buildBalanceSummaryByVariant(balances)\n\n return records.map((record) => {\n const variantId = extractRecordId(record)\n if (!variantId) {\n return { ...record, ...EMPTY_CATALOG_ENRICHMENT }\n }\n\n const profile = profileByVariantId.get(variantId) ?? null\n const stockSummary = [buildStockSummaryItem(variantId, balanceByVariantId.get(variantId))]\n\n return {\n ...record,\n _wms: {\n inventoryProfile: profile ? toInventoryProfileSummary(profile) : null,\n stockSummary,\n reorderStatus: resolveReorderStatus(Number(stockSummary[0]?.available ?? 0), profile),\n },\n }\n })\n },\n}\n\nexport const enrichers: ResponseEnricher[] = [\n salesOrderInventoryEnricher,\n catalogProductInventoryEnricher,\n catalogVariantInventoryEnricher,\n]\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }