<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.TimerTrigger$TimerTriggerCause'><shortDescription>Started by timer</shortDescription></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesorigindev _class='hudson.plugins.git.util.Build'><buildNumber>745</buildNumber><marked><SHA1>e8c7fd8e4778aacc2e5850afe4f018b87a3b763e</SHA1><branch><SHA1>e8c7fd8e4778aacc2e5850afe4f018b87a3b763e</SHA1><name>refs/remotes/origin/dev</name></branch></marked><revision><SHA1>e8c7fd8e4778aacc2e5850afe4f018b87a3b763e</SHA1><branch><SHA1>e8c7fd8e4778aacc2e5850afe4f018b87a3b763e</SHA1><name>refs/remotes/origin/dev</name></branch></revision></refsremotesorigindev></buildsByBranchName><lastBuiltRevision><SHA1>e8c7fd8e4778aacc2e5850afe4f018b87a3b763e</SHA1><branch><SHA1>e8c7fd8e4778aacc2e5850afe4f018b87a3b763e</SHA1><name>refs/remotes/origin/dev</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/erp-nuxt-frontend.git</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#745</displayName><duration>63351</duration><estimatedDuration>61503</estimatedDuration><fullDisplayName>build-logship-frontend #745</fullDisplayName><id>745</id><inProgress>false</inProgress><keepLog>false</keepLog><number>745</number><queueId>5767</queueId><result>SUCCESS</result><timestamp>1790121600766</timestamp><url>https://jenkins.younex.de/job/build-logship-frontend/745/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/AgGrid/Products/AgTrackingUnits.vue</affectedPath><affectedPath>app/composables/useReceiptTracking.ts</affectedPath><affectedPath>app/components/receive/TrackingCaptureModal.vue</affectedPath><affectedPath>app/pages/mobile/receive.vue</affectedPath><affectedPath>server/api/materials/products/[id]/tracking.post.ts</affectedPath><affectedPath>app/composables/menu/admin/materials.ts</affectedPath><affectedPath>server/utils/productsGrid.ts</affectedPath><affectedPath>server/utils/attributeTracking.ts</affectedPath><affectedPath>server/api/inouts/store.post.ts</affectedPath><affectedPath>server/api/materials/products/ag-grid/products.post.ts</affectedPath><affectedPath>app/components/materials/ProductUnitsPanel.vue</affectedPath><affectedPath>server/api/materials/products/ag-grid/products-v2.post.ts</affectedPath><affectedPath>app/components/AgGrid/Products/AgTrackingMode.vue</affectedPath><affectedPath>server/api/materials/tracking-overview.get.ts</affectedPath><affectedPath>app/pages/materials/products-v2/index.vue</affectedPath><affectedPath>app/pages/integrations/receive-desktop.vue</affectedPath><affectedPath>server/api/orders/[id]/order-line/index.get.ts</affectedPath><affectedPath>app/components/MainNavigationMenu.vue</affectedPath><affectedPath>app/components/receive/TrackingEnableDialog.vue</affectedPath><affectedPath>reference/recipes.md</affectedPath><affectedPath>server/api/materials/products/[id]/units.get.ts</affectedPath><affectedPath>server/api/inouts/check-serials.post.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><affectedPath>server/api/mobile/product-lookup.post.ts</affectedPath><commitId>5297eb3c1feed3bb828a0ac35972b89c90c8f744</commitId><timestamp>1790067723000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Unit tracking on goods receipt: serial numbers and charges (lot + MHD) as iDempiere attribute set instances

Port of the blut24 ASI mechanics to the LogShip catalogue. Three attribute sets are created lazily by name
(LogShip Seriennummer / Charge / Seriennummer + Charge, all fields optional, FEFO via
UseGuaranteeDateForMPolicy); a product is tracked when its M_AttributeSet_ID points at one of them.

Server: attributeTracking.ts (set bootstrap + cache, ASI create/lookup, line expansion) hooked into
POST /api/inouts/store — a receive line may carry tracking { attributeSetId, serials[], charges[] } and is
expanded into one qty-1 line per serial, one line per charge (identical set/org/lot/MHD charges reused),
remainder untracked; serials already in stock are rejected with a 400 before anything is written. New
routes products/[id]/tracking (enable/switch/clear), products/[id]/units, materials/tracking-overview,
inouts/check-serials, ag-grid/products-v2 (grid body shared via productsGrid.ts); product-lookup and
orders/[id]/order-line return the tracking flags and C_UOM_ID.

