@open-mercato/core 0.10.1-develop.7709.1.046124599c → 0.10.1-develop.7714.1.9dbb8200d8

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 (276) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/asn/index.js +19 -0
  3. package/dist/generated/entities/asn/index.js.map +7 -0
  4. package/dist/generated/entities/putaway_task/index.js +25 -0
  5. package/dist/generated/entities/putaway_task/index.js.map +7 -0
  6. package/dist/generated/entities/receiving_line/index.js +21 -0
  7. package/dist/generated/entities/receiving_line/index.js.map +7 -0
  8. package/dist/generated/entities.ids.generated.js +4 -1
  9. package/dist/generated/entities.ids.generated.js.map +2 -2
  10. package/dist/generated/entity-fields-registry.js +34 -0
  11. package/dist/generated/entity-fields-registry.js.map +2 -2
  12. package/dist/modules/communication_channels/lib/sanitize-channel-html.js +22 -3
  13. package/dist/modules/communication_channels/lib/sanitize-channel-html.js.map +2 -2
  14. package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js +40 -11
  15. package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js.map +2 -2
  16. package/dist/modules/customers/components/calendar/CalendarEventEditor.js +13 -2
  17. package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
  18. package/dist/modules/wms/acl.js +2 -0
  19. package/dist/modules/wms/acl.js.map +2 -2
  20. package/dist/modules/wms/api/asns/[id]/complete/route.js +61 -0
  21. package/dist/modules/wms/api/asns/[id]/complete/route.js.map +7 -0
  22. package/dist/modules/wms/api/asns/[id]/receive/route.js +68 -0
  23. package/dist/modules/wms/api/asns/[id]/receive/route.js.map +7 -0
  24. package/dist/modules/wms/api/asns/route.js +197 -0
  25. package/dist/modules/wms/api/asns/route.js.map +7 -0
  26. package/dist/modules/wms/api/inventory/helpers.js +42 -34
  27. package/dist/modules/wms/api/inventory/helpers.js.map +2 -2
  28. package/dist/modules/wms/api/inventory/receive/route.js +1 -1
  29. package/dist/modules/wms/api/inventory/receive/route.js.map +2 -2
  30. package/dist/modules/wms/api/listEnrichers.js +23 -0
  31. package/dist/modules/wms/api/listEnrichers.js.map +2 -2
  32. package/dist/modules/wms/api/putaway-tasks/[id]/assign/route.js +56 -0
  33. package/dist/modules/wms/api/putaway-tasks/[id]/assign/route.js.map +7 -0
  34. package/dist/modules/wms/api/putaway-tasks/[id]/cancel/route.js +56 -0
  35. package/dist/modules/wms/api/putaway-tasks/[id]/cancel/route.js.map +7 -0
  36. package/dist/modules/wms/api/putaway-tasks/[id]/complete/route.js +65 -0
  37. package/dist/modules/wms/api/putaway-tasks/[id]/complete/route.js.map +7 -0
  38. package/dist/modules/wms/api/putaway-tasks/[id]/start/route.js +56 -0
  39. package/dist/modules/wms/api/putaway-tasks/[id]/start/route.js.map +7 -0
  40. package/dist/modules/wms/api/putaway-tasks/create-from-balance/route.js +51 -0
  41. package/dist/modules/wms/api/putaway-tasks/create-from-balance/route.js.map +7 -0
  42. package/dist/modules/wms/api/putaway-tasks/route.js +192 -0
  43. package/dist/modules/wms/api/putaway-tasks/route.js.map +7 -0
  44. package/dist/modules/wms/api/receiving-lines/route.js +180 -0
  45. package/dist/modules/wms/api/receiving-lines/route.js.map +7 -0
  46. package/dist/modules/wms/api/scan/putaway/route.js +104 -0
  47. package/dist/modules/wms/api/scan/putaway/route.js.map +7 -0
  48. package/dist/modules/wms/api/scan/receive/route.js +109 -0
  49. package/dist/modules/wms/api/scan/receive/route.js.map +7 -0
  50. package/dist/modules/wms/api/scan/resolve-location/route.js +89 -0
  51. package/dist/modules/wms/api/scan/resolve-location/route.js.map +7 -0
  52. package/dist/modules/wms/api/scan/resolve-lot/route.js +89 -0
  53. package/dist/modules/wms/api/scan/resolve-lot/route.js.map +7 -0
  54. package/dist/modules/wms/backend/wms/asns/[id]/page.js +9 -0
  55. package/dist/modules/wms/backend/wms/asns/[id]/page.js.map +7 -0
  56. package/dist/modules/wms/backend/wms/asns/[id]/page.meta.js +18 -0
  57. package/dist/modules/wms/backend/wms/asns/[id]/page.meta.js.map +7 -0
  58. package/dist/modules/wms/backend/wms/asns/page.js +9 -0
  59. package/dist/modules/wms/backend/wms/asns/page.js.map +7 -0
  60. package/dist/modules/wms/backend/wms/asns/page.meta.js +18 -0
  61. package/dist/modules/wms/backend/wms/asns/page.meta.js.map +7 -0
  62. package/dist/modules/wms/backend/wms/putaway/page.js +9 -0
  63. package/dist/modules/wms/backend/wms/putaway/page.js.map +7 -0
  64. package/dist/modules/wms/backend/wms/putaway/page.meta.js +18 -0
  65. package/dist/modules/wms/backend/wms/putaway/page.meta.js.map +7 -0
  66. package/dist/modules/wms/backend/wms/receiving/page.js +8 -0
  67. package/dist/modules/wms/backend/wms/receiving/page.js.map +7 -0
  68. package/dist/modules/wms/backend/wms/receiving/page.meta.js +18 -0
  69. package/dist/modules/wms/backend/wms/receiving/page.meta.js.map +7 -0
  70. package/dist/modules/wms/ce.js +27 -0
  71. package/dist/modules/wms/ce.js.map +2 -2
  72. package/dist/modules/wms/commands/asn.js +1746 -0
  73. package/dist/modules/wms/commands/asn.js.map +7 -0
  74. package/dist/modules/wms/commands/index.js +2 -0
  75. package/dist/modules/wms/commands/index.js.map +2 -2
  76. package/dist/modules/wms/commands/inventory-actions.js +347 -243
  77. package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
  78. package/dist/modules/wms/commands/putaway.js +945 -0
  79. package/dist/modules/wms/commands/putaway.js.map +7 -0
  80. package/dist/modules/wms/commands/shared.js +51 -0
  81. package/dist/modules/wms/commands/shared.js.map +2 -2
  82. package/dist/modules/wms/components/backend/AssignPutawayTaskDialog.js +278 -0
  83. package/dist/modules/wms/components/backend/AssignPutawayTaskDialog.js.map +7 -0
  84. package/dist/modules/wms/components/backend/CompletePutawayTaskDialog.js +327 -0
  85. package/dist/modules/wms/components/backend/CompletePutawayTaskDialog.js.map +7 -0
  86. package/dist/modules/wms/components/backend/CreateAsnDialog.js +404 -0
  87. package/dist/modules/wms/components/backend/CreateAsnDialog.js.map +7 -0
  88. package/dist/modules/wms/components/backend/InventoryOperationsSection.js +16 -3
  89. package/dist/modules/wms/components/backend/InventoryOperationsSection.js.map +2 -2
  90. package/dist/modules/wms/components/backend/ReceiveAsnLineDialog.js +476 -0
  91. package/dist/modules/wms/components/backend/ReceiveAsnLineDialog.js.map +7 -0
  92. package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js +2 -2
  93. package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js.map +2 -2
  94. package/dist/modules/wms/components/backend/WmsAsnDetailPage.js +524 -0
  95. package/dist/modules/wms/components/backend/WmsAsnDetailPage.js.map +7 -0
  96. package/dist/modules/wms/components/backend/WmsAsnsListPage.js +339 -0
  97. package/dist/modules/wms/components/backend/WmsAsnsListPage.js.map +7 -0
  98. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +5 -6
  99. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
  100. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +5 -6
  101. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
  102. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +14 -10
  103. package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
  104. package/dist/modules/wms/components/backend/WmsPutawayQueuePage.js +598 -0
  105. package/dist/modules/wms/components/backend/WmsPutawayQueuePage.js.map +7 -0
  106. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +5 -6
  107. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
  108. package/dist/modules/wms/components/backend/asnCompleteOptimisticLock.js +32 -0
  109. package/dist/modules/wms/components/backend/asnCompleteOptimisticLock.js.map +7 -0
  110. package/dist/modules/wms/components/backend/asnReceivingLinesLoader.js +36 -0
  111. package/dist/modules/wms/components/backend/asnReceivingLinesLoader.js.map +7 -0
  112. package/dist/modules/wms/components/backend/inboundStatusUi.js +106 -0
  113. package/dist/modules/wms/components/backend/inboundStatusUi.js.map +7 -0
  114. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +17 -0
  115. package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
  116. package/dist/modules/wms/components/backend/putawayQueueOptimisticLock.js +14 -0
  117. package/dist/modules/wms/components/backend/putawayQueueOptimisticLock.js.map +7 -0
  118. package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js +4 -0
  119. package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js.map +2 -2
  120. package/dist/modules/wms/data/enrichers.js +117 -12
  121. package/dist/modules/wms/data/enrichers.js.map +2 -2
  122. package/dist/modules/wms/data/entities.js +150 -1
  123. package/dist/modules/wms/data/entities.js.map +2 -2
  124. package/dist/modules/wms/data/validators.js +214 -0
  125. package/dist/modules/wms/data/validators.js.map +2 -2
  126. package/dist/modules/wms/events.js +12 -1
  127. package/dist/modules/wms/events.js.map +2 -2
  128. package/dist/modules/wms/extension-points.js +3 -1
  129. package/dist/modules/wms/extension-points.js.map +2 -2
  130. package/dist/modules/wms/lib/asnReceiving.js +124 -0
  131. package/dist/modules/wms/lib/asnReceiving.js.map +7 -0
  132. package/dist/modules/wms/lib/asnVendor.js +52 -0
  133. package/dist/modules/wms/lib/asnVendor.js.map +7 -0
  134. package/dist/modules/wms/lib/flashMutationError.js +4 -0
  135. package/dist/modules/wms/lib/flashMutationError.js.map +2 -2
  136. package/dist/modules/wms/lib/inventoryDisplayUi.js +24 -0
  137. package/dist/modules/wms/lib/inventoryDisplayUi.js.map +2 -2
  138. package/dist/modules/wms/lib/inventoryPolicy.js +17 -0
  139. package/dist/modules/wms/lib/inventoryPolicy.js.map +2 -2
  140. package/dist/modules/wms/lib/loadOperationalDashboard.js +67 -1
  141. package/dist/modules/wms/lib/loadOperationalDashboard.js.map +2 -2
  142. package/dist/modules/wms/lib/putaway.js +141 -0
  143. package/dist/modules/wms/lib/putaway.js.map +7 -0
  144. package/dist/modules/wms/lib/roleFeatures.js +3 -1
  145. package/dist/modules/wms/lib/roleFeatures.js.map +2 -2
  146. package/dist/modules/wms/lib/salesOrderInventoryAutomation.js +99 -1
  147. package/dist/modules/wms/lib/salesOrderInventoryAutomation.js.map +2 -2
  148. package/dist/modules/wms/lib/scanResolve.js +147 -0
  149. package/dist/modules/wms/lib/scanResolve.js.map +7 -0
  150. package/dist/modules/wms/lib/wmsIntegrationToggles.js +1 -1
  151. package/dist/modules/wms/lib/wmsIntegrationToggles.js.map +2 -2
  152. package/dist/modules/wms/migrations/Migration20260812120000.js +43 -0
  153. package/dist/modules/wms/migrations/Migration20260812120000.js.map +7 -0
  154. package/dist/modules/wms/migrations/Migration20260812130000.js +30 -0
  155. package/dist/modules/wms/migrations/Migration20260812130000.js.map +7 -0
  156. package/dist/modules/wms/migrations/Migration20260822120000.js +17 -0
  157. package/dist/modules/wms/migrations/Migration20260822120000.js.map +7 -0
  158. package/dist/modules/wms/migrations/Migration20260822130000.js +17 -0
  159. package/dist/modules/wms/migrations/Migration20260822130000.js.map +7 -0
  160. package/dist/modules/wms/migrations/Migration20261029120000.js +13 -0
  161. package/dist/modules/wms/migrations/Migration20261029120000.js.map +7 -0
  162. package/dist/modules/wms/search.js +85 -0
  163. package/dist/modules/wms/search.js.map +2 -2
  164. package/dist/modules/wms/subscribers/asn-line-received-reevaluate-reservations.js +14 -0
  165. package/dist/modules/wms/subscribers/asn-line-received-reevaluate-reservations.js.map +7 -0
  166. package/dist/modules/wms/subscribers/invalidate-enricher-cache-asn.js +12 -0
  167. package/dist/modules/wms/subscribers/invalidate-enricher-cache-asn.js.map +7 -0
  168. package/dist/modules/wms/subscribers/procurement-goods-receipt-created.js +163 -0
  169. package/dist/modules/wms/subscribers/procurement-goods-receipt-created.js.map +7 -0
  170. package/dist/modules/wms/subscribers/putaway-completed-reevaluate-reservations.js +14 -0
  171. package/dist/modules/wms/subscribers/putaway-completed-reevaluate-reservations.js.map +7 -0
  172. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js +37 -8
  173. package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js.map +2 -2
  174. package/generated/entities/asn/index.ts +8 -0
  175. package/generated/entities/putaway_task/index.ts +11 -0
  176. package/generated/entities/receiving_line/index.ts +9 -0
  177. package/generated/entities.ids.generated.ts +4 -1
  178. package/generated/entity-fields-registry.ts +34 -0
  179. package/package.json +7 -7
  180. package/src/modules/auth/i18n/de.json +2 -0
  181. package/src/modules/auth/i18n/en.json +2 -0
  182. package/src/modules/auth/i18n/es.json +2 -0
  183. package/src/modules/auth/i18n/ko.json +2 -0
  184. package/src/modules/auth/i18n/pl.json +2 -0
  185. package/src/modules/communication_channels/i18n/de.json +2 -0
  186. package/src/modules/communication_channels/i18n/en.json +2 -0
  187. package/src/modules/communication_channels/i18n/es.json +2 -0
  188. package/src/modules/communication_channels/i18n/ko.json +2 -0
  189. package/src/modules/communication_channels/i18n/pl.json +2 -0
  190. package/src/modules/communication_channels/lib/sanitize-channel-html.ts +23 -3
  191. package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.tsx +44 -12
  192. package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +16 -2
  193. package/src/modules/wms/acl.ts +2 -0
  194. package/src/modules/wms/api/asns/[id]/complete/route.ts +62 -0
  195. package/src/modules/wms/api/asns/[id]/receive/route.ts +74 -0
  196. package/src/modules/wms/api/asns/route.ts +200 -0
  197. package/src/modules/wms/api/inventory/helpers.ts +57 -34
  198. package/src/modules/wms/api/inventory/receive/route.ts +2 -1
  199. package/src/modules/wms/api/listEnrichers.ts +38 -0
  200. package/src/modules/wms/api/putaway-tasks/[id]/assign/route.ts +56 -0
  201. package/src/modules/wms/api/putaway-tasks/[id]/cancel/route.ts +56 -0
  202. package/src/modules/wms/api/putaway-tasks/[id]/complete/route.ts +66 -0
  203. package/src/modules/wms/api/putaway-tasks/[id]/start/route.ts +56 -0
  204. package/src/modules/wms/api/putaway-tasks/create-from-balance/route.ts +50 -0
  205. package/src/modules/wms/api/putaway-tasks/route.ts +199 -0
  206. package/src/modules/wms/api/receiving-lines/route.ts +180 -0
  207. package/src/modules/wms/api/scan/putaway/route.ts +108 -0
  208. package/src/modules/wms/api/scan/receive/route.ts +118 -0
  209. package/src/modules/wms/api/scan/resolve-location/route.ts +92 -0
  210. package/src/modules/wms/api/scan/resolve-lot/route.ts +92 -0
  211. package/src/modules/wms/backend/wms/asns/[id]/page.meta.ts +14 -0
  212. package/src/modules/wms/backend/wms/asns/[id]/page.tsx +5 -0
  213. package/src/modules/wms/backend/wms/asns/page.meta.ts +14 -0
  214. package/src/modules/wms/backend/wms/asns/page.tsx +5 -0
  215. package/src/modules/wms/backend/wms/putaway/page.meta.ts +14 -0
  216. package/src/modules/wms/backend/wms/putaway/page.tsx +5 -0
  217. package/src/modules/wms/backend/wms/receiving/page.meta.ts +14 -0
  218. package/src/modules/wms/backend/wms/receiving/page.tsx +5 -0
  219. package/src/modules/wms/ce.ts +27 -0
  220. package/src/modules/wms/commands/asn.ts +2122 -0
  221. package/src/modules/wms/commands/index.ts +2 -0
  222. package/src/modules/wms/commands/inventory-actions.ts +413 -243
  223. package/src/modules/wms/commands/putaway.ts +1169 -0
  224. package/src/modules/wms/commands/shared.ts +51 -0
  225. package/src/modules/wms/components/backend/AssignPutawayTaskDialog.tsx +328 -0
  226. package/src/modules/wms/components/backend/CompletePutawayTaskDialog.tsx +366 -0
  227. package/src/modules/wms/components/backend/CreateAsnDialog.tsx +427 -0
  228. package/src/modules/wms/components/backend/InventoryOperationsSection.tsx +20 -2
  229. package/src/modules/wms/components/backend/ReceiveAsnLineDialog.tsx +535 -0
  230. package/src/modules/wms/components/backend/ReceiveInventoryDialog.tsx +2 -2
  231. package/src/modules/wms/components/backend/WmsAsnDetailPage.tsx +647 -0
  232. package/src/modules/wms/components/backend/WmsAsnsListPage.tsx +407 -0
  233. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +4 -5
  234. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +4 -5
  235. package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +12 -8
  236. package/src/modules/wms/components/backend/WmsPutawayQueuePage.tsx +677 -0
  237. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +4 -5
  238. package/src/modules/wms/components/backend/asnCompleteOptimisticLock.ts +52 -0
  239. package/src/modules/wms/components/backend/asnReceivingLinesLoader.ts +83 -0
  240. package/src/modules/wms/components/backend/inboundStatusUi.ts +154 -0
  241. package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +20 -0
  242. package/src/modules/wms/components/backend/putawayQueueOptimisticLock.ts +20 -0
  243. package/src/modules/wms/components/backend/useWmsInventoryMutationAccess.ts +4 -0
  244. package/src/modules/wms/data/enrichers.ts +175 -13
  245. package/src/modules/wms/data/entities.ts +155 -0
  246. package/src/modules/wms/data/validators.ts +256 -0
  247. package/src/modules/wms/events.ts +11 -0
  248. package/src/modules/wms/extension-points.ts +2 -0
  249. package/src/modules/wms/i18n/de.json +205 -3
  250. package/src/modules/wms/i18n/en.json +205 -3
  251. package/src/modules/wms/i18n/es.json +205 -3
  252. package/src/modules/wms/i18n/ko.json +205 -3
  253. package/src/modules/wms/i18n/pl.json +205 -3
  254. package/src/modules/wms/lib/asnReceiving.ts +226 -0
  255. package/src/modules/wms/lib/asnVendor.ts +80 -0
  256. package/src/modules/wms/lib/flashMutationError.ts +4 -0
  257. package/src/modules/wms/lib/inventoryDisplayUi.ts +46 -0
  258. package/src/modules/wms/lib/inventoryPolicy.ts +31 -1
  259. package/src/modules/wms/lib/loadOperationalDashboard.ts +89 -1
  260. package/src/modules/wms/lib/putaway.ts +210 -0
  261. package/src/modules/wms/lib/roleFeatures.ts +2 -0
  262. package/src/modules/wms/lib/salesOrderInventoryAutomation.ts +150 -1
  263. package/src/modules/wms/lib/scanResolve.ts +185 -0
  264. package/src/modules/wms/lib/wmsIntegrationToggles.ts +2 -1
  265. package/src/modules/wms/migrations/.snapshot-open-mercato.json +1000 -0
  266. package/src/modules/wms/migrations/Migration20260812120000.ts +43 -0
  267. package/src/modules/wms/migrations/Migration20260812130000.ts +28 -0
  268. package/src/modules/wms/migrations/Migration20260822120000.ts +17 -0
  269. package/src/modules/wms/migrations/Migration20260822130000.ts +15 -0
  270. package/src/modules/wms/migrations/Migration20261029120000.ts +11 -0
  271. package/src/modules/wms/search.ts +95 -0
  272. package/src/modules/wms/subscribers/asn-line-received-reevaluate-reservations.ts +21 -0
  273. package/src/modules/wms/subscribers/invalidate-enricher-cache-asn.ts +12 -0
  274. package/src/modules/wms/subscribers/procurement-goods-receipt-created.ts +238 -0
  275. package/src/modules/wms/subscribers/putaway-completed-reevaluate-reservations.ts +21 -0
  276. package/src/modules/wms/widgets/injection/sales-order-stock-context/widget.client.tsx +63 -13
