<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>731</buildNumber><marked><SHA1>25e57e1d2a58ceb6994e6c82bab7533d42935788</SHA1><branch><SHA1>25e57e1d2a58ceb6994e6c82bab7533d42935788</SHA1><name>refs/remotes/origin/dev</name></branch></marked><revision><SHA1>25e57e1d2a58ceb6994e6c82bab7533d42935788</SHA1><branch><SHA1>25e57e1d2a58ceb6994e6c82bab7533d42935788</SHA1><name>refs/remotes/origin/dev</name></branch></revision></refsremotesorigindev></buildsByBranchName><lastBuiltRevision><SHA1>25e57e1d2a58ceb6994e6c82bab7533d42935788</SHA1><branch><SHA1>25e57e1d2a58ceb6994e6c82bab7533d42935788</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>#731</displayName><duration>64695</duration><estimatedDuration>71602</estimatedDuration><fullDisplayName>build-logship-frontend #731</fullDisplayName><id>731</id><inProgress>false</inProgress><keepLog>false</keepLog><number>731</number><queueId>5661</queueId><result>SUCCESS</result><timestamp>1788912000272</timestamp><url>https://jenkins.younex.de/view/all/job/build-logship-frontend/731/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/public/sign/[token]/index.post.ts</affectedPath><affectedPath>server/api/public/sign/[token]/document/[key].get.ts</affectedPath><affectedPath>server/api/offers/contract/signing-status.get.ts</affectedPath><affectedPath>server/api/public/sign/[token]/index.get.ts</affectedPath><affectedPath>server/utils/offers/contractSigningDb.ts</affectedPath><commitId>6867a990ad10e973d0fcb49b44dd4c5166806fcd</commitId><timestamp>1788846822000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Signing store: kind column (contract | quote), kind-aware supersede and status history

signing_requests gets a kind column (migrated in place, default contract) so
quote confirmations share the table, the on-disk document store and the
lifecycle with contract signing. Superseding is per kind, signing-status
returns latest / latestQuote / full history of both kinds with daysLeft and
portal document urls, and the /sign routes only accept contract tokens.
</comment><date>2026-09-08 07:53:42 +0200</date><id>6867a990ad10e973d0fcb49b44dd4c5166806fcd</id><msg>Signing store: kind column (contract | quote), kind-aware supersede and status history</msg><path><editType>edit</editType><file>server/api/public/sign/[token]/index.get.ts</file></path><path><editType>edit</editType><file>server/api/public/sign/[token]/document/[key].get.ts</file></path><path><editType>edit</editType><file>server/utils/offers/contractSigningDb.ts</file></path><path><editType>edit</editType><file>server/api/public/sign/[token]/index.post.ts</file></path><path><editType>edit</editType><file>server/api/offers/contract/signing-status.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/offers/contactActivity.ts</affectedPath><affectedPath>server/api/offers/contract/send.post.ts</affectedPath><affectedPath>server/utils/offers/contractSigning.ts</affectedPath><commitId>a8c47ec14aacc1ac6e45a92468871c6d9b093212</commitId><timestamp>1788846822000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Activities: log contract sent and contract signed on the record

