<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>770</buildNumber><marked><SHA1>88121ab248ac7b42471936cc209b2c25fe5a095c</SHA1><branch><SHA1>88121ab248ac7b42471936cc209b2c25fe5a095c</SHA1><name>refs/remotes/origin/dev</name></branch></marked><revision><SHA1>88121ab248ac7b42471936cc209b2c25fe5a095c</SHA1><branch><SHA1>88121ab248ac7b42471936cc209b2c25fe5a095c</SHA1><name>refs/remotes/origin/dev</name></branch></revision></refsremotesorigindev></buildsByBranchName><lastBuiltRevision><SHA1>88121ab248ac7b42471936cc209b2c25fe5a095c</SHA1><branch><SHA1>88121ab248ac7b42471936cc209b2c25fe5a095c</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>#770</displayName><duration>67824</duration><estimatedDuration>60620</estimatedDuration><fullDisplayName>build-logship-frontend #770</fullDisplayName><id>770</id><inProgress>false</inProgress><keepLog>false</keepLog><number>770</number><queueId>5840</queueId><result>SUCCESS</result><timestamp>1792281600765</timestamp><url>https://jenkins.younex.de/job/build-logship-frontend/770/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/mail/LeadFollowupModal.vue</affectedPath><affectedPath>app/pages/users/leads/index.vue</affectedPath><affectedPath>server/utils/mail/mailArchive.ts</affectedPath><affectedPath>server/api/mail/lead-followups.get.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>8bf6e253c6d78f1728cdd797a5fb027104968aa3</commitId><timestamp>1792012325000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads list: single-row toolbar + 'Unanswered leads' mailpiler check

- /users/leads header restyled into one toolbar row: phone lookup (with its
  picker), quick search, offer / contract filters, reset, shown/total counter
  on the left; blank questionnaire DE|EN, the new 'Unanswered' button, New and
  Delete on the right (replaces HeaderAction + the two extra filter rows;
  labels collapse to icons on narrower screens)
- New button 'Unanswered' opens &lt;MailLeadFollowupModal&gt;: leads created within
  the last N days (default 30, editable, remembered per browser) whose latest
  e-mail in the mailpiler archive came FROM the lead and got no reaction since
  (no outgoing mail to that address, no C_ContactActivity logged after it).
  Result table: lead, latest mail + waiting days (colour-coded), our last
  reaction before it, buttons to open the lead tab or the archive mail history
- GET /api/mail/lead-followups?days= (staff only, archive only, no IMAP):
  bounded lead + activity queries, one archive lookup per address with
  concurrency 5, auto-replies / bounce notices skipped when picking the
  latest inbound mail; searchArchive() got an optional row limit