@@ -0,0 +1,17 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260822130000_wms extends Migration {
3
+ up() {
4
+ this.addSql(`alter table "wms_asns" add column "source_key" text null;`);
5
+ this.addSql(
6
+ `create unique index "wms_asns_org_source_key_unique_idx" on "wms_asns" ("organization_id", "source_key") where source_key is not null and deleted_at is null;`
7
+ );
8
+ }
9
+ down() {
10
+ this.addSql(`drop index if exists "wms_asns_org_source_key_unique_idx";`);
11
+ this.addSql(`alter table "wms_asns" drop column if exists "source_key";`);
12
+ }
13
+ }
14
+ export {
15
+ Migration20260822130000_wms
16
+ };
17
+ //# sourceMappingURL=Migration20260822130000.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/wms/migrations/Migration20260822130000.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\nexport class Migration20260822130000_wms extends Migration {\n override up(): void | Promise<void> {\n this.addSql(`alter table \"wms_asns\" add column \"source_key\" text null;`)\n this.addSql(\n `create unique index \"wms_asns_org_source_key_unique_idx\" on \"wms_asns\" (\"organization_id\", \"source_key\") where source_key is not null and deleted_at is null;`,\n )\n }\n\n override down(): void | Promise<void> {\n this.addSql(`drop index if exists \"wms_asns_org_source_key_unique_idx\";`)\n this.addSql(`alter table \"wms_asns\" drop column if exists \"source_key\";`)\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,oCAAoC,UAAU;AAAA,EAChD,KAA2B;AAClC,SAAK,OAAO,2DAA2D;AACvE,SAAK;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAES,OAA6B;AACpC,SAAK,OAAO,4DAA4D;AACxE,SAAK,OAAO,4DAA4D;AAAA,EAC1E;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20261029120000_wms extends Migration {
3
+ up() {
4
+ this.addSql(`alter table "wms_putaway_tasks" add column "serial_number" text null;`);
5
+ }
6
+ down() {
7
+ this.addSql(`alter table "wms_putaway_tasks" drop column if exists "serial_number";`);
8
+ }
9
+ }
10
+ export {
11
+ Migration20261029120000_wms
12
+ };
13
+ //# sourceMappingURL=Migration20261029120000.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/wms/migrations/Migration20261029120000.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\nexport class Migration20261029120000_wms extends Migration {\n override up(): void | Promise<void> {\n this.addSql(`alter table \"wms_putaway_tasks\" add column \"serial_number\" text null;`)\n }\n\n override down(): void | Promise<void> {\n this.addSql(`alter table \"wms_putaway_tasks\" drop column if exists \"serial_number\";`)\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,oCAAoC,UAAU;AAAA,EAChD,KAA2B;AAClC,SAAK,OAAO,uEAAuE;AAAA,EACrF;AAAA,EAES,OAA6B;AACpC,SAAK,OAAO,wEAAwE;AAAA,EACtF;AACF;",
6
+ "names": []
7
+ }
@@ -63,6 +63,27 @@ function buildLotPresenter(t, record) {
63
63
  const subtitle = formatSubtitle(record.catalog_variant_id ?? record.catalogVariantId, record.status, record.expires_at ?? record.expiresAt);
64
64
  return { title, subtitle, icon: "package-search" };
65
65
  }