New contactActivity helper writes C_ContactActivity rows (type E-Mail) for
customer-facing steps, with the documents referenced in a parseable
[Dokumente] block in Comments (title | url). Contract send logs the package,
recipient and signing link; finalizeSignature logs the signature with the
signed contract and annexes. Fail-soft everywhere.
</comment><date>2026-09-08 07:53:42 +0200</date><id>a8c47ec14aacc1ac6e45a92468871c6d9b093212</id><msg>Activities: log contract sent and contract signed on the record</msg><path><editType>edit</editType><file>server/api/offers/contract/send.post.ts</file></path><path><editType>add</editType><file>server/utils/offers/contactActivity.ts</file></path><path><editType>edit</editType><file>server/utils/offers/contractSigning.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/offers/QuoteModal.vue</affectedPath><affectedPath>server/utils/offers/quoteConfirmation.ts</affectedPath><affectedPath>app/pages/confirm/[token].vue</affectedPath><affectedPath>app/composables/useOfferQuote.ts</affectedPath><affectedPath>server/api/public/confirm/[token]/index.post.ts</affectedPath><affectedPath>server/api/public/confirm/[token]/request-renewal.post.ts</affectedPath><affectedPath>server/api/offers/quote/send.post.ts</affectedPath><affectedPath>server/api/public/confirm/[token]/index.get.ts</affectedPath><affectedPath>server/api/public/confirm/[token]/document/[key].get.ts</affectedPath><affectedPath>server/utils/offers/offerConditions.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>7c8cbf87e7b8d409534fb242a15ad8a95d7ceecf</commitId><timestamp>1788846822000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Quotes: online confirmation button in the e-mail + public /confirm/&lt;token&gt; page

Opt-out checkbox in the quote modal (default on). The send creates a kind
'quote' signing request valid as long as the quote, stores the exact PDF and
adds a CTA to the mail; the e-mail default text mentions the button. The
public page shows the quote, collects company/name/e-mail + declarations and
confirms: the offer PDF gets an appended confirmation page (pdf-lib), is
attached to the record, written to offer_conditions.quote.confirmation,
mailed to the customer and info@logyou.de, and logged as an activity with
document buttons. Quote send itself is logged as an activity too.
</comment><date>2026-09-08 07:53:42 +0200</date><id>7c8cbf87e7b8d409534fb242a15ad8a95d7ceecf</id><msg>Quotes: online confirmation button in the e-mail + public /confirm/&lt;token&gt; page</msg><path><editType>add</editType><file>server/api/public/confirm/[token]/request-renewal.post.ts</file></path><path><editType>edit</editType><file>app/components/offers/QuoteModal.vue</file></path><path><editType>edit</editType><file>app/composables/useOfferQuote.ts</file></path><path><editType>edit</editType><file>server/api/offers/quote/send.post.ts</file></path><path><editType>add</editType><file>server/api/public/confirm/[token]/document/[key].get.ts</file></path><path><editType>add</editType><file>server/utils/offers/quoteConfirmation.ts</file></path><path><editType>add</editType><file>app/pages/confirm/[token].vue</file></path><path><editType>add</editType><file>server/api/public/confirm/[token]/index.get.ts</file></path><path><editType>add</editType><file>server/api/public/confirm/[token]/index.post.ts</file></path><path><editType>edit</editType><file>server/utils/offers/offerConditions.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/users/leads/[id]/edit.vue</affectedPath><affectedPath>app/components/offers/SigningLinksPanel.vue</affectedPath><affectedPath>app/components/admin/LeadDetailRecordActivity.vue</affectedPath><affectedPath>app/components/admin/LeadForm.vue</affectedPath><affectedPath>app/components/admin/LeadDetailRecord.vue</affectedPath><commitId>26daf290da8c94ae87d75e2f78f15a33ad8adb34</commitId><timestamp>1788846822000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Lead page: hero header, side panels for links + attachments, activity timeline