Desktop receive: per-line tracking chip, enable dialog, capture modal with scan/paste input, CSV import
(serial;lot;mhd[;qty], header optional), several lot/MHD groups per position, in-stock serial warnings,
warn + confirm on incomplete capture. Mobile receive: serial scan mode (every scan = one serial until the
qty is reached), one lot/MHD per position via native inputs with the scanner-focus pause, mode picker,
incomplete-capture confirm; fixes the stray "On" before &lt;script setup&gt;. Staff-only products clone
/materials/products-v2 with Tracking + Einheiten columns and a units side panel; menu entries only in the
staff branches. Recipe added to reference/recipes.md.
</comment><date>2026-09-22 11:02:03 +0200</date><id>5297eb3c1feed3bb828a0ac35972b89c90c8f744</id><msg>Unit tracking on goods receipt: serial numbers and charges (lot + MHD) as iDempiere attribute set instances</msg><path><editType>edit</editType><file>app/pages/integrations/receive-desktop.vue</file></path><path><editType>add</editType><file>app/composables/useReceiptTracking.ts</file></path><path><editType>edit</editType><file>server/api/materials/products/ag-grid/products.post.ts</file></path><path><editType>add</editType><file>app/components/AgGrid/Products/AgTrackingMode.vue</file></path><path><editType>add</editType><file>app/pages/materials/products-v2/index.vue</file></path><path><editType>edit</editType><file>app/components/MainNavigationMenu.vue</file></path><path><editType>add</editType><file>server/api/materials/tracking-overview.get.ts</file></path><path><editType>add</editType><file>app/components/materials/ProductUnitsPanel.vue</file></path><path><editType>add</editType><file>app/components/AgGrid/Products/AgTrackingUnits.vue</file></path><path><editType>add</editType><file>server/api/materials/products/ag-grid/products-v2.post.ts</file></path><path><editType>add</editType><file>app/components/receive/TrackingCaptureModal.vue</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/pages/mobile/receive.vue</file></path><path><editType>edit</editType><file>server/api/mobile/product-lookup.post.ts</file></path><path><editType>edit</editType><file>reference/recipes.md</file></path><path><editType>add</editType><file>server/api/materials/products/[id]/units.get.ts</file></path><path><editType>add</editType><file>server/utils/attributeTracking.ts</file></path><path><editType>add</editType><file>server/utils/productsGrid.ts</file></path><path><editType>edit</editType><file>app/composables/menu/admin/materials.ts</file></path><path><editType>add</editType><file>server/api/materials/products/[id]/tracking.post.ts</file></path><path><editType>edit</editType><file>server/api/inouts/store.post.ts</file></path><path><editType>add</editType><file>server/api/inouts/check-serials.post.ts</file></path><path><editType>edit</editType><file>server/api/orders/[id]/order-line/index.get.ts</file></path><path><editType>add</editType><file>app/components/receive/TrackingEnableDialog.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/materials/products/ag-grid/products-v2.post.ts</affectedPath><affectedPath>app/components/AgGrid/Products/AgTrackingMode.vue</affectedPath><affectedPath>app/composables/useReceiptTracking.ts</affectedPath><affectedPath>app/pages/materials/products-v2/index.vue</affectedPath><affectedPath>app/pages/mobile/receive.vue</affectedPath><affectedPath>server/api/materials/products/[id]/tracking.post.ts</affectedPath><affectedPath>app/components/receive/TrackingEnableDialog.vue</affectedPath><affectedPath>server/utils/attributeTracking.ts</affectedPath><affectedPath>reference/recipes.md</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>c466a90e190da1bede631c4e2904d390acfabf05</commitId><timestamp>1790069095000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Unit tracking: MHD-only mode (LogShip MHD attribute set, no lot)