66
+ function buildAsnPresenter(t, record) {
67
+ const label = t("wms.search.badge.asn", "ASN");
68
+ const title = pickString(record.reference_number, record.referenceNumber, record.id) ?? label;
69
+ const subtitle = formatSubtitle(
70
+ record.status,
71
+ record.warehouse_id ?? record.warehouseId,
72
+ record.expected_at ?? record.expectedAt
73
+ );
74
+ return { title, subtitle, icon: "truck", badge: label };
75
+ }
76
+ function buildPutawayPresenter(t, record) {
77
+ const label = t("wms.search.badge.putaway", "Putaway task");
78
+ const title = pickString(record.catalog_variant_id, record.catalogVariantId, record.id) ?? label;
79
+ const subtitle = formatSubtitle(
80
+ record.status,
81
+ record.warehouse_id ?? record.warehouseId,
82
+ record.source_location_id ?? record.sourceLocationId,
83
+ record.target_location_id ?? record.targetLocationId
84
+ );
85
+ return { title, subtitle, icon: "package", badge: label };
86
+ }
66
87
  const searchConfig = {
67
88
  entities: [
68
89
  {
@@ -187,6 +208,70 @@ const searchConfig = {
187
208
  fieldPolicy: {
188
209
  searchable: ["lot_number", "batch_number", "sku", "catalog_variant_id", "status", "expires_at"]
189
210
  }
211
+ },
212
+ {
213
+ entityId: E.wms.asn,
214
+ aclFeatures: ["wms.view"],
215
+ enabled: true,
216
+ priority: 7,
217
+ buildSource: async (ctx) => {
218
+ const { t } = await resolveTranslations();
219
+ const record = ctx.record;
220
+ const lines = [];
221
+ appendLine(lines, "Reference", record.reference_number ?? record.referenceNumber);
222
+ appendLine(lines, "Status", record.status);
223
+ appendLine(lines, "Warehouse", record.warehouse_id ?? record.warehouseId);
224
+ appendLine(lines, "Vendor", record.vendor_id ?? record.vendorId);
225
+ appendLine(lines, "Expected at", record.expected_at ?? record.expectedAt);
226
+ appendLine(lines, "Notes", record.notes);
227
+ return buildIndexSource(ctx, buildAsnPresenter(t, record), lines);
228
+ },
229
+ formatResult: async (ctx) => {
230
+ const { t } = await resolveTranslations();
231
+ return buildAsnPresenter(t, ctx.record);
232
+ },
233
+ resolveUrl: async (ctx) => {
234
+ const id = pickString(ctx.record.id);
235
+ if (id) return `${WMS_ROOT_URL}/asns/${id}`;
236
+ return WMS_ROOT_URL;
237
+ },
238
+ fieldPolicy: {
239
+ searchable: ["reference_number", "status", "warehouse_id", "vendor_id", "notes"]
240
+ }
241
+ },
242
+ {
243
+ entityId: E.wms.putaway_task,
244
+ aclFeatures: ["wms.view"],
245
+ enabled: true,
246
+ priority: 6,
247
+ buildSource: async (ctx) => {
248
+ const { t } = await resolveTranslations();
249
+ const record = ctx.record;
250
+ const lines = [];
251
+ appendLine(lines, "Status", record.status);
252
+ appendLine(lines, "Warehouse", record.warehouse_id ?? record.warehouseId);
253
+ appendLine(lines, "Source", record.source_location_id ?? record.sourceLocationId);
254
+ appendLine(lines, "Target", record.target_location_id ?? record.targetLocationId);
255
+ appendLine(lines, "Variant", record.catalog_variant_id ?? record.catalogVariantId);
256
+ appendLine(lines, "Assigned to", record.assigned_to ?? record.assignedTo);
257
+ appendLine(lines, "Quantity", record.quantity);
258
+ return buildIndexSource(ctx, buildPutawayPresenter(t, record), lines);
259
+ },
260
+ formatResult: async (ctx) => {
261
+ const { t } = await resolveTranslations();
262
+ return buildPutawayPresenter(t, ctx.record);
263
+ },
264
+ resolveUrl: async () => `${WMS_ROOT_URL}/putaway`,
265
+ fieldPolicy: {
266
+ searchable: [
267
+ "status",
268
+ "warehouse_id",
269
+ "source_location_id",
270
+ "target_location_id",
271
+ "catalog_variant_id",
272
+ "assigned_to"
273
+ ]
274
+ }
190
275
  }
191
276
  ]
192
277
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/modules/wms/search.ts"],
4
- "sourcesContent": ["import type {\n SearchBuildContext,\n SearchIndexSource,\n SearchModuleConfig,\n SearchResultPresenter,\n} from '@open-mercato/shared/modules/search'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { E } from '#generated/entities.ids.generated'\n\nconst WMS_ROOT_URL = '/backend/wms'\nconst WMS_INVENTORY_URL = '/backend/wms/inventory'\nconst WMS_CONFIG_URL = '/backend/config/wms'\n\nfunction pickString(...candidates: Array<unknown>): string | null {\n for (const candidate of candidates) {\n if (typeof candidate !== 'string') continue\n const trimmed = candidate.trim()\n if (trimmed.length > 0) return trimmed\n }\n return null\n}\n\nfunction appendLine(lines: string[], label: string, value: unknown) {\n if (value === null || value === undefined) return\n const text = Array.isArray(value)\n ? value.map((item) => (item == null ? '' : String(item))).filter(Boolean).join(', ')\n : typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)\n if (!text.trim()) return\n lines.push(`${label}: ${text}`)\n}\n\nfunction formatSubtitle(...parts: Array<unknown>): string | undefined {\n const values = parts\n .map((part) => (part == null ? '' : String(part)).trim())\n .filter(Boolean)\n if (!values.length) return undefined\n return values.join(' \u00B7 ')\n}\n\nfunction buildIndexSource(\n ctx: SearchBuildContext,\n presenter: SearchResultPresenter,\n lines: string[],\n): SearchIndexSource | null {\n for (const [key, value] of Object.entries(ctx.customFields)) {\n appendLine(lines, key.replace(/^cf:/, ''), value)\n }\n if (!lines.length) return null\n return {\n text: lines,\n presenter,\n checksumSource: { record: ctx.record, customFields: ctx.customFields },\n }\n}\n\nfunction buildWarehousePresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.warehouse', 'Warehouse')\n const title = pickString(record.name, record.code, record.id) ?? label\n const subtitle = formatSubtitle(record.code, record.city, record.country)\n return { title, subtitle, icon: 'warehouse' }\n}\n\nfunction buildLocationPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.location', 'Location')\n const title = pickString(record.code, record.id) ?? label\n const subtitle = formatSubtitle(record.type, record.warehouse_id ?? record.warehouseId)\n return { title, subtitle, icon: 'map-pinned' }\n}\n\nfunction buildInventoryProfilePresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.inventoryProfile', 'Inventory profile')\n const productId = pickString(record.catalog_product_id, record.catalogProductId)\n const variantId = pickString(record.catalog_variant_id, record.catalogVariantId)\n const title = variantId || productId || pickString(record.id) || label\n const subtitle = formatSubtitle(\n record.default_strategy ?? record.defaultStrategy,\n record.default_uom ?? record.defaultUom,\n variantId ? t('wms.search.profile.variantScoped', 'Variant-scoped') : t('wms.search.profile.productScoped', 'Product-scoped'),\n )\n return { title, subtitle, icon: 'boxes' }\n}\n\nfunction buildLotPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.lot', 'Inventory lot')\n const title = pickString(record.lot_number, record.lotNumber, record.batch_number, record.batchNumber, record.id) ?? label\n const subtitle = formatSubtitle(record.catalog_variant_id ?? record.catalogVariantId, record.status, record.expires_at ?? record.expiresAt)\n return { title, subtitle, icon: 'package-search' }\n}\n\nexport const searchConfig: SearchModuleConfig = {\n entities: [\n {\n entityId: E.wms.warehouse,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 8,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Name', record.name)\n appendLine(lines, 'Code', record.code)\n appendLine(lines, 'City', record.city)\n appendLine(lines, 'Country', record.country)\n appendLine(lines, 'Timezone', record.timezone)\n return buildIndexSource(ctx, buildWarehousePresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildWarehousePresenter(t, ctx.record)\n },\n resolveUrl: async () => WMS_CONFIG_URL,\n fieldPolicy: {\n searchable: ['name', 'code', 'city', 'country', 'timezone'],\n },\n },\n {\n entityId: E.wms.warehouse_location,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 7,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Code', record.code)\n appendLine(lines, 'Type', record.type)\n appendLine(lines, 'Warehouse', record.warehouse_id ?? record.warehouseId)\n appendLine(lines, 'Parent', record.parent_id ?? record.parentId)\n appendLine(lines, 'Capacity units', record.capacity_units ?? record.capacityUnits)\n appendLine(lines, 'Capacity weight', record.capacity_weight ?? record.capacityWeight)\n return buildIndexSource(ctx, buildLocationPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildLocationPresenter(t, ctx.record)\n },\n resolveUrl: async () => WMS_CONFIG_URL,\n fieldPolicy: {\n searchable: ['code', 'type', 'warehouse_id', 'parent_id', 'capacity_units', 'capacity_weight'],\n },\n },\n {\n entityId: E.wms.product_inventory_profile,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 8,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Product', record.catalog_product_id ?? record.catalogProductId)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Default UOM', record.default_uom ?? record.defaultUom)\n appendLine(lines, 'Strategy', record.default_strategy ?? record.defaultStrategy)\n appendLine(lines, 'Reorder point', record.reorder_point ?? record.reorderPoint)\n appendLine(lines, 'Safety stock', record.safety_stock ?? record.safetyStock)\n appendLine(lines, 'Track lot', record.track_lot ?? record.trackLot)\n appendLine(lines, 'Track serial', record.track_serial ?? record.trackSerial)\n appendLine(lines, 'Track expiration', record.track_expiration ?? record.trackExpiration)\n return buildIndexSource(ctx, buildInventoryProfilePresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildInventoryProfilePresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const variantId = pickString(ctx.record.catalog_variant_id, ctx.record.catalogVariantId)\n if (variantId) return `${WMS_ROOT_URL}/sku/${variantId}`\n return WMS_CONFIG_URL\n },\n resolveLinks: async () => [{ href: WMS_INVENTORY_URL, label: 'Inventory console', kind: 'secondary' }],\n fieldPolicy: {\n searchable: [\n 'catalog_product_id',\n 'catalog_variant_id',\n 'default_uom',\n 'default_strategy',\n 'reorder_point',\n 'safety_stock',\n ],\n },\n },\n {\n entityId: E.wms.inventory_lot,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 6,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Lot number', record.lot_number ?? record.lotNumber)\n appendLine(lines, 'Batch number', record.batch_number ?? record.batchNumber)\n appendLine(lines, 'SKU', record.sku)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Status', record.status)\n appendLine(lines, 'Expires at', record.expires_at ?? record.expiresAt)\n return buildIndexSource(ctx, buildLotPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildLotPresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const id = pickString(ctx.record.id)\n if (id) return `${WMS_ROOT_URL}/lot/${id}`\n return WMS_ROOT_URL\n },\n resolveLinks: async () => [{ href: WMS_CONFIG_URL, label: 'WMS configuration', kind: 'secondary' }],\n fieldPolicy: {\n searchable: ['lot_number', 'batch_number', 'sku', 'catalog_variant_id', 'status', 'expires_at'],\n },\n },\n ],\n}\n\nexport default searchConfig\nexport const config = searchConfig\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n SearchBuildContext,\n SearchIndexSource,\n SearchModuleConfig,\n SearchResultPresenter,\n} from '@open-mercato/shared/modules/search'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { E } from '#generated/entities.ids.generated'\n\nconst WMS_ROOT_URL = '/backend/wms'\nconst WMS_INVENTORY_URL = '/backend/wms/inventory'\nconst WMS_CONFIG_URL = '/backend/config/wms'\n\nfunction pickString(...candidates: Array<unknown>): string | null {\n for (const candidate of candidates) {\n if (typeof candidate !== 'string') continue\n const trimmed = candidate.trim()\n if (trimmed.length > 0) return trimmed\n }\n return null\n}\n\nfunction appendLine(lines: string[], label: string, value: unknown) {\n if (value === null || value === undefined) return\n const text = Array.isArray(value)\n ? value.map((item) => (item == null ? '' : String(item))).filter(Boolean).join(', ')\n : typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)\n if (!text.trim()) return\n lines.push(`${label}: ${text}`)\n}\n\nfunction formatSubtitle(...parts: Array<unknown>): string | undefined {\n const values = parts\n .map((part) => (part == null ? '' : String(part)).trim())\n .filter(Boolean)\n if (!values.length) return undefined\n return values.join(' \u00B7 ')\n}\n\nfunction buildIndexSource(\n ctx: SearchBuildContext,\n presenter: SearchResultPresenter,\n lines: string[],\n): SearchIndexSource | null {\n for (const [key, value] of Object.entries(ctx.customFields)) {\n appendLine(lines, key.replace(/^cf:/, ''), value)\n }\n if (!lines.length) return null\n return {\n text: lines,\n presenter,\n checksumSource: { record: ctx.record, customFields: ctx.customFields },\n }\n}\n\nfunction buildWarehousePresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.warehouse', 'Warehouse')\n const title = pickString(record.name, record.code, record.id) ?? label\n const subtitle = formatSubtitle(record.code, record.city, record.country)\n return { title, subtitle, icon: 'warehouse' }\n}\n\nfunction buildLocationPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.location', 'Location')\n const title = pickString(record.code, record.id) ?? label\n const subtitle = formatSubtitle(record.type, record.warehouse_id ?? record.warehouseId)\n return { title, subtitle, icon: 'map-pinned' }\n}\n\nfunction buildInventoryProfilePresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.inventoryProfile', 'Inventory profile')\n const productId = pickString(record.catalog_product_id, record.catalogProductId)\n const variantId = pickString(record.catalog_variant_id, record.catalogVariantId)\n const title = variantId || productId || pickString(record.id) || label\n const subtitle = formatSubtitle(\n record.default_strategy ?? record.defaultStrategy,\n record.default_uom ?? record.defaultUom,\n variantId ? t('wms.search.profile.variantScoped', 'Variant-scoped') : t('wms.search.profile.productScoped', 'Product-scoped'),\n )\n return { title, subtitle, icon: 'boxes' }\n}\n\nfunction buildLotPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.lot', 'Inventory lot')\n const title = pickString(record.lot_number, record.lotNumber, record.batch_number, record.batchNumber, record.id) ?? label\n const subtitle = formatSubtitle(record.catalog_variant_id ?? record.catalogVariantId, record.status, record.expires_at ?? record.expiresAt)\n return { title, subtitle, icon: 'package-search' }\n}\n\nfunction buildAsnPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.asn', 'ASN')\n const title =\n pickString(record.reference_number, record.referenceNumber, record.id) ?? label\n const subtitle = formatSubtitle(\n record.status,\n record.warehouse_id ?? record.warehouseId,\n record.expected_at ?? record.expectedAt,\n )\n return { title, subtitle, icon: 'truck', badge: label }\n}\n\nfunction buildPutawayPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.putaway', 'Putaway task')\n const title =\n pickString(record.catalog_variant_id, record.catalogVariantId, record.id) ?? label\n const subtitle = formatSubtitle(\n record.status,\n record.warehouse_id ?? record.warehouseId,\n record.source_location_id ?? record.sourceLocationId,\n record.target_location_id ?? record.targetLocationId,\n )\n return { title, subtitle, icon: 'package', badge: label }\n}\n\nexport const searchConfig: SearchModuleConfig = {\n entities: [\n {\n entityId: E.wms.warehouse,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 8,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Name', record.name)\n appendLine(lines, 'Code', record.code)\n appendLine(lines, 'City', record.city)\n appendLine(lines, 'Country', record.country)\n appendLine(lines, 'Timezone', record.timezone)\n return buildIndexSource(ctx, buildWarehousePresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildWarehousePresenter(t, ctx.record)\n },\n resolveUrl: async () => WMS_CONFIG_URL,\n fieldPolicy: {\n searchable: ['name', 'code', 'city', 'country', 'timezone'],\n },\n },\n {\n entityId: E.wms.warehouse_location,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 7,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Code', record.code)\n appendLine(lines, 'Type', record.type)\n appendLine(lines, 'Warehouse', record.warehouse_id ?? record.warehouseId)\n appendLine(lines, 'Parent', record.parent_id ?? record.parentId)\n appendLine(lines, 'Capacity units', record.capacity_units ?? record.capacityUnits)\n appendLine(lines, 'Capacity weight', record.capacity_weight ?? record.capacityWeight)\n return buildIndexSource(ctx, buildLocationPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildLocationPresenter(t, ctx.record)\n },\n resolveUrl: async () => WMS_CONFIG_URL,\n fieldPolicy: {\n searchable: ['code', 'type', 'warehouse_id', 'parent_id', 'capacity_units', 'capacity_weight'],\n },\n },\n {\n entityId: E.wms.product_inventory_profile,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 8,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Product', record.catalog_product_id ?? record.catalogProductId)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Default UOM', record.default_uom ?? record.defaultUom)\n appendLine(lines, 'Strategy', record.default_strategy ?? record.defaultStrategy)\n appendLine(lines, 'Reorder point', record.reorder_point ?? record.reorderPoint)\n appendLine(lines, 'Safety stock', record.safety_stock ?? record.safetyStock)\n appendLine(lines, 'Track lot', record.track_lot ?? record.trackLot)\n appendLine(lines, 'Track serial', record.track_serial ?? record.trackSerial)\n appendLine(lines, 'Track expiration', record.track_expiration ?? record.trackExpiration)\n return buildIndexSource(ctx, buildInventoryProfilePresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildInventoryProfilePresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const variantId = pickString(ctx.record.catalog_variant_id, ctx.record.catalogVariantId)\n if (variantId) return `${WMS_ROOT_URL}/sku/${variantId}`\n return WMS_CONFIG_URL\n },\n resolveLinks: async () => [{ href: WMS_INVENTORY_URL, label: 'Inventory console', kind: 'secondary' }],\n fieldPolicy: {\n searchable: [\n 'catalog_product_id',\n 'catalog_variant_id',\n 'default_uom',\n 'default_strategy',\n 'reorder_point',\n 'safety_stock',\n ],\n },\n },\n {\n entityId: E.wms.inventory_lot,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 6,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Lot number', record.lot_number ?? record.lotNumber)\n appendLine(lines, 'Batch number', record.batch_number ?? record.batchNumber)\n appendLine(lines, 'SKU', record.sku)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Status', record.status)\n appendLine(lines, 'Expires at', record.expires_at ?? record.expiresAt)\n return buildIndexSource(ctx, buildLotPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildLotPresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const id = pickString(ctx.record.id)\n if (id) return `${WMS_ROOT_URL}/lot/${id}`\n return WMS_ROOT_URL\n },\n resolveLinks: async () => [{ href: WMS_CONFIG_URL, label: 'WMS configuration', kind: 'secondary' }],\n fieldPolicy: {\n searchable: ['lot_number', 'batch_number', 'sku', 'catalog_variant_id', 'status', 'expires_at'],\n },\n },\n {\n entityId: E.wms.asn,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 7,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Reference', record.reference_number ?? record.referenceNumber)\n appendLine(lines, 'Status', record.status)\n appendLine(lines, 'Warehouse', record.warehouse_id ?? record.warehouseId)\n appendLine(lines, 'Vendor', record.vendor_id ?? record.vendorId)\n appendLine(lines, 'Expected at', record.expected_at ?? record.expectedAt)\n appendLine(lines, 'Notes', record.notes)\n return buildIndexSource(ctx, buildAsnPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildAsnPresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const id = pickString(ctx.record.id)\n if (id) return `${WMS_ROOT_URL}/asns/${id}`\n return WMS_ROOT_URL\n },\n fieldPolicy: {\n searchable: ['reference_number', 'status', 'warehouse_id', 'vendor_id', 'notes'],\n },\n },\n {\n entityId: E.wms.putaway_task,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 6,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Status', record.status)\n appendLine(lines, 'Warehouse', record.warehouse_id ?? record.warehouseId)\n appendLine(lines, 'Source', record.source_location_id ?? record.sourceLocationId)\n appendLine(lines, 'Target', record.target_location_id ?? record.targetLocationId)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Assigned to', record.assigned_to ?? record.assignedTo)\n appendLine(lines, 'Quantity', record.quantity)\n return buildIndexSource(ctx, buildPutawayPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildPutawayPresenter(t, ctx.record)\n },\n resolveUrl: async () => `${WMS_ROOT_URL}/putaway`,\n fieldPolicy: {\n searchable: [\n 'status',\n 'warehouse_id',\n 'source_location_id',\n 'target_location_id',\n 'catalog_variant_id',\n 'assigned_to',\n ],\n },\n },\n ],\n}\n\nexport default searchConfig\nexport const config = searchConfig\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,14 @@
1
+ import { reevaluateReservationsAfterStockIncrease } from "../lib/salesOrderInventoryAutomation.js";
2
+ const metadata = {
3
+ event: "wms.asn.line_received",
4
+ persistent: true,
5
+ id: "wms:asn-line-received-reevaluate-reservations"
6
+ };
7
+ async function handle(payload, ctx) {
8
+ await reevaluateReservationsAfterStockIncrease(payload, ctx);
9
+ }
10
+ export {
11
+ handle as default,
12
+ metadata
13
+ };
14
+ //# sourceMappingURL=asn-line-received-reevaluate-reservations.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/wms/subscribers/asn-line-received-reevaluate-reservations.ts"],
4
+ "sourcesContent": ["import { reevaluateReservationsAfterStockIncrease } from '../lib/salesOrderInventoryAutomation'\n\nexport const metadata = {\n event: 'wms.asn.line_received',\n persistent: true,\n id: 'wms:asn-line-received-reevaluate-reservations',\n}\n\ntype SubscriberContext = {\n resolve: <T = unknown>(name: string) => T\n}\n\ntype AsnLineReceivedPayload = {\n catalogVariantId?: string | null\n tenantId?: string | null\n organizationId?: string | null\n}\n\nexport default async function handle(payload: AsnLineReceivedPayload, ctx: SubscriberContext) {\n await reevaluateReservationsAfterStockIncrease(payload, ctx)\n}\n"],
5
+ "mappings": "AAAA,SAAS,gDAAgD;AAElD,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAYA,eAAO,OAA8B,SAAiC,KAAwB;AAC5F,QAAM,yCAAyC,SAAS,GAAG;AAC7D;",
6
+ "names": []
7
+ }
@@ -0,0 +1,12 @@
1
+ import { createInventoryEnricherCacheHandler } from "../lib/inventoryEnricherCacheSubscriber.js";
2
+ const metadata = {
3
+ event: "wms.asn.*",
4
+ persistent: false,
5
+ id: "wms:invalidate-enricher-cache-asn"
6
+ };
7
+ var invalidate_enricher_cache_asn_default = createInventoryEnricherCacheHandler("inventory");
8
+ export {
9
+ invalidate_enricher_cache_asn_default as default,
10
+ metadata
11
+ };
12
+ //# sourceMappingURL=invalidate-enricher-cache-asn.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/wms/subscribers/invalidate-enricher-cache-asn.ts"],
4
+ "sourcesContent": ["import { createInventoryEnricherCacheHandler } from '../lib/inventoryEnricherCacheSubscriber'\n\n// Sales-order enricher `inboundSummary` aggregates open ASN rows (`draft` /\n// `in_transit`). ASN lifecycle writes change that projection without always\n// touching balances, so they need their own invalidation family.\nexport const metadata = {\n event: 'wms.asn.*',\n persistent: false,\n id: 'wms:invalidate-enricher-cache-asn',\n}\n\nexport default createInventoryEnricherCacheHandler('inventory')\n"],
5
+ "mappings": "AAAA,SAAS,2CAA2C;AAK7C,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAEA,IAAO,wCAAQ,oCAAoC,WAAW;",
6
+ "names": []
7
+ }
@@ -0,0 +1,163 @@
1
+ import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
2
+ import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
3
+ import { createLogger } from "@open-mercato/shared/lib/logger";
4
+ import { getTelemetryRuntime } from "@open-mercato/shared/lib/telemetry/runtime";
5
+ import { Asn } from "../data/entities.js";
6
+ import { resolveWmsIntegrationToggleEnabled } from "../lib/wmsIntegrationToggles.js";
7
+ const logger = createLogger("wms");
8
+ const metadata = {
9
+ event: "procurement.goods_receipt.created",
10
+ persistent: true,
11
+ id: "wms:procurement-goods-receipt-created"
12
+ };
13
+ function buildProcurementGoodsReceiptSourceKey(goodsReceiptId) {
14
+ return `procurement.goods_receipt:${goodsReceiptId}`;
15
+ }
16
+ function tryResolve(ctx, name) {
17
+ try {
18
+ return ctx.resolve(name);
19
+ } catch {
20
+ return void 0;
21
+ }
22
+ }
23
+ function asUuid(value) {
24
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
25
+ }
26
+ function toPositiveQuantity(value) {
27
+ const numeric = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
28
+ if (!Number.isFinite(numeric) || numeric <= 0) return null;
29
+ return numeric;
30
+ }
31
+ function isUniqueConstraintError(error) {
32
+ if (!error || typeof error !== "object") return false;
33
+ const code = error.code;
34
+ if (code === "23505") return true;
35
+ const name = error.name;
36
+ if (name === "UniqueConstraintViolationException") return true;
37
+ const cause = error.cause;
38
+ if (cause && cause !== error) return isUniqueConstraintError(cause);
39
+ const driverError = error.driverError;
40
+ if (driverError && driverError !== error) return isUniqueConstraintError(driverError);
41
+ return false;
42
+ }
43
+ async function findExistingAsnForGoodsReceipt(em, scope, goodsReceiptId, sourceKey) {
44
+ const bySourceKey = await findOneWithDecryption(
45
+ em,
46
+ Asn,
47
+ {
48
+ organizationId: scope.organizationId,
49
+ tenantId: scope.tenantId,
50
+ sourceKey,
51
+ deletedAt: null
52
+ },
53
+ void 0,
54
+ scope
55
+ );
56
+ if (bySourceKey) return bySourceKey;
57
+ return findOneWithDecryption(
58
+ em,
59
+ Asn,
60
+ {
61
+ organizationId: scope.organizationId,
62
+ tenantId: scope.tenantId,
63
+ referenceNumber: goodsReceiptId,
64
+ deletedAt: null
65
+ },
66
+ void 0,
67
+ scope
68
+ );
69
+ }
70
+ async function handle(payload, ctx) {
71
+ const tenantId = asUuid(payload.tenantId);
72
+ const organizationId = asUuid(payload.organizationId);
73
+ if (!tenantId || !organizationId) return;
74
+ const featureTogglesService = tryResolve(ctx, "featureTogglesService");
75
+ const emRoot = tryResolve(ctx, "em");
76
+ const commandBus = tryResolve(ctx, "commandBus");
77
+ if (!featureTogglesService || !emRoot || !commandBus) return;
78
+ const enabled = await resolveWmsIntegrationToggleEnabled(
79
+ featureTogglesService,
80
+ emRoot,
81
+ "wms_integration_procurement_goods_receipt",
82
+ tenantId
83
+ );
84
+ if (!enabled) return;
85
+ const warehouseId = asUuid(payload.warehouseId);
86
+ if (!warehouseId) {
87
+ logger.debug("procurement goods receipt skipped: missing warehouseId", {
88
+ goodsReceiptId: payload.id ?? payload.goodsReceiptId ?? null
89
+ });
90
+ return;
91
+ }
92
+ const goodsReceiptId = asUuid(payload.goodsReceiptId) ?? asUuid(payload.id);
93
+ if (!goodsReceiptId) {
94
+ logger.debug("procurement goods receipt skipped: missing goodsReceiptId");
95
+ return;
96
+ }
97
+ const sourceKey = buildProcurementGoodsReceiptSourceKey(goodsReceiptId);
98
+ const referenceNumber = (typeof payload.referenceNumber === "string" && payload.referenceNumber.trim().length > 0 ? payload.referenceNumber.trim() : null) ?? goodsReceiptId;
99
+ const em = emRoot.fork();
100
+ const scope = { organizationId, tenantId };
101
+ const existing = await findExistingAsnForGoodsReceipt(em, scope, goodsReceiptId, sourceKey);
102
+ if (existing) return;
103
+ const expectedAt = payload.expectedAt instanceof Date ? payload.expectedAt : typeof payload.expectedAt === "string" && payload.expectedAt.trim().length > 0 ? new Date(payload.expectedAt) : /* @__PURE__ */ new Date();
104
+ const lines = (payload.lines ?? []).map((line) => {
105
+ const catalogVariantId = asUuid(line.catalogVariantId);
106
+ const expectedQty = toPositiveQuantity(line.expectedQty);
107
+ if (!catalogVariantId || expectedQty == null) return null;
108
+ return {
109
+ catalogVariantId,
110
+ expectedQty,
111
+ lotNumber: typeof line.lotNumber === "string" && line.lotNumber.trim().length > 0 ? line.lotNumber.trim() : null
112
+ };
113
+ }).filter((line) => line !== null);
114
+ const commandCtx = {
115
+ container: { resolve: ctx.resolve },
116
+ auth: null,
117
+ organizationScope: null,
118
+ selectedOrganizationId: organizationId,
119
+ organizationIds: [organizationId]
120
+ };
121
+ const { translate } = await resolveTranslations();
122
+ const notes = translate(
123
+ "wms.subscribers.procurementGoodsReceipt.asnNotes",
124
+ "Created from procurement goods receipt {goodsReceiptId}",
125
+ { goodsReceiptId }
126
+ );
127
+ try {
128
+ await commandBus.execute("wms.asns.create", {
129
+ input: {
130
+ organizationId,
131
+ tenantId,
132
+ warehouseId,
133
+ vendorId: asUuid(payload.vendorId),
134
+ status: "draft",
135
+ expectedAt,
136
+ referenceNumber,
137
+ sourceKey,
138
+ notes,
139
+ lines,
140
+ metadata: {
141
+ source: "procurement.goods_receipt.created",
142
+ goodsReceiptId
143
+ }
144
+ },
145
+ ctx: commandCtx
146
+ });
147
+ } catch (err) {
148
+ if (isUniqueConstraintError(err)) return;
149
+ logger.error("procurement goods receipt ASN create failed", { err, goodsReceiptId });
150
+ getTelemetryRuntime()?.reportError(err, {
151
+ module: "wms",
152
+ code: "wms.procurement_goods_receipt_asn_create_failed",
153
+ attributes: { goodsReceiptId }
154
+ });
155
+ throw err;
156
+ }
157
+ }
158
+ export {
159
+ buildProcurementGoodsReceiptSourceKey,
160
+ handle as default,
161
+ metadata
162
+ };
163
+ //# sourceMappingURL=procurement-goods-receipt-created.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/wms/subscribers/procurement-goods-receipt-created.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { CommandBus, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport type { FeatureTogglesService } from '@open-mercato/core/modules/feature_toggles/lib/feature-flag-check'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { getTelemetryRuntime } from '@open-mercato/shared/lib/telemetry/runtime'\nimport { Asn } from '../data/entities'\nimport { resolveWmsIntegrationToggleEnabled } from '../lib/wmsIntegrationToggles'\n\nconst logger = createLogger('wms')\n\nexport const metadata = {\n event: 'procurement.goods_receipt.created',\n persistent: true,\n id: 'wms:procurement-goods-receipt-created',\n}\n\ntype SubscriberContext = {\n resolve: <T = unknown>(name: string) => T\n}\n\n/**\n * Assumed procurement.goods_receipt.created payload (procurement module is\n * optional / thin today). Fields beyond id + scope are best-effort:\n *\n * - id / goodsReceiptId: required for idempotent create via Asn.sourceKey\n * - warehouseId (required to create): destination warehouse UUID\n * - vendorId?: customers UUID\n * - expectedAt?: ISO date (defaults to now)\n * - referenceNumber?: external PO/GRN display reference (falls back to goods receipt id;\n * not used as the uniqueness key \u2014 free-form refs may legitimately collide)\n * - tenantId / organizationId: required scope\n * - lines?: [{ catalogVariantId, expectedQty, lotNumber? }]\n *\n * When the toggle is off, required fields are missing, or peers are absent,\n * this subscriber no-ops.\n */\ntype GoodsReceiptCreatedPayload = {\n id?: string | null\n goodsReceiptId?: string | null\n warehouseId?: string | null\n vendorId?: string | null\n expectedAt?: string | Date | null\n referenceNumber?: string | null\n tenantId?: string | null\n organizationId?: string | null\n lines?: Array<{\n catalogVariantId?: string | null\n expectedQty?: string | number | null\n lotNumber?: string | null\n }> | null\n}\n\nexport function buildProcurementGoodsReceiptSourceKey(goodsReceiptId: string): string {\n return `procurement.goods_receipt:${goodsReceiptId}`\n}\n\nfunction tryResolve<T>(ctx: SubscriberContext, name: string): T | undefined {\n try {\n return ctx.resolve<T>(name)\n } catch {\n return undefined\n }\n}\n\nfunction asUuid(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nfunction toPositiveQuantity(value: unknown): number | null {\n const numeric = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN\n if (!Number.isFinite(numeric) || numeric <= 0) return null\n return numeric\n}\n\nfunction isUniqueConstraintError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false\n const code = (error as { code?: string }).code\n if (code === '23505') return true\n const name = (error as { name?: string }).name\n if (name === 'UniqueConstraintViolationException') return true\n const cause = (error as { cause?: unknown }).cause\n if (cause && cause !== error) return isUniqueConstraintError(cause)\n const driverError = (error as { driverError?: unknown }).driverError\n if (driverError && driverError !== error) return isUniqueConstraintError(driverError)\n return false\n}\n\nasync function findExistingAsnForGoodsReceipt(\n em: EntityManager,\n scope: { organizationId: string; tenantId: string },\n goodsReceiptId: string,\n sourceKey: string,\n): Promise<Asn | null> {\n const bySourceKey = await findOneWithDecryption(\n em,\n Asn,\n {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n sourceKey,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n if (bySourceKey) return bySourceKey\n\n // Legacy Story-4 ASNs keyed only by referenceNumber = goodsReceiptId (no source_key).\n return findOneWithDecryption(\n em,\n Asn,\n {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n referenceNumber: goodsReceiptId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nexport default async function handle(payload: GoodsReceiptCreatedPayload, ctx: SubscriberContext) {\n const tenantId = asUuid(payload.tenantId)\n const organizationId = asUuid(payload.organizationId)\n if (!tenantId || !organizationId) return\n\n const featureTogglesService = tryResolve<FeatureTogglesService>(ctx, 'featureTogglesService')\n const emRoot = tryResolve<EntityManager>(ctx, 'em')\n const commandBus = tryResolve<CommandBus>(ctx, 'commandBus')\n if (!featureTogglesService || !emRoot || !commandBus) return\n\n const enabled = await resolveWmsIntegrationToggleEnabled(\n featureTogglesService,\n emRoot,\n 'wms_integration_procurement_goods_receipt',\n tenantId,\n )\n if (!enabled) return\n\n const warehouseId = asUuid(payload.warehouseId)\n if (!warehouseId) {\n logger.debug('procurement goods receipt skipped: missing warehouseId', {\n goodsReceiptId: payload.id ?? payload.goodsReceiptId ?? null,\n })\n return\n }\n\n const goodsReceiptId = asUuid(payload.goodsReceiptId) ?? asUuid(payload.id)\n if (!goodsReceiptId) {\n logger.debug('procurement goods receipt skipped: missing goodsReceiptId')\n return\n }\n\n const sourceKey = buildProcurementGoodsReceiptSourceKey(goodsReceiptId)\n const referenceNumber =\n (typeof payload.referenceNumber === 'string' && payload.referenceNumber.trim().length > 0\n ? payload.referenceNumber.trim()\n : null) ?? goodsReceiptId\n\n const em = emRoot.fork()\n const scope = { organizationId, tenantId }\n // Match by sourceKey (any status) so retries never create a second ASN.\n const existing = await findExistingAsnForGoodsReceipt(em, scope, goodsReceiptId, sourceKey)\n if (existing) return\n\n const expectedAt =\n payload.expectedAt instanceof Date\n ? payload.expectedAt\n : typeof payload.expectedAt === 'string' && payload.expectedAt.trim().length > 0\n ? new Date(payload.expectedAt)\n : new Date()\n\n const lines = (payload.lines ?? [])\n .map((line) => {\n const catalogVariantId = asUuid(line.catalogVariantId)\n const expectedQty = toPositiveQuantity(line.expectedQty)\n if (!catalogVariantId || expectedQty == null) return null\n return {\n catalogVariantId,\n expectedQty,\n lotNumber:\n typeof line.lotNumber === 'string' && line.lotNumber.trim().length > 0\n ? line.lotNumber.trim()\n : null,\n }\n })\n .filter((line): line is NonNullable<typeof line> => line !== null)\n\n const commandCtx: CommandRuntimeContext = {\n container: { resolve: ctx.resolve } as CommandRuntimeContext['container'],\n auth: null,\n organizationScope: null,\n selectedOrganizationId: organizationId,\n organizationIds: [organizationId],\n }\n\n const { translate } = await resolveTranslations()\n const notes = translate(\n 'wms.subscribers.procurementGoodsReceipt.asnNotes',\n 'Created from procurement goods receipt {goodsReceiptId}',\n { goodsReceiptId },\n )\n\n try {\n await commandBus.execute('wms.asns.create', {\n input: {\n organizationId,\n tenantId,\n warehouseId,\n vendorId: asUuid(payload.vendorId),\n status: 'draft',\n expectedAt,\n referenceNumber,\n sourceKey,\n notes,\n lines,\n metadata: {\n source: 'procurement.goods_receipt.created',\n goodsReceiptId,\n },\n },\n ctx: commandCtx,\n })\n } catch (err) {\n // Concurrent duplicate events: unique (organization_id, source_key) wins; loser is idempotent.\n if (isUniqueConstraintError(err)) return\n logger.error('procurement goods receipt ASN create failed', { err, goodsReceiptId })\n getTelemetryRuntime()?.reportError(err, {\n module: 'wms',\n code: 'wms.procurement_goods_receipt_asn_create_failed',\n attributes: { goodsReceiptId },\n })\n throw err\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ import { reevaluateReservationsAfterStockIncrease } from "../lib/salesOrderInventoryAutomation.js";
2
+ const metadata = {
3
+ event: "wms.putaway.completed",
4
+ persistent: true,
5
+ id: "wms:putaway-completed-reevaluate-reservations"
6
+ };
7
+ async function handle(payload, ctx) {
8
+ await reevaluateReservationsAfterStockIncrease(payload, ctx);
9
+ }
10
+ export {
11
+ handle as default,
12
+ metadata
13
+ };
14
+ //# sourceMappingURL=putaway-completed-reevaluate-reservations.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/wms/subscribers/putaway-completed-reevaluate-reservations.ts"],
4
+ "sourcesContent": ["import { reevaluateReservationsAfterStockIncrease } from '../lib/salesOrderInventoryAutomation'\n\nexport const metadata = {\n event: 'wms.putaway.completed',\n persistent: true,\n id: 'wms:putaway-completed-reevaluate-reservations',\n}\n\ntype SubscriberContext = {\n resolve: <T = unknown>(name: string) => T\n}\n\ntype PutawayCompletedPayload = {\n catalogVariantId?: string | null\n tenantId?: string | null\n organizationId?: string | null\n}\n\nexport default async function handle(payload: PutawayCompletedPayload, ctx: SubscriberContext) {\n await reevaluateReservationsAfterStockIncrease(payload, ctx)\n}\n"],
5
+ "mappings": "AAAA,SAAS,gDAAgD;AAElD,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAYA,eAAO,OAA8B,SAAkC,KAAwB;AAC7F,QAAM,yCAAyC,SAAS,GAAG;AAC7D;",
6
+ "names": []
7
+ }
@@ -74,6 +74,37 @@ function SalesOrderStockContextWidget(props) {
74
74
  () => Array.isArray(wms?.stockSummary) ? wms.stockSummary : [],
75
75
  [wms?.stockSummary]
76
76
  );