Restyled /edit/lead-&lt;id&gt;: hero with initials/status/source chips and quick
actions, two-column layout, form sections without Avatar/Tenant, a signing
links panel listing every contract/quote link with status, remaining validity
and clickable url, an attachments panel, and the activities as a timeline.
The activity modal has a single note field (Comments, description derived
from the first line); the timeline shows Comments or the legacy Description
and renders [Dokumente] references as buttons.
</comment><date>2026-09-08 07:53:42 +0200</date><id>26daf290da8c94ae87d75e2f78f15a33ad8adb34</id><msg>Lead page: hero header, side panels for links + attachments, activity timeline</msg><path><editType>edit</editType><file>app/components/admin/LeadDetailRecordActivity.vue</file></path><path><editType>edit</editType><file>app/pages/users/leads/[id]/edit.vue</file></path><path><editType>add</editType><file>app/components/offers/SigningLinksPanel.vue</file></path><path><editType>edit</editType><file>app/components/admin/LeadForm.vue</file></path><path><editType>edit</editType><file>app/components/admin/LeadDetailRecord.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/sign/[token].vue</affectedPath><commitId>3bcec9625e1768733d5e7136392ece9112854a14</commitId><timestamp>1788846822000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Sign page: on phones only the PDF pans, the page never scrolls horizontally
</comment><date>2026-09-08 07:53:42 +0200</date><id>3bcec9625e1768733d5e7136392ece9112854a14</id><msg>Sign page: on phones only the PDF pans, the page never scrolls horizontally</msg><path><editType>edit</editType><file>app/pages/sign/[token].vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/accounting/banking/BankReconcilePanel.vue</affectedPath><commitId>5e677922cb07d6e92ce254ce5aa134c953f82679</commitId><timestamp>1788847457000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Banking: combinable line filters (status, with suggestion, credit/debit), one Match button per row

The Status segment stays single-select (All / Open / Matched); two new
chip groups combine with it: 'Mit Vorschlag' (only lines that have a match
suggestion — disabled and cleared while Matched is active, suggestions only
exist for open lines) and an exclusive credit (+) / debit (−) toggle. Chip
counts respect the other active filters; a reset button clears everything.
The three per-row buttons collapse into one 'Zuordnen' — the modal carries
the invoice / fee / payment tabs and opens on the tab the best suggestion
points to.
</comment><date>2026-09-08 08:04:17 +0200</date><id>5e677922cb07d6e92ce254ce5aa134c953f82679</id><msg>Banking: combinable line filters (status, with suggestion, credit/debit), one Match button per row</msg><path><editType>edit</editType><file>app/components/accounting/banking/BankReconcilePanel.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/accounting/BankLineMatchModal.vue</affectedPath><affectedPath>server/api/invoices/[id]/pdf.get.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>2d529629dd7087711b7fd0272e86a1fb0333d052</commitId><timestamp>1788847457000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Banking: restyled match modal with invoice thumbnails and inline PDF preview

The 'Position zuordnen' modal now uses the banking design system (bk-*):
bank-line ticket, segmented tabs, candidate cards with a first-page
thumbnail, confidence + signal pills and an eye button that opens the
invoice PDF in a preview pane inside the modal (the modal widens, the
selection stays). New GET /api/invoices/[id]/pdf streams the invoice as
binary application/pdf (short private cache) for thumbnail + iframe.
Modal strings are translatable (banking_modal_*).
</comment><date>2026-09-08 08:04:17 +0200</date><id>2d529629dd7087711b7fd0272e86a1fb0333d052</id><msg>Banking: restyled match modal with invoice thumbnails and inline PDF preview</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>add</editType><file>server/api/invoices/[id]/pdf.get.ts</file></path><path><editType>edit</editType><file>app/components/accounting/BankLineMatchModal.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/accounting/amazon/order-sources.get.ts</affectedPath><affectedPath>app/pages/accounting/amazon-settlements.vue</affectedPath><affectedPath>app/pages/accounting/ebay-settlements.vue</affectedPath><affectedPath>server/api/accounting/ebay/order-sources.get.ts</affectedPath><commitId>6d6c5a9505a8622125674e8b4c501793d5c96ba8</commitId><timestamp>1788847924000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Settlements: range picker with presets, calendar and 'last N periods'; order source preset by org

