<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>784</buildNumber><marked><SHA1>8d0302a82681f4f1e8aa9238b31994d338bfd07d</SHA1><branch><SHA1>8d0302a82681f4f1e8aa9238b31994d338bfd07d</SHA1><name>refs/remotes/origin/dev</name></branch></marked><revision><SHA1>8d0302a82681f4f1e8aa9238b31994d338bfd07d</SHA1><branch><SHA1>8d0302a82681f4f1e8aa9238b31994d338bfd07d</SHA1><name>refs/remotes/origin/dev</name></branch></revision></refsremotesorigindev></buildsByBranchName><lastBuiltRevision><SHA1>8d0302a82681f4f1e8aa9238b31994d338bfd07d</SHA1><branch><SHA1>8d0302a82681f4f1e8aa9238b31994d338bfd07d</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'><artifactsUrl>https://jenkins.younex.de/job/build-logship-frontend/784/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/job/build-logship-frontend/changes</changesUrl><displayUrl>https://jenkins.younex.de/job/build-logship-frontend/784/</displayUrl><testsUrl>https://jenkins.younex.de/job/build-logship-frontend/784/testReport</testsUrl></action><building>false</building><displayName>#784</displayName><duration>65207</duration><estimatedDuration>61562</estimatedDuration><fullDisplayName>build-logship-frontend #784</fullDisplayName><id>784</id><inProgress>false</inProgress><keepLog>false</keepLog><number>784</number><queueId>5936</queueId><result>SUCCESS</result><timestamp>1793408400166</timestamp><url>https://jenkins.younex.de/job/build-logship-frontend/784/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/settings/price-sheet/PriceSheetMatrix.vue</affectedPath><affectedPath>app/pages/settings/price-sheet/index.vue</affectedPath><affectedPath>app/components/settings/price-sheet/PriceSheetPreviewModal.vue</affectedPath><affectedPath>app/components/settings/price-sheet/PriceSheetOptions.vue</affectedPath><affectedPath>server/utils/shipping/priceSheet.ts</affectedPath><affectedPath>server/utils/shipping/carrierRates.ts</affectedPath><affectedPath>.claude/rules/fulfillment/carrier-rates.md</affectedPath><affectedPath>reference/shippingprices/dpd/MDB-Gesamt_V05 2026-04.pdf</affectedPath><affectedPath>reference/shippingprices/dpd/DPD-DE G300.pdf</affectedPath><affectedPath>server/assets/shipping/dpd-pricelist-2026-04.json</affectedPath><affectedPath>reference/test-scripts/dpd-pricelist-parse.mts</affectedPath><affectedPath>server/api/settings/shipping-carriers.get.ts</affectedPath><affectedPath>server/utils/shipping/carrierRateImport.ts</affectedPath><affectedPath>app/utils/shippingPriceSheet.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>fe1a084fad0a11016cbb3d0355ce69e4d7504eb0</commitId><timestamp>1793349206000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Carrier rates: DPD price lists imported (myDPD G300 + MDB 2026-04 → dpd-pricelist-2026-04.json, 1261 rows; Classic/Paketshop Europe per country, Express as zone rows + country→zone map); carrier identity from M_Shipper.M_ShipperCfg_ID (DHL / DPD groups, settings/shipping-carriers endpoint, price-sheet carrier select by config); resolver groups flat weight tiers per country and renders zone rows; markup defaults to 0 % (stored 15 % migrated once); matrix search filter now limits the PDF to the visible rows; price-sheet options panel rebuilt with Nuxt UI components
</comment><date>2026-10-30 09:33:26 +0100</date><id>fe1a084fad0a11016cbb3d0355ce69e4d7504eb0</id><msg>Carrier rates: DPD price lists imported (myDPD G300 + MDB 2026-04 → dpd-pricelist-2026-04.json, 1261 rows; Classic/Paketshop Europe per country, Express as zone rows + country→zone map); carrier identity from M_Shipper.M_ShipperCfg_ID (DHL / DPD groups, settings/shipping-carriers endpoint, price-sheet carrier select by config); resolver groups flat weight tiers per country and renders zone rows; markup defaults to 0 % (stored 15 % migrated once); matrix search filter now limits the PDF to the visible rows; price-sheet options panel rebuilt with Nuxt UI components</msg><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetPreviewModal.vue</file></path><path><editType>add</editType><file>reference/test-scripts/dpd-pricelist-parse.mts</file></path><path><editType>add</editType><file>reference/shippingprices/dpd/MDB-Gesamt_V05 2026-04.pdf</file></path><path><editType>add</editType><file>server/api/settings/shipping-carriers.get.ts</file></path><path><editType>edit</editType><file>server/utils/shipping/carrierRateImport.ts</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetOptions.vue</file></path><path><editType>edit</editType><file>app/utils/shippingPriceSheet.ts</file></path><path><editType>edit</editType><file>server/utils/shipping/carrierRates.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetMatrix.vue</file></path><path><editType>edit</editType><file>app/pages/settings/price-sheet/index.vue</file></path><path><editType>add</editType><file>reference/shippingprices/dpd/DPD-DE G300.pdf</file></path><path><editType>edit</editType><file>server/utils/shipping/priceSheet.ts</file></path><path><editType>edit</editType><file>.claude/rules/fulfillment/carrier-rates.md</file></path><path><editType>add</editType><file>server/assets/shipping/dpd-pricelist-2026-04.json</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/settings/price-sheet/PriceSheetMatrix.vue</affectedPath><affectedPath>server/utils/shipping/priceSheetPdf.ts</affectedPath><affectedPath>app/pages/settings/price-sheet/index.vue</affectedPath><affectedPath>.claude/rules/nuxt/ui-components.md</affectedPath><affectedPath>app/components/settings/price-sheet/PriceSheetCellEditor.vue</affectedPath><affectedPath>app/composables/useOfferSoftwareQuote.ts</affectedPath><affectedPath>app/components/settings/price-sheet/PriceSheetPreviewModal.vue</affectedPath><affectedPath>app/components/settings/price-sheet/PriceSheetOptions.vue</affectedPath><affectedPath>server/api/offers/quote/preview.post.ts</affectedPath><affectedPath>server/api/settings/price-sheet/resolve.post.ts</affectedPath><affectedPath>server/utils/offers/onboardingPdf.ts</affectedPath><affectedPath>.claude/rules/offers/software-quote.md</affectedPath><affectedPath>.claude/rules/fulfillment/carrier-rates.md</affectedPath><affectedPath>server/utils/offers/softwareQuotePdf.ts</affectedPath><affectedPath>server/api/offers/quote/send.post.ts</affectedPath><affectedPath>app/components/offers/SoftwareQuoteModal.vue</affectedPath><affectedPath>app/utils/shippingPriceSheet.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>e3f2b4de3992d637c6f6bfc61677ee676594a448</commitId><timestamp>1793351404000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Software offer: "Anlage Onboarding-Paket" as a separate PDF attached by default (onboardingPdf.ts: from-price, travel + hotel billed on top, not-included list, phases, editable setup scope: on-site process analysis, bins, article import, channels, carriers, label + document printers, scanners/devices, users, test run); portal document + mail/Strapi attachment + activity line, preview via document:'onboarding', attachments.onboarding persisted in the saved conditions. Price sheet: carrier select = configs only (DHL/DPD with logos, no attached shippers), multi-select carriers (shipperIds → one sheet per carrier merged by mergePriceSheets, carrier badges, PDF carrier prefixes, Tier writes under the row's carrier), row/section/surcharge checkboxes with "Alle abwählen" limiting the PDF export, markup 0 % default enforced (old 15 % pattern dropped on load); options panel rebuilt with Nuxt UI (UFieldGroup, USwitch/UCheckbox/URadio/UInputNumber gap fixes); recipes updated
</comment><date>2026-10-30 10:10:04 +0100</date><id>e3f2b4de3992d637c6f6bfc61677ee676594a448</id><msg>Software offer: "Anlage Onboarding-Paket" as a separate PDF attached by default (onboardingPdf.ts: from-price, travel + hotel billed on top, not-included list, phases, editable setup scope: on-site process analysis, bins, article import, channels, carriers, label + document printers, scanners/devices, users, test run); portal document + mail/Strapi attachment + activity line, preview via document:'onboarding', attachments.onboarding persisted in the saved conditions. Price sheet: carrier select = configs only (DHL/DPD with logos, no attached shippers), multi-select carriers (shipperIds → one sheet per carrier merged by mergePriceSheets, carrier badges, PDF carrier prefixes, Tier writes under the row's carrier), row/section/surcharge checkboxes with "Alle abwählen" limiting the PDF export, markup 0 % default enforced (old 15 % pattern dropped on load); options panel rebuilt with Nuxt UI (UFieldGroup, USwitch/UCheckbox/URadio/UInputNumber gap fixes); recipes updated</msg><path><editType>edit</editType><file>app/composables/useOfferSoftwareQuote.ts</file></path><path><editType>edit</editType><file>server/api/settings/price-sheet/resolve.post.ts</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetPreviewModal.vue</file></path><path><editType>edit</editType><file>server/utils/shipping/priceSheetPdf.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetOptions.vue</file></path><path><editType>edit</editType><file>app/pages/settings/price-sheet/index.vue</file></path><path><editType>edit</editType><file>server/api/offers/quote/preview.post.ts</file></path><path><editType>edit</editType><file>.claude/rules/offers/software-quote.md</file></path><path><editType>edit</editType><file>.claude/rules/fulfillment/carrier-rates.md</file></path><path><editType>edit</editType><file>.claude/rules/nuxt/ui-components.md</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetCellEditor.vue</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetMatrix.vue</file></path><path><editType>edit</editType><file>app/components/offers/SoftwareQuoteModal.vue</file></path><path><editType>edit</editType><file>app/utils/shippingPriceSheet.ts</file></path><path><editType>edit</editType><file>server/api/offers/quote/send.post.ts</file></path><path><editType>add</editType><file>server/utils/offers/onboardingPdf.ts</file></path><path><editType>edit</editType><file>server/utils/offers/softwareQuotePdf.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/partners/PartnerDetailRecord.vue</affectedPath><affectedPath>app/components/partners/PartnerDetailRecordLocation.vue</affectedPath><affectedPath>app/pages/partners/partners/[id]/edit.vue</affectedPath><affectedPath>.claude/rules/nuxt/ui-components.md</affectedPath><affectedPath>app/components/partners/PartnerForm.vue</affectedPath><affectedPath>app/components/partners/PartnerDetailRecordUser.vue</affectedPath><affectedPath>.claude/rules/partners/partner-edit-form.md</affectedPath><commitId>d65908d08308892d51a84856036b01a6723952ed</commitId><timestamp>1793359030000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Partner edit page on Nuxt UI: three-column layout (form | contact cards | KPI panel), grouped toolbar, segmented tabs, compact collapsible sections

- Contacts (AD_User) as cards in their own column (PartnerDetailRecordUser mode="cards": avatar, e-mail + send, phones + click-to-dial, inactive badge, add/edit/delete via the existing modal); detail-record "Kontakt (Benutzer)" tab hidden on the edit page (hide-users), view/duplicate keep the table; sticky columns, equal gutters, long e-mails wrap
- Toolbar (bannercontrol): UFieldGroup save pair + UDropdownMenu groups "Neu" (Kundenauftrag, Anfrage), "Dokumente" (Angebot, Prognose, Vertrag, SEPA, Bericht), "E-Mails" (Verlauf IM/MP, Zugangsdaten), "…" (Anhang, Duplizieren, Änderungsprotokoll via ChangeLogModal); role/processing conditions kept as disabled items
- Tabs: UTabs as a segmented pill bar with icons, active tab highlighted; tab strip inside the edit wrapper so it starts at the form's left edge; first section, contacts card and KPI row aligned on one line
- PartnerForm converted to Nuxt UI: 23 sections as UCard with coloured, larger titles, collapsible and collapsed by default (open state in localStorage logship_partner_sections); UFormField (icon label slot + UTooltip hint), UInput/USelect/UTextarea (size sm), USwitch on toggle cards and flags (toggleFlag/setFlag), URadioGroup for the rent mode, UButton everywhere; SelectBox and DatePicker unchanged; compact spacing (field 8 px, label 2 px, halved column gutters, zero card padding)
- Fixes: freight-rule select crashed on the '' option (Reka SelectItem forbids it → sentinel), USelect trigger zero width + unstyled panel, 9 Tabler icon names missing from the shipped font (blank glyphs) replaced, contacts/locations loaders no longer throw when the API returns nothing
- Recipes: nuxt/ui-components.md (USelect/UTabs/UCard/UFormField gaps), partners/partner-edit-form.md (new form structure + edit page layout)
</comment><date>2026-10-30 12:17:10 +0100</date><id>d65908d08308892d51a84856036b01a6723952ed</id><msg>Partner edit page on Nuxt UI: three-column layout (form | contact cards | KPI panel), grouped toolbar, segmented tabs, compact collapsible sections</msg><path><editType>edit</editType><file>app/pages/partners/partners/[id]/edit.vue</file></path><path><editType>edit</editType><file>app/components/partners/PartnerDetailRecordLocation.vue</file></path><path><editType>edit</editType><file>app/components/partners/PartnerDetailRecordUser.vue</file></path><path><editType>edit</editType><file>.claude/rules/nuxt/ui-components.md</file></path><path><editType>edit</editType><file>app/components/partners/PartnerDetailRecord.vue</file></path><path><editType>edit</editType><file>.claude/rules/partners/partner-edit-form.md</file></path><path><editType>edit</editType><file>app/components/partners/PartnerForm.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>reference/ci/deploy-production.sh</affectedPath><commitId>87bd740025e1476eec9e8228f7162712ea3602d9</commitId><timestamp>1793360043000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Production deploy: no more SQLite writes into the replaced live dir (lost contract-signing row 2026-10-29)

- Native module builds (better-sqlite3 rebuild, sqlite3 from source, OCR/PDF runtime asset copies, load gate) now run in the STAGE dir before the swap; the live-dir swap itself takes seconds
- `pm2 stop` of the app before the rollback copy / rm -rf of the live dir: SQLite connections close and checkpoint, no request can write to deleted inodes (a contract-signing row written during the minutes-long post-swap build window was lost while its PDFs landed in the new dir)
- SQLite backups through the better-sqlite3 online backup API (includes WAL frames); plain cp as fallback
</comment><date>2026-10-30 12:34:03 +0100</date><id>87bd740025e1476eec9e8228f7162712ea3602d9</id><msg>Production deploy: no more SQLite writes into the replaced live dir (lost contract-signing row 2026-10-29)</msg><path><editType>edit</editType><file>reference/ci/deploy-production.sh</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/settings/price-sheet/PriceSheetMatrix.vue</affectedPath><affectedPath>reference/test-scripts/price-sheet-pdf-smoke.mts</affectedPath><affectedPath>server/utils/shipping/priceSheetPdf.ts</affectedPath><affectedPath>app/pages/settings/price-sheet/index.vue</affectedPath><affectedPath>nuxt.config.ts</affectedPath><affectedPath>.claude/rules/fulfillment/carrier-rates.md</affectedPath><affectedPath>app/components/settings/price-sheet/PriceSheetOptions.vue</affectedPath><affectedPath>app/utils/shippingPriceSheet.ts</affectedPath><affectedPath>server/utils/shipping/carrierLogos.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>03731494971458295d341c3c7a52962a210e58d7</commitId><timestamp>1793360043000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Price sheet: carrier logos + per-carrier grouping (matrix and PDF), PDF rates first / notes last, services check-all, Nuxt UI country multi-select, markup 0 % everywhere

- shippingPriceSheet.ts: CARRIER_LOGO_PATHS / carrierLogoPath() as the single logo map, groupRowsByCarrier() for merged sheets
- Matrix: carrier heading row (logo, name, row count) per section and in the surcharge table, logo inline before each service on merged sheets, "Kosten" header carries the single carrier's logo
- PDF: DHL/DPD PNG logos bundled as Nitro server asset assets:shipper (carrierLogos.ts), cover "[logo] DHL + [logo] DPD", carrier heading rows + logo before the service in every table; page order cover → rate sections → surcharges → service overview → notes; the per-section notes are collected onto the notes page instead of sitting above the tables
- Options panel: "Alle an / Alle aus" for the services list with counter, country selection as USelectMenu multiple (search, flags, ISO codes, taller trigger) replacing the popover, carrier-neutral markup label (shared.js ps_markup), stored markups reset once to 0 % (markupV3) so no section keeps an old percentage
- Smoke script mocks assets:shipper too
</comment><date>2026-10-30 12:34:03 +0100</date><id>03731494971458295d341c3c7a52962a210e58d7</id><msg>Price sheet: carrier logos + per-carrier grouping (matrix and PDF), PDF rates first / notes last, services check-all, Nuxt UI country multi-select, markup 0 % everywhere</msg><path><editType>edit</editType><file>.claude/rules/fulfillment/carrier-rates.md</file></path><path><editType>edit</editType><file>reference/test-scripts/price-sheet-pdf-smoke.mts</file></path><path><editType>edit</editType><file>nuxt.config.ts</file></path><path><editType>edit</editType><file>app/utils/shippingPriceSheet.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetMatrix.vue</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetOptions.vue</file></path><path><editType>add</editType><file>server/utils/shipping/carrierLogos.ts</file></path><path><editType>edit</editType><file>server/utils/shipping/priceSheetPdf.ts</file></path><path><editType>edit</editType><file>app/pages/settings/price-sheet/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/TopMegaBar.vue</affectedPath><commitId>e6ed749cb9aa1676b35a8f6793b67f1f9134e48c</commitId><timestamp>1793360306000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Top bar: merchant label moved into the left zone as a chip (no longer overlaps the centred Ticket/Order buttons); side zones may shrink (minmax(0,1fr)), search shrinks first, quick-action buttons go icon-only below 1600/1400 px
</comment><date>2026-10-30 12:38:26 +0100</date><id>e6ed749cb9aa1676b35a8f6793b67f1f9134e48c</id><msg>Top bar: merchant label moved into the left zone as a chip (no longer overlaps the centred Ticket/Order buttons); side zones may shrink (minmax(0,1fr)), search shrinks first, quick-action buttons go icon-only below 1600/1400 px</msg><path><editType>edit</editType><file>app/components/TopMegaBar.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/orders/stock-lines.post.ts</affectedPath><affectedPath>app/components/partners/PartnerOrderLineTable.vue</affectedPath><commitId>0d10b13fbabdb1809889fe218b5ac275914a22d6</commitId><timestamp>1793360608000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Order lines: "Alle Artikel mit Bestand" — one position per article of the order's organization that has stock, qty = QtyOnHand

- POST server/api/orders/stock-lines { orgId, priceListId, warehouseId }: active articles of the org with their storage rows (productStorageHelper, no child $expand), QtyOnHand summed over all locators (or the order's warehouse), return-locator stock reported separately, prices from the newest version of the order's price list in chunked m_productprice queries
- PartnerOrderLineTable: button next to "Position hinzufügen" (order modal + every create/edit line table) that appends the lines with qty = on hand and PriceList/PriceStd, skips articles already on the order, info line with added / skipped / without-price counts (price 0 → check)
</comment><date>2026-10-30 12:43:28 +0100</date><id>0d10b13fbabdb1809889fe218b5ac275914a22d6</id><msg>Order lines: "Alle Artikel mit Bestand" — one position per article of the order's organization that has stock, qty = QtyOnHand</msg><path><editType>edit</editType><file>app/components/partners/PartnerOrderLineTable.vue</file></path><path><editType>add</editType><file>server/api/orders/stock-lines.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/sales/OrderForm.vue</affectedPath><affectedPath>app/pages/sales/orders/add.vue</affectedPath><affectedPath>app/router.options.ts</affectedPath><affectedPath>app/pages/sales/orders/create.vue</affectedPath><commitId>40aafbad732e3ef3fef33b6737db0c5ab3fac06b</commitId><timestamp>1793361535000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Create sales order page (/create/sales-order) rebuilt with the quick-order modal's design and features, order form on Nuxt UI

- add.vue: hero header (badge, title, org / customer / positions chips), segmented UTabs for Order / Delivery / Invoicing / Reference / Integration / Status, form card, positions card with the modal's line table (article search, qty / price editing, "Alle Artikel mit Bestand") live BEFORE the first save — the lines travel with the order (orderLines → C_OrderLine), sticky footer with "Fehlt: …" readiness hint, Ctrl+Enter, Weiter, Speichern; keeps the US-state gate, DHL insurance / customs / relabel / marketplace-id fields and the tab-aware navigation after save
- The duplicate create.vue (old /windows/sales-orders-create page) is removed; the window route now loads add.vue too
- sales/OrderForm.vue converted by script: 60 field wrappers → UFormField (label slot), 57 inputs → UInput, 8 checkboxes → USwitch, 4 static selects → USelect, copy / external-link / tracking buttons → UButton; non-scoped overrides for the empty-bodied Nuxt UI utilities (inputs, select trigger + panel, switch track/thumb, buttons); inline address editors, SelectBox and DatePicker unchanged
</comment><date>2026-10-30 12:58:55 +0100</date><id>40aafbad732e3ef3fef33b6737db0c5ab3fac06b</id><msg>Create sales order page (/create/sales-order) rebuilt with the quick-order modal's design and features, order form on Nuxt UI</msg><path><editType>edit</editType><file>app/pages/sales/orders/add.vue</file></path><path><editType>edit</editType><file>app/router.options.ts</file></path><path><editType>edit</editType><file>app/components/sales/OrderForm.vue</file></path><path><editType>delete</editType><file>app/pages/sales/orders/create.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/settings/price-sheet/PriceSheetMatrix.vue</affectedPath><affectedPath>app/components/settings/price-sheet/PriceSheetOptions.vue</affectedPath><affectedPath>server/utils/shipping/priceSheetPdf.ts</affectedPath><affectedPath>app/pages/settings/price-sheet/index.vue</affectedPath><affectedPath>app/utils/shippingPriceSheet.ts</affectedPath><affectedPath>.claude/rules/fulfillment/carrier-rates.md</affectedPath><commitId>a43f136338a7b5f2149ceabf14a2caf953c3f06f</commitId><timestamp>1793361683000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Price sheet: Germany preselected on load, pinned DE/AT/FR/NL/CH quick picks, one carrier logo per group + gaps between groups (matrix and PDF), narrower wrapping surcharge column

- defaultSheetOptions: countryScope 'list' with ['DE'] (stored options reset once via countryV3); PINNED_COUNTRY_CODES as toggle chips above the country select and sorted first in the list
- Matrix: a carrier group following another one gets a padded top border; surcharge label column 25 % narrower (142 px) with wrapping labels
- PDF: logo only on the carrier heading row (service rows plain), white spacer row between carrier groups, surcharge label column 142 pt
</comment><date>2026-10-30 13:01:23 +0100</date><id>a43f136338a7b5f2149ceabf14a2caf953c3f06f</id><msg>Price sheet: Germany preselected on load, pinned DE/AT/FR/NL/CH quick picks, one carrier logo per group + gaps between groups (matrix and PDF), narrower wrapping surcharge column</msg><path><editType>edit</editType><file>app/pages/settings/price-sheet/index.vue</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetOptions.vue</file></path><path><editType>edit</editType><file>app/utils/shippingPriceSheet.ts</file></path><path><editType>edit</editType><file>.claude/rules/fulfillment/carrier-rates.md</file></path><path><editType>edit</editType><file>server/utils/shipping/priceSheetPdf.ts</file></path><path><editType>edit</editType><file>app/components/settings/price-sheet/PriceSheetMatrix.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/sales/orders/[id]/edit.vue</affectedPath><commitId>be9d899a98a72a689c5a23adff03fa5fce3b6dea</commitId><timestamp>1793361728000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Sales order edit: positions table anchored under the form columns (grid: form | side panel, positions in row 2 of column 1) — a long side column (shipments / invoices / contacts / tickets) no longer pushes the positions down
</comment><date>2026-10-30 13:02:08 +0100</date><id>be9d899a98a72a689c5a23adff03fa5fce3b6dea</id><msg>Sales order edit: positions table anchored under the form columns (grid: form | side panel, positions in row 2 of column 1) — a long side column (shipments / invoices / contacts / tickets) no longer pushes the positions down</msg><path><editType>edit</editType><file>app/pages/sales/orders/[id]/edit.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/sales/OrderForm.vue</affectedPath><affectedPath>app/utils/randomEmail.ts</affectedPath><affectedPath>app/components/partners/PartnerQuickForm.vue</affectedPath><commitId>178f9bf899be01a5c52db86cf4cf429b4402d99f</commitId><timestamp>1793362713000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Order creation (modal + page): placeholder e-mail generator next to the e-mail field

- utils/randomEmail.ts: randomLogyouEmail() → kunde-&lt;10 random base36&gt;@logyou.de (crypto random)
- PartnerQuickForm (quick-order modal) and sales/OrderForm (create / edit page): wand button beside the e-mail input proposes an address; it is applied only after the user confirms it in an inline row (Übernehmen / Neu würfeln / Abbrechen)
</comment><date>2026-10-30 13:18:33 +0100</date><id>178f9bf899be01a5c52db86cf4cf429b4402d99f</id><msg>Order creation (modal + page): placeholder e-mail generator next to the e-mail field</msg><path><editType>edit</editType><file>app/components/partners/PartnerQuickForm.vue</file></path><path><editType>add</editType><file>app/utils/randomEmail.ts</file></path><path><editType>edit</editType><file>app/components/sales/OrderForm.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/partners/partners/quick-add.post.ts</affectedPath><commitId>9c1920c94bbf70ba21c11caa4cd92c54367c80e6</commitId><timestamp>1793362890000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Quick order: coerce AD_Org_ID / C_Country_ID / C_Region_ID ids to numbers before posting partner + address — a cookie/config string id made iDempiere reject the new customer's C_Location (WrongDataType … should be Integer, prod 2026-10-30)
</comment><date>2026-10-30 13:21:30 +0100</date><id>9c1920c94bbf70ba21c11caa4cd92c54367c80e6</id><msg>Quick order: coerce AD_Org_ID / C_Country_ID / C_Region_ID ids to numbers before posting partner + address — a cookie/config string id made iDempiere reject the new customer's C_Location (WrongDataType … should be Integer, prod 2026-10-30)</msg><path><editType>edit</editType><file>server/api/partners/partners/quick-add.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>reference/jasper-reports/shipment/M_InOut_Address.jrxml</affectedPath><affectedPath>.claude/rules/fulfillment/commissioning.md</affectedPath><affectedPath>reference/jasper-reports/shipment/M_InOut_Lines.jrxml</affectedPath><affectedPath>app/components/settings/CommissionTableForm.vue</affectedPath><affectedPath>app/pages/settings/commission-tables/[id]/edit.vue</affectedPath><affectedPath>.claude/rules/printing/jasper-shipment-report.md</affectedPath><affectedPath>reference/jasper-reports/styles.jrtx</affectedPath><affectedPath>reference/jasper-reports/shipment-a5/M_InOut_Address_A5.jrxml</affectedPath><affectedPath>reference/jasper-reports/README.md</affectedPath><affectedPath>reference/jasper-reports/shipment/M_InOut_Document.jrxml</affectedPath><affectedPath>reference/jasper-reports/shipment-a5/M_InOut_Document_A5.jrxml</affectedPath><affectedPath>reference/jasper-reports/compile.groovy</affectedPath><affectedPath>reference/jasper-reports/shipment/M_InOut_OrgInfoblock.jrxml</affectedPath><affectedPath>reference/jasper-reports/shipment/Letterhead_Footer.jrxml</affectedPath><affectedPath>server/api/settings/commission-tables/update.put.ts</affectedPath><affectedPath>reference/README.md</affectedPath><affectedPath>reference/jasper-reports/shipment-a5/M_InOut_Lines_A5.jrxml</affectedPath><commitId>8cac0a6a0a3ec6c69dd96c99db1da6170afe5cc8</commitId><timestamp>1793365645000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Commission table edit page on Nuxt UI + printer pickers; shipment Jasper slip: pickup vs. delivery + signature box

Commission tables (Settings → Commission Tables):
- CommissionTableForm rebuilt with Nuxt UI (UCard sections, UFormField with icon labels + UTooltip info
  icons, UInput/UTextarea/USelect/USwitch, UFieldGroup actions); edit page gets the partner-page toolbar
  (save group, preview, clone, manage printers, back) and a hero header; create/duplicate keep the in-form actions
- Shipping (label) printer and A4 printer are now pickers over Settings → Printers (/api/printers): label
  printers for shipping_printer, paper printers for a4_printer, each item with CUPS queue + location; the
  stored value stays the CUPS queue name, so the commissioning page pickers / getA4Printer keep working
- A queue saved on a table but missing in Settings → Printers is flagged and can be created in place
  (shared org *); the five queues referenced by Tisch 1–3 (labelprinter-4/-5, commission-a4-1/2/3) were
  created on prod as CUST_Printer rows
- Cameras: USelect over the Synology list (loaded on open) + ID fallback input
- Side card "Geräte am Tisch": table illustration (SVG) with numbered device badges 1 label printer,
  2 A4 printer, 3 camera, 4 camera 2 matching the numbered fields, hover sync, legend with current values;
  Organisation &amp; Status card with org picker, tenant, Active switch
- Org "*" (id 0) was dropped as falsy on load and on update; tenant falls back to AD_Client identifier

Shipment Jasper report (iDempiere host, templates archived under reference/jasper-reports):
- DeliveryViaRule = 'P' (Abholung) replaces "Versand via &lt;carrier&gt;" + logo with "Abholung / Selbstabholung",
  relabels Lieferdatum → Abholdatum and prints a "WARE ERHALTEN (ABHOLUNG)" signature box (Datum /
  Unterschrift) right of the barcode — A4 (M_InOut_Document + M_InOut_OrgInfoblock) and A5 slip
- Deployed + compiled on 192.168.12.72 (Groovy compile one-liner, backups shipment*.bak-20261030);
  recipes: printing/jasper-shipment-report.md, commissioning.md printer note
</comment><date>2026-10-30 14:07:25 +0100</date><id>8cac0a6a0a3ec6c69dd96c99db1da6170afe5cc8</id><msg>Commission table edit page on Nuxt UI + printer pickers; shipment Jasper slip: pickup vs. delivery + signature box</msg><path><editType>add</editType><file>reference/jasper-reports/compile.groovy</file></path><path><editType>add</editType><file>reference/jasper-reports/shipment/Letterhead_Footer.jrxml</file></path><path><editType>edit</editType><file>server/api/settings/commission-tables/update.put.ts</file></path><path><editType>edit</editType><file>reference/README.md</file></path><path><editType>edit</editType><file>.claude/rules/fulfillment/commissioning.md</file></path><path><editType>add</editType><file>reference/jasper-reports/shipment/M_InOut_Lines.jrxml</file></path><path><editType>add</editType><file>reference/jasper-reports/shipment/M_InOut_OrgInfoblock.jrxml</file></path><path><editType>add</editType><file>reference/jasper-reports/shipment-a5/M_InOut_Document_A5.jrxml</file></path><path><editType>add</editType><file>reference/jasper-reports/README.md</file></path><path><editType>add</editType><file>reference/jasper-reports/shipment-a5/M_InOut_Lines_A5.jrxml</file></path><path><editType>add</editType><file>reference/jasper-reports/shipment/M_InOut_Address.jrxml</file></path><path><editType>add</editType><file>reference/jasper-reports/shipment-a5/M_InOut_Address_A5.jrxml</file></path><path><editType>edit</editType><file>app/pages/settings/commission-tables/[id]/edit.vue</file></path><path><editType>add</editType><file>reference/jasper-reports/shipment/M_InOut_Document.jrxml</file></path><path><editType>add</editType><file>reference/jasper-reports/styles.jrtx</file></path><path><editType>edit</editType><file>app/components/settings/CommissionTableForm.vue</file></path><path><editType>add</editType><file>.claude/rules/printing/jasper-shipment-report.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/settings/commission-tables/[id]/edit.vue</affectedPath><affectedPath>app/components/settings/CommissionTableForm.vue</affectedPath><commitId>d627fa5e4095ea494e9ff03bf2b75b2ec68bcb8f</commitId><timestamp>1793366036000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Commission table form: badge hover no longer flickers (CSS scale was replacing the SVG translate → inner group scales), compact spacing like the partner form (8 px fields, dashed section heads, 2 rem inputs, smaller hero), grid 2/3 form + 1/3 side, rounded card accent bar, camera id 0 shown as empty
</comment><date>2026-10-30 14:13:56 +0100</date><id>d627fa5e4095ea494e9ff03bf2b75b2ec68bcb8f</id><msg>Commission table form: badge hover no longer flickers (CSS scale was replacing the SVG translate → inner group scales), compact spacing like the partner form (8 px fields, dashed section heads, 2 rem inputs, smaller hero), grid 2/3 form + 1/3 side, rounded card accent bar, camera id 0 shown as empty</msg><path><editType>edit</editType><file>app/pages/settings/commission-tables/[id]/edit.vue</file></path><path><editType>edit</editType><file>app/components/settings/CommissionTableForm.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/offers/softwareQuotePdf.ts</affectedPath><affectedPath>app/composables/useOfferSoftwareQuote.ts</affectedPath><affectedPath>app/components/offers/SoftwareQuoteModal.vue</affectedPath><affectedPath>.claude/rules/offers/software-quote.md</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>252623b881525125812f6596c0af871d1d9b475c</commitId><timestamp>1793367734000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>LogShip Cloud offer: with the onboarding annex attached the offer prints only a price-less 'Onboarding-Paket – optional' position (details + price in the annex, forecast one-time row dropped); preview step shows all outgoing documents (offer / annex / flyer) as tabs and 'PDFs herunterladen (n)' saves them all (iframe keyed per doc — nuxt-lazy-load one-shot data-src)
</comment><date>2026-10-30 14:42:14 +0100</date><id>252623b881525125812f6596c0af871d1d9b475c</id><msg>LogShip Cloud offer: with the onboarding annex attached the offer prints only a price-less 'Onboarding-Paket – optional' position (details + price in the annex, forecast one-time row dropped); preview step shows all outgoing documents (offer / annex / flyer) as tabs and 'PDFs herunterladen (n)' saves them all (iframe keyed per doc — nuxt-lazy-load one-shot data-src)</msg><path><editType>edit</editType><file>app/components/offers/SoftwareQuoteModal.vue</file></path><path><editType>edit</editType><file>server/utils/offers/softwareQuotePdf.ts</file></path><path><editType>edit</editType><file>app/composables/useOfferSoftwareQuote.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>.claude/rules/offers/software-quote.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/print/relabel-labels.post.ts</affectedPath><affectedPath>app/plugins/03.notifications-stream.client.ts</affectedPath><affectedPath>server/api/print/order-attachments.post.ts</affectedPath><affectedPath>server/api/settings/print-agents/enroll-code/[code].delete.ts</affectedPath><affectedPath>server/api/print-agent/backup.post.ts</affectedPath><affectedPath>server/api/print/[id]/product.post.ts</affectedPath><affectedPath>server/api/print-agent/backup.get.ts</affectedPath><affectedPath>server/api/print/labelprint.post.ts</affectedPath><affectedPath>server/api/print/index.get.ts</affectedPath><affectedPath>server/api/print-agent/jobs/ack.post.ts</affectedPath><affectedPath>server/api/settings/print-agents/jobs/index.get.ts</affectedPath><affectedPath>server/api/settings/print-agents/index.get.ts</affectedPath><affectedPath>app/plugins/05.print-jobs.client.ts</affectedPath><affectedPath>app/components/settings/PrinterForm.vue</affectedPath><affectedPath>server/api/print/index.post.ts</affectedPath><affectedPath>server/api/print-agent/jobs/next.get.ts</affectedPath><affectedPath>server/api/print-agent/enroll.post.ts</affectedPath><affectedPath>server/api/settings/print-agents/bindings/[printerId].put.ts</affectedPath><affectedPath>server/api/print/attachment-labels.post.ts</affectedPath><affectedPath>server/api/printers/cups-media.get.ts</affectedPath><affectedPath>server/api/print/[id]/locator.post.ts</affectedPath><affectedPath>server/utils/printAgentAuth.ts</affectedPath><affectedPath>server/api/settings/print-agents/jobs/mine.get.ts</affectedPath><affectedPath>app/pages/settings/printers/[id]/duplicate.vue</affectedPath><affectedPath>server/api/print-agent/jobs/[id]/file.get.ts</affectedPath><affectedPath>server/api/print-agent/commands/[id]/result.post.ts</affectedPath><affectedPath>app/pages/settings/printers/index.vue</affectedPath><affectedPath>server/api/print/product.post.ts</affectedPath><affectedPath>server/api/print/picklist.post.ts</affectedPath><affectedPath>server/api/settings/print-agents/[id]/command.post.ts</affectedPath><affectedPath>app/pages/settings/printers/[id]/edit.vue</affectedPath><affectedPath>app/pages/settings/printers/create.vue</affectedPath><affectedPath>server/api/settings/print-agents/status.get.ts</affectedPath><affectedPath>server/api/print/attachment-smart.post.ts</affectedPath><affectedPath>server/utils/printDispatch.ts</affectedPath><affectedPath>server/api/print/return-label.post.ts</affectedPath><affectedPath>server/utils/printSpoolDb.ts</affectedPath><affectedPath>server/api/print-agent/heartbeat.post.ts</affectedPath><affectedPath>server/api/mobile/reconditioning/print-report.post.ts</affectedPath><affectedPath>server/api/settings/print-agents/[id].delete.ts</affectedPath><affectedPath>server/utils/labelMedia.ts</affectedPath><affectedPath>server/api/settings/print-agents/[id].put.ts</affectedPath><affectedPath>server/api/print/inout-labels.post.ts</affectedPath><affectedPath>server/plugins/print-spool-maintenance.ts</affectedPath><affectedPath>server/api/settings/print-agents/enroll-code.post.ts</affectedPath><affectedPath>server/api/settings/print-agents/[id]/commands.get.ts</affectedPath><affectedPath>server/api/settings/print-agents/jobs/[id]/cancel.post.ts</affectedPath><affectedPath>app/composables/usePrinterBinding.ts</affectedPath><affectedPath>server/api/fulfillment/generate-fee-report.post.ts</affectedPath><affectedPath>server/api/settings/print-agents/jobs/[id]/retry.post.ts</affectedPath><affectedPath>app/components/settings/PrintAgentsCard.vue</affectedPath><commitId>5c409d9126b9ab2e347f950c7422daa6b87d88ea</commitId><timestamp>1793373298000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Printing: per-printer dispatch (local CUPS or LogShip Print Agent in the tenant LAN) — spool, agent protocol, settings UI

The 13 `lp` call sites (server/api/print/*, mobile reconditioning report) now go through
server/utils/printDispatch.ts: printFile()/printFiles() resolve the CUPS queue per printer —
no binding → local `lp` as before (execFile, whitelisted options, no shell string any more);
binding → job spooled for the tenant's Print Agent (status 'queued' + jobId, legacy
message/stdout fields kept). Storage root configurable (PRINT_STORAGE_DIR, default /root/storage);
the dead GET /api/print smoke route is removed.

Instance-local SQLite data/print-spool.db (server/utils/printSpoolDb.ts): agents (token hash,
heartbeat inventory/health), enrolment codes, printer→agent bindings keyed by CUST_Printer_ID
(no iDempiere column), jobs (queued→sent→spooled→completed|failed, batch id) and commands.
Agent protocol under /api/print-agent (enroll, heartbeat, long-poll jobs/next with inline files
≤ 300 KB, jobs/:id/file, jobs/ack, commands/:id/result, cups backup) — Bearer agent token.
Admin routes under /api/settings/print-agents (agents, enrol codes, bindings, jobs, commands,
status). Maintenance plugin re-queues stale 'sent' jobs and purges finished rows after 24 h.

Settings → Printers: Print-Agents card (online state, version, device queues with PPD label
size, queue depth, job stats, update/lpstat/restart-cups/journal/support-tunnel commands,
discovered queues → "Anlegen", job list with retry/cancel); printer form gets the per-printer
agent + device-queue picker; create/edit/duplicate save the binding after the iDempiere write.
labelMedia/cups-media read agent-reported label sizes for bound queues. Print-job feedback:
plugins/05.print-jobs.client.ts shows one toast per single job and one progress toast per
batch (SSE relay from the notifications plugin + cross-worker poll of jobs/mine).
</comment><date>2026-10-30 16:14:58 +0100</date><id>5c409d9126b9ab2e347f950c7422daa6b87d88ea</id><msg>Printing: per-printer dispatch (local CUPS or LogShip Print Agent in the tenant LAN) — spool, agent protocol, settings UI</msg><path><editType>edit</editType><file>server/utils/labelMedia.ts</file></path><path><editType>add</editType><file>server/api/print-agent/commands/[id]/result.post.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/[id]/command.post.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/enroll-code.post.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/enroll-code/[code].delete.ts</file></path><path><editType>edit</editType><file>server/api/print/labelprint.post.ts</file></path><path><editType>edit</editType><file>app/pages/settings/printers/create.vue</file></path><path><editType>add</editType><file>app/plugins/05.print-jobs.client.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/jobs/[id]/cancel.post.ts</file></path><path><editType>edit</editType><file>app/pages/settings/printers/index.vue</file></path><path><editType>add</editType><file>server/api/settings/print-agents/bindings/[printerId].put.ts</file></path><path><editType>edit</editType><file>app/components/settings/PrinterForm.vue</file></path><path><editType>edit</editType><file>server/api/print/[id]/locator.post.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/jobs/[id]/retry.post.ts</file></path><path><editType>edit</editType><file>app/pages/settings/printers/[id]/edit.vue</file></path><path><editType>add</editType><file>server/api/print-agent/backup.get.ts</file></path><path><editType>edit</editType><file>server/api/mobile/reconditioning/print-report.post.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/[id]/commands.get.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/jobs/index.get.ts</file></path><path><editType>add</editType><file>server/api/print-agent/backup.post.ts</file></path><path><editType>edit</editType><file>server/api/print/product.post.ts</file></path><path><editType>edit</editType><file>server/api/print/return-label.post.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/[id].put.ts</file></path><path><editType>add</editType><file>server/utils/printDispatch.ts</file></path><path><editType>add</editType><file>server/utils/printSpoolDb.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/jobs/mine.get.ts</file></path><path><editType>edit</editType><file>server/api/print/picklist.post.ts</file></path><path><editType>edit</editType><file>server/api/print/attachment-smart.post.ts</file></path><path><editType>edit</editType><file>server/api/print/relabel-labels.post.ts</file></path><path><editType>add</editType><file>server/api/print-agent/enroll.post.ts</file></path><path><editType>edit</editType><file>server/api/print/index.post.ts</file></path><path><editType>edit</editType><file>server/api/print/inout-labels.post.ts</file></path><path><editType>add</editType><file>server/plugins/print-spool-maintenance.ts</file></path><path><editType>delete</editType><file>server/api/print/index.get.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/index.get.ts</file></path><path><editType>add</editType><file>server/utils/printAgentAuth.ts</file></path><path><editType>add</editType><file>server/api/settings/print-agents/[id].delete.ts</file></path><path><editType>edit</editType><file>server/api/print/order-attachments.post.ts</file></path><path><editType>add</editType><file>app/composables/usePrinterBinding.ts</file></path><path><editType>edit</editType><file>server/api/fulfillment/generate-fee-report.post.ts</file></path><path><editType>edit</editType><file>server/api/print/[id]/product.post.ts</file></path><path><editType>edit</editType><file>app/plugins/03.notifications-stream.client.ts</file></path><path><editType>edit</editType><file>app/pages/settings/printers/[id]/duplicate.vue</file></path><path><editType>add</editType><file>server/api/settings/print-agents/status.get.ts</file></path><path><editType>add</editType><file>server/api/print-agent/jobs/ack.post.ts</file></path><path><editType>add</editType><file>server/api/print-agent/jobs/[id]/file.get.ts</file></path><path><editType>edit</editType><file>server/api/print/attachment-labels.post.ts</file></path><path><editType>edit</editType><file>server/api/printers/cups-media.get.ts</file></path><path><editType>add</editType><file>server/api/print-agent/jobs/next.get.ts</file></path><path><editType>add</editType><file>app/components/settings/PrintAgentsCard.vue</file></path><path><editType>add</editType><file>server/api/print-agent/heartbeat.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.claude/rules/printing/print-agent.md</affectedPath><affectedPath>app/components/settings/PrintAgentsCard.vue</affectedPath><affectedPath>server/utils/printSpoolDb.ts</affectedPath><commitId>defe0d60fe947f5da3b406eda1d06adef4eba43e</commitId><timestamp>1793374751000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Print-Agents: remote printer administration on the device — 'Drucker einrichten' dialog (discover USB/network printers via lpinfo/ippfind, create CUPS queues with driver presets + media, test page, enable/disable/accept, cancel, remove) over the agent command channel; command whitelist extended; recipe .claude/rules/printing/print-agent.md
</comment><date>2026-10-30 16:39:11 +0100</date><id>defe0d60fe947f5da3b406eda1d06adef4eba43e</id><msg>Print-Agents: remote printer administration on the device — 'Drucker einrichten' dialog (discover USB/network printers via lpinfo/ippfind, create CUPS queues with driver presets + media, test page, enable/disable/accept, cancel, remove) over the agent command channel; command whitelist extended; recipe .claude/rules/printing/print-agent.md</msg><path><editType>edit</editType><file>server/utils/printSpoolDb.ts</file></path><path><editType>add</editType><file>.claude/rules/printing/print-agent.md</file></path><path><editType>edit</editType><file>app/components/settings/PrintAgentsCard.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/print-agent/jobs/next.get.ts</affectedPath><affectedPath>server/utils/printSpoolDb.ts</affectedPath><commitId>e8b6411756532146e174ac448b4b67c71ae4511b</commitId><timestamp>1793376318000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Print-Agent: fresh-start poll re-queues the agent's claimed jobs at once (no 3-min wait after an agent restart)
</comment><date>2026-10-30 17:05:18 +0100</date><id>e8b6411756532146e174ac448b4b67c71ae4511b</id><msg>Print-Agent: fresh-start poll re-queues the agent's claimed jobs at once (no 3-min wait after an agent restart)</msg><path><editType>edit</editType><file>server/api/print-agent/jobs/next.get.ts</file></path><path><editType>edit</editType><file>server/utils/printSpoolDb.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/print-agent/jobs/next.get.ts</affectedPath><affectedPath>server/plugins/print-spool-maintenance.ts</affectedPath><affectedPath>server/utils/printSpoolDb.ts</affectedPath><commitId>8d0302a82681f4f1e8aa9238b31994d338bfd07d</commitId><timestamp>1793377267000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Print-Agent: fresh-start reconcile list of unconfirmed spooled jobs; maintenance closes spooled jobs without completion report after 30 min
</comment><date>2026-10-30 17:21:07 +0100</date><id>8d0302a82681f4f1e8aa9238b31994d338bfd07d</id><msg>Print-Agent: fresh-start reconcile list of unconfirmed spooled jobs; maintenance closes spooled jobs without completion report after 30 min</msg><path><editType>edit</editType><file>server/plugins/print-spool-maintenance.ts</file></path><path><editType>edit</editType><file>server/api/print-agent/jobs/next.get.ts</file></path><path><editType>edit</editType><file>server/utils/printSpoolDb.ts</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName><id>info</id></culprit></freeStyleBuild>