- translation keys leads_phone_* / lfm_* (en, de, es)
</comment><date>2026-10-14 23:12:05 +0200</date><id>8bf6e253c6d78f1728cdd797a5fb027104968aa3</id><msg>Leads list: single-row toolbar + 'Unanswered leads' mailpiler check</msg><path><editType>add</editType><file>server/api/mail/lead-followups.get.ts</file></path><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path><path><editType>add</editType><file>app/components/mail/LeadFollowupModal.vue</file></path><path><editType>edit</editType><file>server/utils/mail/mailArchive.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.claude/rules/mail/lead-email-history.md</affectedPath><commitId>002781ab06b897faf85ea38676a5074a2e73a1d0</commitId><timestamp>1792012345000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Mail recipe: note the unanswered-leads check route and its comparison rule
</comment><date>2026-10-14 23:12:25 +0200</date><id>002781ab06b897faf85ea38676a5074a2e73a1d0</id><msg>Mail recipe: note the unanswered-leads check route and its comparison rule</msg><path><editType>edit</editType><file>.claude/rules/mail/lead-email-history.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/users/leads/index.vue</affectedPath><commitId>77bcdba5a25839512b0510aac21a69a89186f6a6</commitId><timestamp>1792012368000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads list: hide the Id and Organization columns (still sorted by id desc, re-enable via the column menu)
</comment><date>2026-10-14 23:12:48 +0200</date><id>77bcdba5a25839512b0510aac21a69a89186f6a6</id><msg>Leads list: hide the Id and Organization columns (still sorted by id desc, re-enable via the column menu)</msg><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/users/leads/index.vue</affectedPath><commitId>acdea33714d2966600ac66e7e76f5c60d3ff9633</commitId><timestamp>1792012414000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads list: Name first, then Company; selection checkbox column hidden (Delete button only appears while rows are selected)
</comment><date>2026-10-14 23:13:34 +0200</date><id>acdea33714d2966600ac66e7e76f5c60d3ff9633</id><msg>Leads list: Name first, then Company; selection checkbox column hidden (Delete button only appears while rows are selected)</msg><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/users/leads/index.vue</affectedPath><commitId>ac7c6254d501fce7a72453e223689f200d8e5512</commitId><timestamp>1792012503000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads list: Created as first column; Name is a link opening the lead's edit page in an in-app tab
</comment><date>2026-10-14 23:15:03 +0200</date><id>ac7c6254d501fce7a72453e223689f200d8e5512</id><msg>Leads list: Created as first column; Name is a link opening the lead's edit page in an in-app tab</msg><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/users/leads/index.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>1dbf321e34fa687f66cf478013afed71718437b3</commitId><timestamp>1792012677000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads list: icon status column after Created (offer / contract: grey not sent, blue sent, green confirmed / signed; tooltip with the dates) replaces the Offer and Contract date columns
</comment><date>2026-10-14 23:17:57 +0200</date><id>1dbf321e34fa687f66cf478013afed71718437b3</id><msg>Leads list: icon status column after Created (offer / contract: grey not sent, blue sent, green confirmed / signed; tooltip with the dates) replaces the Offer and Contract date columns</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/users/leads/index.vue</affectedPath><commitId>cf67b8574cd059732370169752b60542915beb2b</commitId><timestamp>1792012872000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads list: separate icon-width Offer and Contract columns (icon headers, tinted badges grey/blue/green with check mark when confirmed/signed, dates in the tooltip); ti-file-signature replaced — not in the bundled Tabler font
</comment><date>2026-10-14 23:21:12 +0200</date><id>cf67b8574cd059732370169752b60542915beb2b</id><msg>Leads list: separate icon-width Offer and Contract columns (icon headers, tinted badges grey/blue/green with check mark when confirmed/signed, dates in the tooltip); ti-file-signature replaced — not in the bundled Tabler font</msg><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/users/leads/index.vue</affectedPath><commitId>22c6113c6b55bd0003ce134f437083ee4cb00d7d</commitId><timestamp>1792013035000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads list: offer / contract badges shrunk to 20 px to fit Balham's 28 px rows; done state uses its own icon (file-check / signature) instead of a clipped check overlay
</comment><date>2026-10-14 23:23:55 +0200</date><id>22c6113c6b55bd0003ce134f437083ee4cb00d7d</id><msg>Leads list: offer / contract badges shrunk to 20 px to fit Balham's 28 px rows; done state uses its own icon (file-check / signature) instead of a clipped check overlay</msg><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/users/leads/index.vue</affectedPath><affectedPath>app/components/mail/LeadFollowupModal.vue</affectedPath><commitId>1abfb16fb0015cd9816abc65976984ab354408a9</commitId><timestamp>1792014106000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads toolbar + unanswered modal: white text/icons pinned on coloured buttons in both themes (dark mode's --theme-text-inverse is #121212, which made icons black on the purple/orange/green buttons); lighter field icons and 'not sent' badges in dark mode
</comment><date>2026-10-14 23:41:46 +0200</date><id>1abfb16fb0015cd9816abc65976984ab354408a9</id><msg>Leads toolbar + unanswered modal: white text/icons pinned on coloured buttons in both themes (dark mode's --theme-text-inverse is #121212, which made icons black on the purple/orange/green buttons); lighter field icons and 'not sent' badges in dark mode</msg><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path><path><editType>edit</editType><file>app/components/mail/LeadFollowupModal.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/mobile/reconditioning.vue</affectedPath><affectedPath>app/components/mobile/LocatorRow.vue</affectedPath><affectedPath>app/composables/useLocatorCatalog.ts</affectedPath><affectedPath>app/pages/mobile/receive.vue</affectedPath><affectedPath>app/pages/integrations/inventory-desktop.vue</affectedPath><affectedPath>server/api/mobile/locators.post.ts</affectedPath><affectedPath>app/pages/integrations/movement-desktop.vue</affectedPath><affectedPath>app/pages/mobile/return.vue</affectedPath><affectedPath>app/pages/integrations/returns-desktop.vue</affectedPath><affectedPath>nuxt.config.ts</affectedPath><affectedPath>app/pages/mobile/inventory.vue</affectedPath><affectedPath>app/pages/integrations/receive-desktop.vue</affectedPath><affectedPath>server/utils/locatorCatalog.ts</affectedPath><affectedPath>server/api/mobile/locator-by-xyz.post.ts</affectedPath><affectedPath>server/api/mobile/reconditioning/target-locators.post.ts</affectedPath><affectedPath>server/api/mobile/locator-lookup.post.ts</affectedPath><affectedPath>server/api/mobile/locator-ensure.post.ts</affectedPath><affectedPath>.claude/rules/materials/locator-catalog.md</affectedPath><affectedPath>server/api/mobile/default-locator-lookup.post.ts</affectedPath><affectedPath>app/pages/mobile/movement.vue</affectedPath><affectedPath>server/api/mobile/product-lookup.post.ts</affectedPath><commitId>f68dd3e394dcf0d7eba99b6818726e5c9a7f2858</commitId><timestamp>1792015636000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Locator catalog: bins created per organization on first use (mobile + desktop)

iDempiere needs one warehouse per org and every locator per warehouse; instead of
pre-creating all ~500 bins for every merchant, the master org (LogYou 1000000,
runtimeConfig.locatorMasterOrgId / LOCATOR_MASTER_ORG_ID) is the template catalog
and a merchant gets a bin the moment it is used.

- server/utils/locatorCatalog.ts: listLocatorCatalog() = org bins + master-only
  bins as virtual preview entries (isVirtual, id `new:&lt;code&gt;`); ensureLocator()
  = find in org or create from the master template (Value, X/Y/Z, PriorityNo,
  locator type) in the org's own warehouse; codes unknown to the master stay 404;
  roles 'default' / 'return' copy the master's default / return bin
- new POST /api/mobile/locators (catalog) and /api/mobile/locator-ensure
- locator-lookup, locator-by-xyz create on miss (response `created`),
  default-locator-lookup creates the org default when the org has no bin at
  all, reconditioning/target-locators and product-lookup carry the preview
- app/composables/useLocatorCatalog.ts: fetchLocators / resolveLocator /
  ensureLocator + notifyLocatorCreated toast; LocatorRow `is-virtual` → "neu" tag
- wired: mobile movement, receive, inventory, return, reconditioning and the
  desktop ports movement/receive/inventory/returns under /integrations (pickers
  load the catalog, picking a virtual bin creates it before use; scans create
  server-side); fix-locator-owner (both) covered via locator-by-xyz
- recipe .claude/rules/materials/locator-catalog.md
</comment><date>2026-10-15 00:07:16 +0200</date><id>f68dd3e394dcf0d7eba99b6818726e5c9a7f2858</id><msg>Locator catalog: bins created per organization on first use (mobile + desktop)</msg><path><editType>edit</editType><file>nuxt.config.ts</file></path><path><editType>edit</editType><file>app/pages/integrations/inventory-desktop.vue</file></path><path><editType>add</editType><file>server/utils/locatorCatalog.ts</file></path><path><editType>add</editType><file>app/composables/useLocatorCatalog.ts</file></path><path><editType>edit</editType><file>app/components/mobile/LocatorRow.vue</file></path><path><editType>edit</editType><file>app/pages/mobile/receive.vue</file></path><path><editType>add</editType><file>server/api/mobile/locators.post.ts</file></path><path><editType>add</editType><file>.claude/rules/materials/locator-catalog.md</file></path><path><editType>edit</editType><file>app/pages/integrations/movement-desktop.vue</file></path><path><editType>edit</editType><file>server/api/mobile/product-lookup.post.ts</file></path><path><editType>edit</editType><file>server/api/mobile/default-locator-lookup.post.ts</file></path><path><editType>edit</editType><file>app/pages/integrations/returns-desktop.vue</file></path><path><editType>add</editType><file>server/api/mobile/locator-ensure.post.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/inventory.vue</file></path><path><editType>edit</editType><file>app/pages/mobile/movement.vue</file></path><path><editType>edit</editType><file>server/api/mobile/reconditioning/target-locators.post.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/return.vue</file></path><path><editType>edit</editType><file>app/pages/integrations/receive-desktop.vue</file></path><path><editType>edit</editType><file>server/api/mobile/locator-by-xyz.post.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/reconditioning.vue</file></path><path><editType>edit</editType><file>server/api/mobile/locator-lookup.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/dashboard/prime-due-today.get.ts</affectedPath><commitId>a345106a35fe2eb8fa5931a669c4ff5521c0f442</commitId><timestamp>1792184281000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Dashboard SameDay card: 'not fulfillable – missing stock' list limited to orders created within the last 4 days (fulfillable list unchanged)
</comment><date>2026-10-16 22:58:01 +0200</date><id>a345106a35fe2eb8fa5931a669c4ff5521c0f442</id><msg>Dashboard SameDay card: 'not fulfillable – missing stock' list limited to orders created within the last 4 days (fulfillable list unchanged)</msg><path><editType>edit</editType><file>server/api/dashboard/prime-due-today.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/inouts/[id]/reset-commission.post.ts</affectedPath><affectedPath>server/api/commission/parcels/dhl/multi.post.ts</affectedPath><affectedPath>app/components/sales/OrderForm.vue</affectedPath><affectedPath>.claude/rules/fulfillment/commissioning.md</affectedPath><affectedPath>app/pages/sales/orders/[id]/view.vue</affectedPath><affectedPath>app/composables/useDhlInsuranceFeedback.ts</affectedPath><affectedPath>server/api/orders/store.post.ts</affectedPath><affectedPath>app/pages/integrations/commission.vue</affectedPath><affectedPath>app/pages/sales/orders/create.vue</affectedPath><affectedPath>server/api/partners/partners/quick-add.post.ts</affectedPath><affectedPath>app/pages/mobile/commission.vue</affectedPath><affectedPath>app/components/OrderQuickAddModal.vue</affectedPath><affectedPath>server/api/commission/parcels/dhl/index.post.ts</affectedPath><affectedPath>app/pages/partners/partners/add.vue</affectedPath><affectedPath>app/components/partners/PartnerQuickForm.vue</affectedPath><affectedPath>app/pages/sales/orders/[id]/edit.vue</affectedPath><affectedPath>app/components/integrations/CommissionList.vue</affectedPath><affectedPath>server/api/orders/update.put.ts</affectedPath><affectedPath>server/utils/dhlInsurance.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><affectedPath>server/api/commission/parcels/dhl/inouts.get.ts</affectedPath><commitId>aab207fb4ef22f1336352c8858e07f74bddd9597</commitId><timestamp>1792224796000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>DHL Transportversicherung: order flag booked at commissioning from GrandTotal, Filiale-only hint label, quick-order opt-in with cost acknowledgement

- C_Order.IsDHLTransportInsurance (checkbox on OrderForm for DHL-Paket shippers; quick-order modal /
  partners/add with 500 € notice + mandatory extra-cost confirmation, all roles incl. merchants)
- server/utils/dhlInsurance.ts: amount = order GrandTotal incl. tax → services.additionalInsurance;
  skipped for Kleinpaket (V62KP), Packstation/Postfiliale/Paketshop addresses and ≤ 500 €;
  &gt; 2.500 € = tier B (Filiale only), &gt; 25.000 € capped at the DHL maximum with a warning;
  multi-parcel splits the total by parcel item value
- booked amount stored in M_InOut.DHL_InsuranceValue (cleared by the commission reset)
- tier-B parcels get an internal 102×152 mm "NICHT IN DIE DHL-ABHOLUNG / NUR DHL FILIALE" label printed
  right after the DHL label (desktop, modal and mobile commissioning), plus toasts for every outcome
- operator banner on both commission pages before the label, badges on the order status flow and the
  DHL commission list; recipe in .claude/rules/fulfillment/commissioning.md
</comment><date>2026-10-17 10:13:16 +0200</date><id>aab207fb4ef22f1336352c8858e07f74bddd9597</id><msg>DHL Transportversicherung: order flag booked at commissioning from GrandTotal, Filiale-only hint label, quick-order opt-in with cost acknowledgement</msg><path><editType>edit</editType><file>app/pages/sales/orders/create.vue</file></path><path><editType>edit</editType><file>app/components/integrations/CommissionList.vue</file></path><path><editType>edit</editType><file>app/components/OrderQuickAddModal.vue</file></path><path><editType>edit</editType><file>server/api/inouts/[id]/reset-commission.post.ts</file></path><path><editType>edit</editType><file>server/api/commission/parcels/dhl/multi.post.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/pages/sales/orders/[id]/edit.vue</file></path><path><editType>add</editType><file>app/composables/useDhlInsuranceFeedback.ts</file></path><path><editType>edit</editType><file>app/pages/integrations/commission.vue</file></path><path><editType>add</editType><file>server/utils/dhlInsurance.ts</file></path><path><editType>edit</editType><file>app/pages/sales/orders/[id]/view.vue</file></path><path><editType>edit</editType><file>app/components/partners/PartnerQuickForm.vue</file></path><path><editType>edit</editType><file>server/api/commission/parcels/dhl/index.post.ts</file></path><path><editType>edit</editType><file>app/pages/partners/partners/add.vue</file></path><path><editType>edit</editType><file>.claude/rules/fulfillment/commissioning.md</file></path><path><editType>edit</editType><file>server/api/commission/parcels/dhl/inouts.get.ts</file></path><path><editType>edit</editType><file>app/components/sales/OrderForm.vue</file></path><path><editType>edit</editType><file>server/api/partners/partners/quick-add.post.ts</file></path><path><editType>edit</editType><file>server/api/orders/store.post.ts</file></path><path><editType>edit</editType><file>server/api/orders/update.put.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/commission.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/commission/parcels/contents.post.ts</affectedPath><affectedPath>app/composables/useParcelContentsDoc.ts</affectedPath><affectedPath>.claude/rules/fulfillment/commissioning.md</affectedPath><affectedPath>app/components/integrations/CommissionPacklistConfirmModal.vue</affectedPath><affectedPath>app/pages/integrations/commission.vue</affectedPath><affectedPath>app/components/sales/ParcelContentsModal.vue</affectedPath><commitId>fa4edb3dc3eb2dbcfbe4aa427d00691dce5516d6</commitId><timestamp>1792225978000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Commission: optional parcel weight override + box dimensions (L×B×H cm) for Amazon FBA orders — per slot in multi-parcel mode, FBA single-parcel panel otherwise; stored in commission_parcels_json and shown in the Paketinhalt modal, packlist confirm modal and A4 PDF; Paketinhalt now saved for every FBA order (relabel or FBA shipper), single parcel included
</comment><date>2026-10-17 10:32:58 +0200</date><id>fa4edb3dc3eb2dbcfbe4aa427d00691dce5516d6</id><msg>Commission: optional parcel weight override + box dimensions (L×B×H cm) for Amazon FBA orders — per slot in multi-parcel mode, FBA single-parcel panel otherwise; stored in commission_parcels_json and shown in the Paketinhalt modal, packlist confirm modal and A4 PDF; Paketinhalt now saved for every FBA order (relabel or FBA shipper), single parcel included</msg><path><editType>edit</editType><file>app/components/sales/ParcelContentsModal.vue</file></path><path><editType>edit</editType><file>server/api/commission/parcels/contents.post.ts</file></path><path><editType>edit</editType><file>app/composables/useParcelContentsDoc.ts</file></path><path><editType>edit</editType><file>app/pages/integrations/commission.vue</file></path><path><editType>edit</editType><file>.claude/rules/fulfillment/commissioning.md</file></path><path><editType>edit</editType><file>app/components/integrations/CommissionPacklistConfirmModal.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/index.vue</affectedPath><commitId>0afec150a35b3c26c457d5c0766e497c45086029</commitId><timestamp>1792225978000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Dashboard tickets card: show as many rows as the card height allows (ResizeObserver-derived row count, 30-ticket reserve, chunked last-message overlay) — card height now follows its row siblings with a 10-row minimum, so big screens fill the former blank space with 15+ tickets
</comment><date>2026-10-17 10:32:58 +0200</date><id>0afec150a35b3c26c457d5c0766e497c45086029</id><msg>Dashboard tickets card: show as many rows as the card height allows (ResizeObserver-derived row count, 30-ticket reserve, chunked last-message overlay) — card height now follows its row siblings with a 10-row minimum, so big screens fill the former blank space with 15+ tickets</msg><path><editType>edit</editType><file>app/pages/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/requests/MyTicketDetail.vue</affectedPath><affectedPath>server/api/orders/[id]/roadmap/push-step.post.ts</affectedPath><affectedPath>server/utils/pushTask.ts</affectedPath><affectedPath>app/pages/mobile/tasks.vue</affectedPath><affectedPath>server/utils/relabelOrderHelper.ts</affectedPath><affectedPath>server/utils/orderRoadmap.ts</affectedPath><affectedPath>.claude/rules/sales/order-roadmap.md</affectedPath><affectedPath>app/composables/usePushedTasks.ts</affectedPath><affectedPath>app/components/sales/OrderRoadmap.vue</affectedPath><affectedPath>server/api/requests/requests/[id]/push-task.post.ts</affectedPath><affectedPath>app/pages/sales/orders/[id]/edit.vue</affectedPath><affectedPath>server/api/mobile/pushed-tasks.get.ts</affectedPath><affectedPath>.claude/rules/requests/tickets.md</affectedPath><affectedPath>server/utils/orderProductions.ts</affectedPath><affectedPath>server/utils/productionTicket.ts</affectedPath><affectedPath>server/api/orders/[id]/roadmap.get.ts</affectedPath><affectedPath>app/components/requests/PushTaskModal.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><affectedPath>server/api/orders/[id]/productions.get.ts</affectedPath><commitId>88121ab248ac7b42471936cc209b2c25fe5a095c</commitId><timestamp>1792268600000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Order roadmap on the sales-order edit page: FBA relabel + production/BOM checklist with "send step to mobile device"

- &lt;SalesOrderRoadmap&gt; panel between the status timeline and the form (staff only, shown only when the
  order needs extra steps): per BOM position Produktion angelegt → Produziert → Produktions-Aufgabe,
  for relabel orders Etiketten-Codes → FBA-Etiketten drucken → Umetikettierung (Lager); colour state
  (open / in progress / done / not yet), global numbering, "next step" marker, progress summary,
  collapsible, responsive down to phone width
- GET /api/orders/:id/roadmap aggregates order, lines (BOM flag, printLabelCode), productions and
  order tickets; POST /api/orders/:id/roadmap/push-step reuses the step's open ticket (relabel summary
  prefix / M_Production_ID) or creates one (relabel / production ticket) and pushes it to the worker