Replaces the two native date inputs on the Amazon/eBay settlement pages with
one Zeitraum control: a popover with presets (last month, 3/6/12 months,
this/last year), 'Letzte N Abrechnungen/Auszahlungen' (period-count mode —
looks back far enough and keeps the newest N), a two-month range calendar
(Nuxt UI UCalendar, grid pinned by marker CSS) and from/to inputs as typing
fallback. Same dateFrom/dateTo contract + range-change emit as before.
The order source is preselected with the first source owned by the org the
user is logged in with (order-sources routes now return orgId/orgName).
</comment><date>2026-09-08 08:12:04 +0200</date><id>6d6c5a9505a8622125674e8b4c501793d5c96ba8</id><msg>Settlements: range picker with presets, calendar and 'last N periods'; order source preset by org</msg><path><editType>edit</editType><file>app/pages/accounting/amazon-settlements.vue</file></path><path><editType>edit</editType><file>server/api/accounting/amazon/order-sources.get.ts</file></path><path><editType>edit</editType><file>app/pages/accounting/ebay-settlements.vue</file></path><path><editType>edit</editType><file>server/api/accounting/ebay/order-sources.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/offers/quotePdf.ts</affectedPath><affectedPath>app/pages/users/leads/[id]/edit.vue</affectedPath><affectedPath>server/utils/offers/pdfImages.ts</affectedPath><affectedPath>server/utils/offers/contractPdf.ts</affectedPath><commitId>7d9f6b6a5f6c39a4c956cc3c7a69dc0698266977</commitId><timestamp>1788848444000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Offer PDFs: normalise customer logo / screenshot / signature images to PNG or JPEG

pdfmake throws 'Unknown image format' for anything but PNG/JPEG. A lead
avatar in WebP/GIF/SVG (uploaded as company logo) was labelled image/png by
the lead page and killed the whole quote preview. New pdfImages.ts sniffs
the real format, converts other formats with sharp and drops unusable data
instead of failing; applied to the quote logo + website screenshot and the
contract signature image. The lead page now sniffs webp/gif/svg too.
</comment><date>2026-09-08 08:20:44 +0200</date><id>7d9f6b6a5f6c39a4c956cc3c7a69dc0698266977</id><msg>Offer PDFs: normalise customer logo / screenshot / signature images to PNG or JPEG</msg><path><editType>edit</editType><file>app/pages/users/leads/[id]/edit.vue</file></path><path><editType>edit</editType><file>server/utils/offers/contractPdf.ts</file></path><path><editType>edit</editType><file>server/utils/offers/quotePdf.ts</file></path><path><editType>add</editType><file>server/utils/offers/pdfImages.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/offers/QuoteModal.vue</affectedPath><affectedPath>app/components/offers/ContractModal.vue</affectedPath><commitId>666a2f22c1bedff589d9903b4eba506068632234</commitId><timestamp>1788848444000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Offer/contract modals: consistent, spaced checkbox rows