Fourth lazily created set "LogShip MHD" (IsGuaranteeDate + FEFO, no IsLot) and mode 'mhd' across the
server util, tracking route, products-v2 filter, the composable (label, badge "MHD n/qty"), the desktop
enable dialog (mhd can be widened to charge or both), the mobile mode picker and the products-v2 mode
select; translation key tracking_mhd in all four locales. ensureTrackingSets re-resolves a cached map that
lacks a mode and the tracking route refuses to clear a product when the requested mode's set cannot be
resolved.
</comment><date>2026-09-22 11:24:55 +0200</date><id>c466a90e190da1bede631c4e2904d390acfabf05</id><msg>Unit tracking: MHD-only mode (LogShip MHD attribute set, no lot)</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/components/receive/TrackingEnableDialog.vue</file></path><path><editType>edit</editType><file>app/components/AgGrid/Products/AgTrackingMode.vue</file></path><path><editType>edit</editType><file>server/api/materials/products/[id]/tracking.post.ts</file></path><path><editType>edit</editType><file>reference/recipes.md</file></path><path><editType>edit</editType><file>server/utils/attributeTracking.ts</file></path><path><editType>edit</editType><file>app/pages/materials/products-v2/index.vue</file></path><path><editType>edit</editType><file>app/composables/useReceiptTracking.ts</file></path><path><editType>edit</editType><file>server/api/materials/products/ag-grid/products-v2.post.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/receive.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/orders/openso-generation-queue.get.ts</affectedPath><affectedPath>app/components/sales/GenerateShipmentsPanel.vue</affectedPath><affectedPath>app/pages/mobile/generate-shipments.vue</affectedPath><affectedPath>app/composables/states.ts</affectedPath><affectedPath>app/components/TopMegaBar.vue</affectedPath><affectedPath>server/api/orders/openso-count-by-warehouse.get.ts</affectedPath><affectedPath>app/pages/generate-shipments.vue</affectedPath><affectedPath>app/components/sales/GenerateShipmentsModal.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>afa845908e73499e48e0a4c62dde34934b0c8795</commitId><timestamp>1790070846000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Generate shipments: Simple/Advanced tabs with merchant cards, admin top-bar modal, mobile parity

Simple mode (default) shows one card per merchant (org) with the fulfillable / open
order counts from the dashboard universe (openso-count-by-warehouse now also returns
`fulfillable` per warehouse/org via the same stock rule as unfulfillable-count). All
merchants are in scope by default, cards can be picked to narrow the run; one button
generates for the merchants' warehouses with plain defaults and prints every shipment
right away. Advanced keeps the full parameter form; the merchant cards act as an org
filter for the selected/all warehouse scopes and the sequential queue (new `orgIds`).

The page body moved to components/sales/GenerateShipmentsPanel.vue so the admin
quick link in TopMegaBar can open it in a big modal (GenerateShipmentsModal.vue,
kept alive across closes). Runs set a shared busy flag: the modal asks before
closing, the page guards route leave, both warn on unload; keep-open notices show
on the Advanced tab when a queue-driven filter is on and while any run is going.
Mobile generate-shipments gets the same Simple/Advanced split and merchant cards.
</comment><date>2026-09-22 11:54:06 +0200</date><id>afa845908e73499e48e0a4c62dde34934b0c8795</id><msg>Generate shipments: Simple/Advanced tabs with merchant cards, admin top-bar modal, mobile parity</msg><path><editType>edit</editType><file>server/api/orders/openso-count-by-warehouse.get.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/generate-shipments.vue</file></path><path><editType>edit</editType><file>app/pages/generate-shipments.vue</file></path><path><editType>edit</editType><file>app/components/TopMegaBar.vue</file></path><path><editType>edit</editType><file>app/composables/states.ts</file></path><path><editType>add</editType><file>app/components/sales/GenerateShipmentsModal.vue</file></path><path><editType>edit</editType><file>server/api/orders/openso-generation-queue.get.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>add</editType><file>app/components/sales/GenerateShipmentsPanel.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/TopMegaBar.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>e8c7fd8e4778aacc2e5850afe4f018b87a3b763e</commitId><timestamp>1790073768000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Top bar: admin shortcuts (Shipments modal + Commission page) moved left of the Ticket/Order quick buttons
</comment><date>2026-09-22 12:42:48 +0200</date><id>e8c7fd8e4778aacc2e5850afe4f018b87a3b763e</id><msg>Top bar: admin shortcuts (Shipments modal + Commission page) moved left of the Ticket/Order quick buttons</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/components/TopMegaBar.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit></freeStyleBuild>