- push logic extracted to server/utils/pushTask.ts (shared with requests/[id]/push-task), push modal
  extracted to &lt;RequestsPushTaskModal&gt; (MyTicketDetail switched over)
- mobile pushed-task list carries the production link and shows a production card
- createRelabelTicket returns the ticket id; createProductionTicket works without a production
- i18n en/de/es, recipe .claude/rules/sales/order-roadmap.md
</comment><date>2026-10-17 22:23:20 +0200</date><id>88121ab248ac7b42471936cc209b2c25fe5a095c</id><msg>Order roadmap on the sales-order edit page: FBA relabel + production/BOM checklist with "send step to mobile device"</msg><path><editType>add</editType><file>server/utils/orderRoadmap.ts</file></path><path><editType>add</editType><file>app/components/sales/OrderRoadmap.vue</file></path><path><editType>add</editType><file>server/api/orders/[id]/roadmap.get.ts</file></path><path><editType>edit</editType><file>app/components/requests/MyTicketDetail.vue</file></path><path><editType>add</editType><file>server/api/orders/[id]/roadmap/push-step.post.ts</file></path><path><editType>edit</editType><file>server/api/mobile/pushed-tasks.get.ts</file></path><path><editType>add</editType><file>server/utils/orderProductions.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/tasks.vue</file></path><path><editType>edit</editType><file>app/composables/usePushedTasks.ts</file></path><path><editType>add</editType><file>server/utils/pushTask.ts</file></path><path><editType>edit</editType><file>server/api/requests/requests/[id]/push-task.post.ts</file></path><path><editType>edit</editType><file>server/utils/productionTicket.ts</file></path><path><editType>edit</editType><file>.claude/rules/requests/tickets.md</file></path><path><editType>edit</editType><file>server/utils/relabelOrderHelper.ts</file></path><path><editType>add</editType><file>app/components/requests/PushTaskModal.vue</file></path><path><editType>edit</editType><file>app/pages/sales/orders/[id]/edit.vue</file></path><path><editType>add</editType><file>.claude/rules/sales/order-roadmap.md</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/api/orders/[id]/productions.get.ts</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit></freeStyleBuild>