Every checkbox in the quote and contract modals gets the same row style:
gap between box and label, padding + hover surface, 18px box, brand accent,
and the global transform scale on checkbox inputs is neutralised so the box
no longer overlaps its label and neighbouring controls.
</comment><date>2026-09-08 08:20:44 +0200</date><id>666a2f22c1bedff589d9903b4eba506068632234</id><msg>Offer/contract modals: consistent, spaced checkbox rows</msg><path><editType>edit</editType><file>app/components/offers/QuoteModal.vue</file></path><path><editType>edit</editType><file>app/components/offers/ContractModal.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/accounting/SettlementSourceFields.vue</affectedPath><commitId>e163c30b60d98dd983bffd29c9b4a35ac30a984c</commitId><timestamp>1788848478000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Settlements range picker: pin the calendar grid body to table layout
</comment><date>2026-09-08 08:21:18 +0200</date><id>e163c30b60d98dd983bffd29c9b4a35ac30a984c</id><msg>Settlements range picker: pin the calendar grid body to table layout</msg><path><editType>edit</editType><file>app/components/accounting/SettlementSourceFields.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>reference/recipes.md</affectedPath><commitId>e175e587f486e8aa322305a03243fe19bc47d7fd</commitId><timestamp>1788848643000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Recipes: activities [Dokumente] convention, quote confirmation portal, PDF image normalisation, invoice PDF url, UCalendar pinning, checkbox scale override
</comment><date>2026-09-08 08:24:03 +0200</date><id>e175e587f486e8aa322305a03243fe19bc47d7fd</id><msg>Recipes: activities [Dokumente] convention, quote confirmation portal, PDF image normalisation, invoice PDF url, UCalendar pinning, checkbox scale override</msg><path><editType>edit</editType><file>reference/recipes.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/materials/ProductDetailRecordLocatedAt.vue</affectedPath><affectedPath>app/composables/states.ts</affectedPath><commitId>ecadbf8fdba3adfaaf4606a7e1e3f260362ebc28</commitId><timestamp>1788856346000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Product 'Located at' tab: show only locators with any on-hand / ordered / reserved qty by default, toggle for all, qty columns; drop tedir imports
</comment><date>2026-09-08 10:32:26 +0200</date><id>ecadbf8fdba3adfaaf4606a7e1e3f260362ebc28</id><msg>Product 'Located at' tab: show only locators with any on-hand / ordered / reserved qty by default, toggle for all, qty columns; drop tedir imports</msg><path><editType>edit</editType><file>app/components/materials/ProductDetailRecordLocatedAt.vue</file></path><path><editType>edit</editType><file>app/composables/states.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/materials/ProductStockLocatorsCard.vue</affectedPath><affectedPath>app/components/materials/ProductStockActionModal.vue</affectedPath><affectedPath>app/pages/materials/products/[id]/edit.vue</affectedPath><commitId>05ab84b63ee3aba0cfc569b4bb465352ed0ece3e</commitId><timestamp>1788856346000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Product edit: admin 'Bestand je Lagerplatz' card with per-locator tiles and in-page inventory count / goods receipt / movement modals that refresh quantities live
</comment><date>2026-09-08 10:32:26 +0200</date><id>05ab84b63ee3aba0cfc569b4bb465352ed0ece3e</id><msg>Product edit: admin 'Bestand je Lagerplatz' card with per-locator tiles and in-page inventory count / goods receipt / movement modals that refresh quantities live</msg><path><editType>add</editType><file>app/components/materials/ProductStockActionModal.vue</file></path><path><editType>add</editType><file>app/components/materials/ProductStockLocatorsCard.vue</file></path><path><editType>edit</editType><file>app/pages/materials/products/[id]/edit.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/integrations/receive-desktop.vue</affectedPath><commitId>7871bf08102d33741ddd70b99897d88aac182729</commitId><timestamp>1788856346000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Receive desktop: replace unstyled USelect/native selects with the SelectBox (Nuxt UI) wrapper, ignore stale org cookie entries
</comment><date>2026-09-08 10:32:26 +0200</date><id>7871bf08102d33741ddd70b99897d88aac182729</id><msg>Receive desktop: replace unstyled USelect/native selects with the SelectBox (Nuxt UI) wrapper, ignore stale org cookie entries</msg><path><editType>edit</editType><file>app/pages/integrations/receive-desktop.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/materials/ProductStockLocatorsCard.vue</affectedPath><commitId>34cafbecb1954b33dde58fc2638abfa8015077d2</commitId><timestamp>1788857650000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Product stock card: 'Etiketten drucken' action opening print-labels-desktop with the article preloaded (productId + productValue hand-off, SKU/UPC fallback)
</comment><date>2026-09-08 10:54:10 +0200</date><id>34cafbecb1954b33dde58fc2638abfa8015077d2</id><msg>Product stock card: 'Etiketten drucken' action opening print-labels-desktop with the article preloaded (productId + productValue hand-off, SKU/UPC fallback)</msg><path><editType>edit</editType><file>app/components/materials/ProductStockLocatorsCard.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>reference/recipes.md</affectedPath><commitId>f10c9649cb3920d39f04cd8b0114d98441064633</commitId><timestamp>1788857650000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Recipes: product page stock actions card + modal (data source, cloned document chains, live refresh, page hand-off)
</comment><date>2026-09-08 10:54:10 +0200</date><id>f10c9649cb3920d39f04cd8b0114d98441064633</id><msg>Recipes: product page stock actions card + modal (data source, cloned document chains, live refresh, page hand-off)</msg><path><editType>edit</editType><file>reference/recipes.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/integrations/print-labels-desktop.vue</affectedPath><commitId>5b97c2d515fcdfe9d8b51bd9b00570a1a9c0a11b</commitId><timestamp>1788859286000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Print labels desktop: single full-width column — sticky action bar, scan + search side by side, selected articles as order-style positions (thumb, codes, org, per-row printer, qty); SelectBox for printer pickers
</comment><date>2026-09-08 11:21:26 +0200</date><id>5b97c2d515fcdfe9d8b51bd9b00570a1a9c0a11b</id><msg>Print labels desktop: single full-width column — sticky action bar, scan + search side by side, selected articles as order-style positions (thumb, codes, org, per-row printer, qty); SelectBox for printer pickers</msg><path><editType>edit</editType><file>app/pages/integrations/print-labels-desktop.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/materials/ProductStockLocatorsCard.vue</affectedPath><affectedPath>app/pages/materials/products/[id]/edit.vue</affectedPath><commitId>17d352cfcb1a5ce5660246960d7a983ec40662d6</commitId><timestamp>1788859286000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Product stock card: 'Etiketten drucken' opens the page's print-labels modal instead of a new tab
</comment><date>2026-09-08 11:21:26 +0200</date><id>17d352cfcb1a5ce5660246960d7a983ec40662d6</id><msg>Product stock card: 'Etiketten drucken' opens the page's print-labels modal instead of a new tab</msg><path><editType>edit</editType><file>app/components/materials/ProductStockLocatorsCard.vue</file></path><path><editType>edit</editType><file>app/pages/materials/products/[id]/edit.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/offers/quote/send.post.ts</affectedPath><affectedPath>server/utils/offers/offerConditions.ts</affectedPath><affectedPath>app/components/offers/QuoteModal.vue</affectedPath><affectedPath>app/composables/useOfferQuote.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>915e0f4f6e40350029d376104fc3d26e1dbe677b</commitId><timestamp>1788859992000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Quote modal: optional PDF attachment when the online confirmation link is sent (default link-only; PDF always attached without link), link-only e-mail texts, persisted in offer conditions
</comment><date>2026-09-08 11:33:12 +0200</date><id>915e0f4f6e40350029d376104fc3d26e1dbe677b</id><msg>Quote modal: optional PDF attachment when the online confirmation link is sent (default link-only; PDF always attached without link), link-only e-mail texts, persisted in offer conditions</msg><path><editType>edit</editType><file>app/composables/useOfferQuote.ts</file></path><path><editType>edit</editType><file>server/api/offers/quote/send.post.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/utils/offers/offerConditions.ts</file></path><path><editType>edit</editType><file>app/components/offers/QuoteModal.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/print/product.post.ts</affectedPath><affectedPath>app/pages/integrations/print-labels-desktop.vue</affectedPath><affectedPath>app/components/settings/PrinterForm.vue</affectedPath><affectedPath>app/pages/settings/printers/[id]/edit.vue</affectedPath><affectedPath>app/pages/settings/printers/create.vue</affectedPath><affectedPath>server/api/printers/cups-media.get.ts</affectedPath><affectedPath>app/pages/settings/printers/[id]/view.vue</affectedPath><affectedPath>server/api/settings/printers/store.post.ts</affectedPath><affectedPath>server/api/settings/printers/update.put.ts</affectedPath><affectedPath>app/components/sales/RelabelLabelPrintModal.vue</affectedPath><affectedPath>server/api/printers/index.get.ts</affectedPath><affectedPath>app/pages/settings/printers/[id]/duplicate.vue</affectedPath><affectedPath>server/utils/labelMedia.ts</affectedPath><affectedPath>reference/recipes.md</affectedPath><affectedPath>server/utils/cupsMedia.ts</affectedPath><affectedPath>app/pages/settings/printers/index.vue</affectedPath><affectedPath>server/utils/labelBarcode.ts</affectedPath><commitId>d81db0b973c0bf582df7f457d2dfb7974b2615ca</commitId><timestamp>1788864168000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Product labels: size-exact pages per printer, vector CODE128, label size from printer registry with CUPS fallback

- /api/print/product renders each printer group at the real label size (registry
  LabelWidthMm/LabelHeightMm → CUPS queue PPD default → legacy format) instead of
  A8 + fit-to-page, which used only 24 of 35 mm on labelprinter-2 and shrank the barcode
- fix off-by-one that drew every label on the page created for the next one (first
  label of a batch landed on a default-format page)
- barcodes as vector bars from bwip-js geometry (crisp on the 203 dpi Zebra grid);
  compact layout for labels &lt; 40 mm high, adaptive table layout for larger rolls;
  customSettings (Shopify stock page) keeps the legacy layouts
- registry sizes are sent to lp as -o media=Custom.WxHmm; results carry the resolved media
- Settings → Printers: label size (mm) with "Aus CUPS übernehmen" detect
  (/api/printers/cups-media), LabelType reorder reference; wired through form, pages, grid,
  store/update, /api/printers; relabel modal preselects the registry size
- recipe: product labels — page size from registry/CUPS, vector CODE128
</comment><date>2026-09-08 12:42:48 +0200</date><id>d81db0b973c0bf582df7f457d2dfb7974b2615ca</id><msg>Product labels: size-exact pages per printer, vector CODE128, label size from printer registry with CUPS fallback</msg><path><editType>edit</editType><file>app/pages/settings/printers/[id]/view.vue</file></path><path><editType>edit</editType><file>app/pages/settings/printers/[id]/duplicate.vue</file></path><path><editType>edit</editType><file>server/api/settings/printers/store.post.ts</file></path><path><editType>add</editType><file>server/utils/labelMedia.ts</file></path><path><editType>edit</editType><file>app/pages/settings/printers/index.vue</file></path><path><editType>edit</editType><file>app/components/sales/RelabelLabelPrintModal.vue</file></path><path><editType>edit</editType><file>reference/recipes.md</file></path><path><editType>edit</editType><file>server/api/print/product.post.ts</file></path><path><editType>edit</editType><file>app/pages/integrations/print-labels-desktop.vue</file></path><path><editType>add</editType><file>server/utils/labelBarcode.ts</file></path><path><editType>edit</editType><file>app/pages/settings/printers/[id]/edit.vue</file></path><path><editType>edit</editType><file>server/api/printers/index.get.ts</file></path><path><editType>add</editType><file>server/utils/cupsMedia.ts</file></path><path><editType>add</editType><file>server/api/printers/cups-media.get.ts</file></path><path><editType>edit</editType><file>server/api/settings/printers/update.put.ts</file></path><path><editType>edit</editType><file>app/components/settings/PrinterForm.vue</file></path><path><editType>edit</editType><file>app/pages/settings/printers/create.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/print/product.post.ts</affectedPath><commitId>fd32d8ff9d2823cb26fa373678f8f6e702029afe</commitId><timestamp>1788865575000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Product labels (compact): two name rows, barcode lower, org company name rotated along the right edge