77
+ const activeReservations = React.useMemo(() => {
78
+ const enriched = Array.isArray(wms?.reservationSummary?.reservations) ? wms.reservationSummary?.reservations ?? [] : [];
79
+ const fromEnriched = enriched.map((item) => {
80
+ const id = typeof item?.id === "string" ? item.id : null;
81
+ if (!id) return null;
82
+ const reservationLabel = typeof item.reservationLabel === "string" && item.reservationLabel.trim().length > 0 ? item.reservationLabel.trim() : id;
83
+ return {
84
+ id,
85
+ reservationLabel,
86
+ warehouse_name: item.warehouseName ?? null,
87
+ variant_name: item.variantName ?? null,
88
+ variant_sku: item.variantSku ?? null,
89
+ quantity: item.quantity ?? null
90
+ };
91
+ }).filter((item) => item !== null);
92
+ if (fromEnriched.length > 0) return fromEnriched;
93
+ const ids = Array.isArray(wms?.reservationSummary?.reservationIds) ? wms.reservationSummary?.reservationIds ?? [] : [];
94
+ return ids.filter((id) => typeof id === "string" && id.length > 0).map((id) => ({
95
+ id,
96
+ reservationLabel: id,
97
+ warehouse_name: null,
98
+ variant_name: null,
99
+ variant_sku: null,
100
+ quantity: null
101
+ }));
102
+ }, [wms?.reservationSummary?.reservationIds, wms?.reservationSummary?.reservations]);
103
+ const releaseReservation = React.useMemo(() => {
104
+ if (!releaseReservationId) return null;
105
+ const match = activeReservations.find((item) => item.id === releaseReservationId);
106
+ return match ?? { id: releaseReservationId };
107
+ }, [activeReservations, releaseReservationId]);
77
108
  React.useEffect(() => {
78
109
  const variantIds = stockSummary.map((item) => item.catalogVariantId).filter((id) => !!id);
79
110
  if (variantIds.length === 0) return;
@@ -201,8 +232,6 @@ function SalesOrderStockContextWidget(props) {
201
232
  }, [orderId, organizationId, router, t, tenantId]);
202
233
  if (!wms) return null;
203
234
  const reservationStatus = wms.reservationSummary?.status ?? "unreserved";
204
- const reservationIds = Array.isArray(wms.reservationSummary?.reservationIds) ? wms.reservationSummary?.reservationIds ?? [] : [];
205
- const releaseReservation = releaseReservationId ? { id: releaseReservationId } : null;
206
235
  return /* @__PURE__ */ jsxs("div", { className: "rounded-lg border bg-card px-4 py-3 space-y-4", children: [
207
236
  /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
208
237
  /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
@@ -269,7 +298,7 @@ function SalesOrderStockContextWidget(props) {
269
298
  "wms.widgets.sales.stockContext.reservationCount",
270
299
  "Reservation records"
271
300
  ) }),
272
- /* @__PURE__ */ jsx("dd", { className: "font-medium", children: reservationIds.length })
301
+ /* @__PURE__ */ jsx("dd", { className: "font-medium", children: activeReservations.length })
273
302
  ] })