- 35×17 / 54×29 layout: product name wraps to two lines, SKU row, then barcode +
  cleartext value; the 2-digit org code is gone
- ad_org.companyname (fallback Name) printed as one 90°-rotated string on the right
  edge, vertically centred, shrunk to 4 pt then ellipsised to the label height
</comment><date>2026-09-08 13:06:15 +0200</date><id>fd32d8ff9d2823cb26fa373678f8f6e702029afe</id><msg>Product labels (compact): two name rows, barcode lower, org company name rotated along the right edge</msg><path><editType>edit</editType><file>server/api/print/product.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/print/product.post.ts</affectedPath><commitId>7c416c6207cd20cb749989c9e7438084d2509284</commitId><timestamp>1788867149000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Product labels (compact): wider text/barcode area, company name at the right edge, barcode lower with a clear gap under the text rows
</comment><date>2026-09-08 13:32:29 +0200</date><id>7c416c6207cd20cb749989c9e7438084d2509284</id><msg>Product labels (compact): wider text/barcode area, company name at the right edge, barcode lower with a clear gap under the text rows</msg><path><editType>edit</editType><file>server/api/print/product.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/composables/useOpenShipments.ts</affectedPath><commitId>d57d085a7df0992fea2f94c53a03585617422d88</commitId><timestamp>1788872894000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Commissioning open-shipments list: expand C_Order_ID and show only shipments of fulfillment orders (isFulfillmentOrder = Y), mirroring the dashboard open-to-commission rule; scan input unchanged
</comment><date>2026-09-08 15:08:14 +0200</date><id>d57d085a7df0992fea2f94c53a03585617422d88</id><msg>Commissioning open-shipments list: expand C_Order_ID and show only shipments of fulfillment orders (isFulfillmentOrder = Y), mirroring the dashboard open-to-commission rule; scan input unchanged</msg><path><editType>edit</editType><file>app/composables/useOpenShipments.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/requests/RequestForm.vue</affectedPath><commitId>9afa79b55166ae0a4de7ff3f6046ff5752dac38a</commitId><timestamp>1788882961000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Request edit form: billing dialog gets a 'Betrag' mode next to 'Zeit' — book a direct (also negative) amount without time, same [Zeitabrechnung] envelope and QtySpent rules as the my-tickets detail
</comment><date>2026-09-08 17:56:01 +0200</date><id>9afa79b55166ae0a4de7ff3f6046ff5752dac38a</id><msg>Request edit form: billing dialog gets a 'Betrag' mode next to 'Zeit' — book a direct (also negative) amount without time, same [Zeitabrechnung] envelope and QtySpent rules as the my-tickets detail</msg><path><editType>edit</editType><file>app/components/requests/RequestForm.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/requests/requests/create.vue</affectedPath><affectedPath>app/pages/requests/my-tickets/create.vue</affectedPath><affectedPath>app/pages/requests/my-tickets/index.vue</affectedPath><commitId>a91a37f8b47890a451b7d1352939b52ff8bc5eb9</commitId><timestamp>1788882961000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Ticket creation (Create Request + my-tickets wizard) opens the new ticket in the my-tickets split view (?ticket=&lt;id&gt;); split view refetches its list when a deep-linked ticket is not loaded yet
</comment><date>2026-09-08 17:56:01 +0200</date><id>a91a37f8b47890a451b7d1352939b52ff8bc5eb9</id><msg>Ticket creation (Create Request + my-tickets wizard) opens the new ticket in the my-tickets split view (?ticket=&lt;id&gt;); split view refetches its list when a deep-linked ticket is not loaded yet</msg><path><editType>edit</editType><file>app/pages/requests/my-tickets/create.vue</file></path><path><editType>edit</editType><file>app/pages/requests/requests/create.vue</file></path><path><editType>edit</editType><file>app/pages/requests/my-tickets/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/admin/users/leads/latest.get.ts</affectedPath><affectedPath>app/pages/index.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>25e57e1d2a58ceb6994e6c82bab7533d42935788</commitId><timestamp>1788882961000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Dashboard Latest Leads: offer and contract badges per lead — greyed when the online link was sent, coloured once the offer is accepted / the contract is signed
</comment><date>2026-09-08 17:56:01 +0200</date><id>25e57e1d2a58ceb6994e6c82bab7533d42935788</id><msg>Dashboard Latest Leads: offer and contract badges per lead — greyed when the online link was sent, coloured once the offer is accepted / the contract is signed</msg><path><editType>edit</editType><file>server/api/admin/users/leads/latest.get.ts</file></path><path><editType>edit</editType><file>app/pages/index.vue</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit></freeStyleBuild>