274
303
  ] }),
275
304
  stockSummary.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
@@ -313,17 +342,17 @@ function SalesOrderStockContextWidget(props) {
313
342
  "wms.widgets.sales.stockContext.empty",
314
343
  "No WMS stock summary is available for this order yet."
315
344
  ) }),
316
- access.canRelease && reservationIds.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
345
+ access.canRelease && activeReservations.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
317
346
  /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: t(
318
347
  "wms.widgets.sales.stockContext.reservationsTitle",
319
348
  "Active reservations"
320
349
  ) }),
321
- /* @__PURE__ */ jsx("div", { className: "space-y-1", children: reservationIds.map((rid) => /* @__PURE__ */ jsxs(
350
+ /* @__PURE__ */ jsx("div", { className: "space-y-1", children: activeReservations.map((reservation) => /* @__PURE__ */ jsxs(
322
351
  "div",
323
352
  {
324
353
  className: "flex items-center justify-between gap-2 rounded-md border border-border/70 bg-background px-3 py-1.5",
325
354
  children: [
326
- /* @__PURE__ */ jsx("span", { className: "font-mono text-xs text-muted-foreground truncate", children: rid }),
355
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-foreground truncate", title: reservation.reservationLabel, children: reservation.reservationLabel }),
327
356
  /* @__PURE__ */ jsxs(
328
357
  Button,
329
358
  {
@@ -331,7 +360,7 @@ function SalesOrderStockContextWidget(props) {
331
360
  variant: "ghost",
332
361
  size: "sm",
333
362
  className: "h-6 shrink-0 px-2 text-xs text-status-error-fg hover:text-status-error-fg",
334
- onClick: () => setReleaseReservationId(rid),
363
+ onClick: () => setReleaseReservationId(reservation.id),
335
364
  children: [
336
365
  /* @__PURE__ */ jsx(ShieldOff, { className: "size-3 mr-1" }),
337
366
  t("wms.widgets.sales.stockContext.releaseBtn", "Release")
@@ -340,7 +369,7 @@ function SalesOrderStockContextWidget(props) {
340
369
  )
341
370
  ]
342
371
  },
343
- rid
372
+ reservation.id
344
373
  )) })
345
374
  ] }) : null,
346
375
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [