{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.triggers.TimerTrigger$TimerTriggerCause",
          "shortDescription" : "Started by timer"
        }
      ]
    },
    {
      
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "refs/remotes/origin/dev" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 784,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "8d0302a82681f4f1e8aa9238b31994d338bfd07d",
            "branch" : [
              {
                "SHA1" : "8d0302a82681f4f1e8aa9238b31994d338bfd07d",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          },
          "revision" : {
            "SHA1" : "8d0302a82681f4f1e8aa9238b31994d338bfd07d",
            "branch" : [
              {
                "SHA1" : "8d0302a82681f4f1e8aa9238b31994d338bfd07d",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "8d0302a82681f4f1e8aa9238b31994d338bfd07d",
        "branch" : [
          {
            "SHA1" : "8d0302a82681f4f1e8aa9238b31994d338bfd07d",
            "name" : "refs/remotes/origin/dev"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/younex1/erp-nuxt-frontend.git"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    
  ],
  "building" : False,
  "description" : None,
  "displayName" : "#784",
  "duration" : 65207,
  "estimatedDuration" : 61562,
  "executor" : None,
  "fullDisplayName" : "build-logship-frontend #784",
  "id" : "784",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 784,
  "queueId" : 5936,
  "result" : "SUCCESS",
  "timestamp" : 1793408400166,
  "url" : "https://jenkins.younex.de/job/build-logship-frontend/784/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/settings/price-sheet/PriceSheetMatrix.vue",
          "app/pages/settings/price-sheet/index.vue",
          "app/components/settings/price-sheet/PriceSheetOptions.vue",
          "app/components/settings/price-sheet/PriceSheetPreviewModal.vue",
          "server/utils/shipping/priceSheet.ts",
          "server/utils/shipping/carrierRates.ts",
          ".claude/rules/fulfillment/carrier-rates.md",
          "server/assets/shipping/dpd-pricelist-2026-04.json",
          "reference/shippingprices/dpd/DPD-DE G300.pdf",
          "reference/shippingprices/dpd/MDB-Gesamt_V05 2026-04.pdf",
          "reference/test-scripts/dpd-pricelist-parse.mts",
          "server/api/settings/shipping-carriers.get.ts",
          "app/utils/shippingPriceSheet.ts",
          "server/utils/shipping/carrierRateImport.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "fe1a084fad0a11016cbb3d0355ce69e4d7504eb0",
        "timestamp" : 1793349206000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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\u000a",
        "date" : "2026-10-30 09:33:26 +0100",
        "id" : "fe1a084fad0a11016cbb3d0355ce69e4d7504eb0",
        "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",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetOptions.vue"
          },
          {
            "editType" : "add",
            "file" : "reference/test-scripts/dpd-pricelist-parse.mts"
          },
          {
            "editType" : "add",
            "file" : "server/assets/shipping/dpd-pricelist-2026-04.json"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/price-sheet/index.vue"
          },
          {
            "editType" : "add",
            "file" : "reference/shippingprices/dpd/DPD-DE G300.pdf"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/shipping/carrierRates.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetPreviewModal.vue"
          },
          {
            "editType" : "add",
            "file" : "reference/shippingprices/dpd/MDB-Gesamt_V05 2026-04.pdf"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/shipping/priceSheet.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetMatrix.vue"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/fulfillment/carrier-rates.md"
          },
          {
            "editType" : "edit",
            "file" : "app/utils/shippingPriceSheet.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/shipping-carriers.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/shipping/carrierRateImport.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/settings/price-sheet/PriceSheetMatrix.vue",
          "server/utils/shipping/priceSheetPdf.ts",
          "app/pages/settings/price-sheet/index.vue",
          ".claude/rules/nuxt/ui-components.md",
          "app/components/settings/price-sheet/PriceSheetCellEditor.vue",
          "app/components/settings/price-sheet/PriceSheetPreviewModal.vue",
          "app/composables/useOfferSoftwareQuote.ts",
          "app/components/settings/price-sheet/PriceSheetOptions.vue",
          "server/api/offers/quote/preview.post.ts",
          "server/api/settings/price-sheet/resolve.post.ts",
          "server/utils/offers/onboardingPdf.ts",
          ".claude/rules/offers/software-quote.md",
          ".claude/rules/fulfillment/carrier-rates.md",
          "server/utils/offers/softwareQuotePdf.ts",
          "server/api/offers/quote/send.post.ts",
          "app/utils/shippingPriceSheet.ts",
          "app/components/offers/SoftwareQuoteModal.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "e3f2b4de3992d637c6f6bfc61677ee676594a448",
        "timestamp" : 1793351404000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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\u000a",
        "date" : "2026-10-30 10:10:04 +0100",
        "id" : "e3f2b4de3992d637c6f6bfc61677ee676594a448",
        "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",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/utils/offers/softwareQuotePdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/price-sheet/index.vue"
          },
          {
            "editType" : "add",
            "file" : "server/utils/offers/onboardingPdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/utils/shippingPriceSheet.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetPreviewModal.vue"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/offers/software-quote.md"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/shipping/priceSheetPdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/offers/quote/preview.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "server/api/offers/quote/send.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/offers/SoftwareQuoteModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/settings/price-sheet/resolve.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetCellEditor.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/useOfferSoftwareQuote.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetOptions.vue"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/fulfillment/carrier-rates.md"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetMatrix.vue"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/nuxt/ui-components.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/partners/PartnerDetailRecord.vue",
          "app/components/partners/PartnerDetailRecordLocation.vue",
          "app/components/partners/PartnerForm.vue",
          "app/pages/partners/partners/[id]/edit.vue",
          ".claude/rules/nuxt/ui-components.md",
          "app/components/partners/PartnerDetailRecordUser.vue",
          ".claude/rules/partners/partner-edit-form.md"
        ],
        "commitId" : "d65908d08308892d51a84856036b01a6723952ed",
        "timestamp" : 1793359030000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Partner edit page on Nuxt UI: three-column layout (form | contact cards | KPI panel), grouped toolbar, segmented tabs, compact collapsible sections\u000a\u000a- 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\u000a- 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\u000a- 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\u000a- 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)\u000a- 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\u000a- Recipes: nuxt/ui-components.md (USelect/UTabs/UCard/UFormField gaps), partners/partner-edit-form.md (new form structure + edit page layout)\u000a",
        "date" : "2026-10-30 12:17:10 +0100",
        "id" : "d65908d08308892d51a84856036b01a6723952ed",
        "msg" : "Partner edit page on Nuxt UI: three-column layout (form | contact cards | KPI panel), grouped toolbar, segmented tabs, compact collapsible sections",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/partners/PartnerForm.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/partners/PartnerDetailRecordUser.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/partners/partners/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/partners/PartnerDetailRecordLocation.vue"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/partners/partner-edit-form.md"
          },
          {
            "editType" : "edit",
            "file" : "app/components/partners/PartnerDetailRecord.vue"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/nuxt/ui-components.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "reference/ci/deploy-production.sh"
        ],
        "commitId" : "87bd740025e1476eec9e8228f7162712ea3602d9",
        "timestamp" : 1793360043000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Production deploy: no more SQLite writes into the replaced live dir (lost contract-signing row 2026-10-29)\u000a\u000a- 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\u000a- `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)\u000a- SQLite backups through the better-sqlite3 online backup API (includes WAL frames); plain cp as fallback\u000a",
        "date" : "2026-10-30 12:34:03 +0100",
        "id" : "87bd740025e1476eec9e8228f7162712ea3602d9",
        "msg" : "Production deploy: no more SQLite writes into the replaced live dir (lost contract-signing row 2026-10-29)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "reference/ci/deploy-production.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/settings/price-sheet/PriceSheetMatrix.vue",
          "server/utils/shipping/priceSheetPdf.ts",
          "reference/test-scripts/price-sheet-pdf-smoke.mts",
          "app/pages/settings/price-sheet/index.vue",
          "nuxt.config.ts",
          ".claude/rules/fulfillment/carrier-rates.md",
          "app/components/settings/price-sheet/PriceSheetOptions.vue",
          "app/utils/shippingPriceSheet.ts",
          "server/utils/shipping/carrierLogos.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "03731494971458295d341c3c7a52962a210e58d7",
        "timestamp" : 1793360043000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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\u000a\u000a- shippingPriceSheet.ts: CARRIER_LOGO_PATHS / carrierLogoPath() as the single logo map, groupRowsByCarrier() for merged sheets\u000a- 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\u000a- 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\u000a- 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\u000a- Smoke script mocks assets:shipper too\u000a",
        "date" : "2026-10-30 12:34:03 +0100",
        "id" : "03731494971458295d341c3c7a52962a210e58d7",
        "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",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/settings/price-sheet/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/shipping/priceSheetPdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/utils/shippingPriceSheet.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/shipping/carrierLogos.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetMatrix.vue"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/fulfillment/carrier-rates.md"
          },
          {
            "editType" : "edit",
            "file" : "reference/test-scripts/price-sheet-pdf-smoke.mts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetOptions.vue"
          },
          {
            "editType" : "edit",
            "file" : "nuxt.config.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/TopMegaBar.vue"
        ],
        "commitId" : "e6ed749cb9aa1676b35a8f6793b67f1f9134e48c",
        "timestamp" : 1793360306000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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\u000a",
        "date" : "2026-10-30 12:38:26 +0100",
        "id" : "e6ed749cb9aa1676b35a8f6793b67f1f9134e48c",
        "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",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/TopMegaBar.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/orders/stock-lines.post.ts",
          "app/components/partners/PartnerOrderLineTable.vue"
        ],
        "commitId" : "0d10b13fbabdb1809889fe218b5ac275914a22d6",
        "timestamp" : 1793360608000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order lines: \"Alle Artikel mit Bestand\" — one position per article of the order's organization that has stock, qty = QtyOnHand\u000a\u000a- 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\u000a- 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)\u000a",
        "date" : "2026-10-30 12:43:28 +0100",
        "id" : "0d10b13fbabdb1809889fe218b5ac275914a22d6",
        "msg" : "Order lines: \"Alle Artikel mit Bestand\" — one position per article of the order's organization that has stock, qty = QtyOnHand",
        "paths" : [
          {
            "editType" : "add",
            "file" : "server/api/orders/stock-lines.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/partners/PartnerOrderLineTable.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/sales/OrderForm.vue",
          "app/pages/sales/orders/add.vue",
          "app/router.options.ts",
          "app/pages/sales/orders/create.vue"
        ],
        "commitId" : "40aafbad732e3ef3fef33b6737db0c5ab3fac06b",
        "timestamp" : 1793361535000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Create sales order page (/create/sales-order) rebuilt with the quick-order modal's design and features, order form on Nuxt UI\u000a\u000a- 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\u000a- The duplicate create.vue (old /windows/sales-orders-create page) is removed; the window route now loads add.vue too\u000a- 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\u000a",
        "date" : "2026-10-30 12:58:55 +0100",
        "id" : "40aafbad732e3ef3fef33b6737db0c5ab3fac06b",
        "msg" : "Create sales order page (/create/sales-order) rebuilt with the quick-order modal's design and features, order form on Nuxt UI",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/sales/OrderForm.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/router.options.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/sales/orders/add.vue"
          },
          {
            "editType" : "delete",
            "file" : "app/pages/sales/orders/create.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/settings/price-sheet/PriceSheetMatrix.vue",
          "server/utils/shipping/priceSheetPdf.ts",
          "app/components/settings/price-sheet/PriceSheetOptions.vue",
          "app/pages/settings/price-sheet/index.vue",
          "app/utils/shippingPriceSheet.ts",
          ".claude/rules/fulfillment/carrier-rates.md"
        ],
        "commitId" : "a43f136338a7b5f2149ceabf14a2caf953c3f06f",
        "timestamp" : 1793361683000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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\u000a\u000a- 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\u000a- Matrix: a carrier group following another one gets a padded top border; surcharge label column 25 % narrower (142 px) with wrapping labels\u000a- PDF: logo only on the carrier heading row (service rows plain), white spacer row between carrier groups, surcharge label column 142 pt\u000a",
        "date" : "2026-10-30 13:01:23 +0100",
        "id" : "a43f136338a7b5f2149ceabf14a2caf953c3f06f",
        "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",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/settings/price-sheet/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/shipping/priceSheetPdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/utils/shippingPriceSheet.ts"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/fulfillment/carrier-rates.md"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetMatrix.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/price-sheet/PriceSheetOptions.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/sales/orders/[id]/edit.vue"
        ],
        "commitId" : "be9d899a98a72a689c5a23adff03fa5fce3b6dea",
        "timestamp" : 1793361728000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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\u000a",
        "date" : "2026-10-30 13:02:08 +0100",
        "id" : "be9d899a98a72a689c5a23adff03fa5fce3b6dea",
        "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",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/sales/orders/[id]/edit.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/sales/OrderForm.vue",
          "app/utils/randomEmail.ts",
          "app/components/partners/PartnerQuickForm.vue"
        ],
        "commitId" : "178f9bf899be01a5c52db86cf4cf429b4402d99f",
        "timestamp" : 1793362713000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order creation (modal + page): placeholder e-mail generator next to the e-mail field\u000a\u000a- utils/randomEmail.ts: randomLogyouEmail() → kunde-<10 random base36>@logyou.de (crypto random)\u000a- 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)\u000a",
        "date" : "2026-10-30 13:18:33 +0100",
        "id" : "178f9bf899be01a5c52db86cf4cf429b4402d99f",
        "msg" : "Order creation (modal + page): placeholder e-mail generator next to the e-mail field",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/sales/OrderForm.vue"
          },
          {
            "editType" : "add",
            "file" : "app/utils/randomEmail.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/partners/PartnerQuickForm.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/partners/partners/quick-add.post.ts"
        ],
        "commitId" : "9c1920c94bbf70ba21c11caa4cd92c54367c80e6",
        "timestamp" : 1793362890000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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)\u000a",
        "date" : "2026-10-30 13:21:30 +0100",
        "id" : "9c1920c94bbf70ba21c11caa4cd92c54367c80e6",
        "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)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/partners/partners/quick-add.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "reference/jasper-reports/shipment/M_InOut_Address.jrxml",
          ".claude/rules/fulfillment/commissioning.md",
          "reference/jasper-reports/shipment/M_InOut_Lines.jrxml",
          "app/components/settings/CommissionTableForm.vue",
          "app/pages/settings/commission-tables/[id]/edit.vue",
          ".claude/rules/printing/jasper-shipment-report.md",
          "reference/jasper-reports/styles.jrtx",
          "reference/jasper-reports/shipment-a5/M_InOut_Address_A5.jrxml",
          "reference/jasper-reports/README.md",
          "reference/jasper-reports/shipment/M_InOut_Document.jrxml",
          "reference/jasper-reports/shipment-a5/M_InOut_Document_A5.jrxml",
          "reference/jasper-reports/compile.groovy",
          "reference/jasper-reports/shipment/M_InOut_OrgInfoblock.jrxml",
          "reference/jasper-reports/shipment/Letterhead_Footer.jrxml",
          "server/api/settings/commission-tables/update.put.ts",
          "reference/jasper-reports/shipment-a5/M_InOut_Lines_A5.jrxml",
          "reference/README.md"
        ],
        "commitId" : "8cac0a6a0a3ec6c69dd96c99db1da6170afe5cc8",
        "timestamp" : 1793365645000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Commission table edit page on Nuxt UI + printer pickers; shipment Jasper slip: pickup vs. delivery + signature box\u000a\u000aCommission tables (Settings → Commission Tables):\u000a- CommissionTableForm rebuilt with Nuxt UI (UCard sections, UFormField with icon labels + UTooltip info\u000a  icons, UInput/UTextarea/USelect/USwitch, UFieldGroup actions); edit page gets the partner-page toolbar\u000a  (save group, preview, clone, manage printers, back) and a hero header; create/duplicate keep the in-form actions\u000a- Shipping (label) printer and A4 printer are now pickers over Settings → Printers (/api/printers): label\u000a  printers for shipping_printer, paper printers for a4_printer, each item with CUPS queue + location; the\u000a  stored value stays the CUPS queue name, so the commissioning page pickers / getA4Printer keep working\u000a- A queue saved on a table but missing in Settings → Printers is flagged and can be created in place\u000a  (shared org *); the five queues referenced by Tisch 1–3 (labelprinter-4/-5, commission-a4-1/2/3) were\u000a  created on prod as CUST_Printer rows\u000a- Cameras: USelect over the Synology list (loaded on open) + ID fallback input\u000a- Side card \"Geräte am Tisch\": table illustration (SVG) with numbered device badges 1 label printer,\u000a  2 A4 printer, 3 camera, 4 camera 2 matching the numbered fields, hover sync, legend with current values;\u000a  Organisation & Status card with org picker, tenant, Active switch\u000a- Org \"*\" (id 0) was dropped as falsy on load and on update; tenant falls back to AD_Client identifier\u000a\u000aShipment Jasper report (iDempiere host, templates archived under reference/jasper-reports):\u000a- DeliveryViaRule = 'P' (Abholung) replaces \"Versand via <carrier>\" + logo with \"Abholung / Selbstabholung\",\u000a  relabels Lieferdatum → Abholdatum and prints a \"WARE ERHALTEN (ABHOLUNG)\" signature box (Datum /\u000a  Unterschrift) right of the barcode — A4 (M_InOut_Document + M_InOut_OrgInfoblock) and A5 slip\u000a- Deployed + compiled on 192.168.12.72 (Groovy compile one-liner, backups shipment*.bak-20261030);\u000a  recipes: printing/jasper-shipment-report.md, commissioning.md printer note\u000a",
        "date" : "2026-10-30 14:07:25 +0100",
        "id" : "8cac0a6a0a3ec6c69dd96c99db1da6170afe5cc8",
        "msg" : "Commission table edit page on Nuxt UI + printer pickers; shipment Jasper slip: pickup vs. delivery + signature box",
        "paths" : [
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/shipment/M_InOut_Address.jrxml"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/shipment/M_InOut_OrgInfoblock.jrxml"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/README.md"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/shipment-a5/M_InOut_Lines_A5.jrxml"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/compile.groovy"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/CommissionTableForm.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/commission-tables/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : ".claude/rules/fulfillment/commissioning.md"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/shipment/M_InOut_Lines.jrxml"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/styles.jrtx"
          },
          {
            "editType" : "add",
            "file" : ".claude/rules/printing/jasper-shipment-report.md"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/shipment-a5/M_InOut_Document_A5.jrxml"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/shipment/Letterhead_Footer.jrxml"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/shipment/M_InOut_Document.jrxml"
          },
          {
            "editType" : "edit",
            "file" : "reference/README.md"
          },
          {
            "editType" : "edit",
            "file" : "server/api/settings/commission-tables/update.put.ts"
          },
          {
            "editType" : "add",
            "file" : "reference/jasper-reports/shipment-a5/M_InOut_Address_A5.jrxml"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/settings/commission-tables/[id]/edit.vue",
          "app/components/settings/CommissionTableForm.vue"
        ],
        "commitId" : "d627fa5e4095ea494e9ff03bf2b75b2ec68bcb8f",
        "timestamp" : 1793366036000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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\u000a",
        "date" : "2026-10-30 14:13:56 +0100",
        "id" : "d627fa5e4095ea494e9ff03bf2b75b2ec68bcb8f",
        "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",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/settings/CommissionTableForm.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/commission-tables/[id]/edit.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/utils/offers/softwareQuotePdf.ts",
          "app/composables/useOfferSoftwareQuote.ts",
          ".claude/rules/offers/software-quote.md",
          "app/components/offers/SoftwareQuoteModal.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "252623b881525125812f6596c0af871d1d9b475c",
        "timestamp" : 1793367734000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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)\u000a",
        "date" : "2026-10-30 14:42:14 +0100",
        "id" : "252623b881525125812f6596c0af871d1d9b475c",
        "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)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : ".claude/rules/offers/software-quote.md"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/offers/softwareQuotePdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/useOfferSoftwareQuote.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/components/offers/SoftwareQuoteModal.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/print/relabel-labels.post.ts",
          "app/plugins/03.notifications-stream.client.ts",
          "server/api/print/order-attachments.post.ts",
          "server/api/settings/print-agents/enroll-code/[code].delete.ts",
          "server/api/print-agent/backup.post.ts",
          "server/api/print/[id]/product.post.ts",
          "server/api/print-agent/backup.get.ts",
          "server/api/print/labelprint.post.ts",
          "server/api/print/index.get.ts",
          "server/api/print-agent/jobs/ack.post.ts",
          "server/api/settings/print-agents/jobs/index.get.ts",
          "server/api/settings/print-agents/index.get.ts",
          "app/plugins/05.print-jobs.client.ts",
          "app/components/settings/PrinterForm.vue",
          "server/api/print-agent/jobs/next.get.ts",
          "server/api/print/index.post.ts",
          "server/api/print-agent/enroll.post.ts",
          "server/api/settings/print-agents/bindings/[printerId].put.ts",
          "server/api/print/attachment-labels.post.ts",
          "server/api/printers/cups-media.get.ts",
          "server/api/print/[id]/locator.post.ts",
          "server/utils/printAgentAuth.ts",
          "server/api/settings/print-agents/jobs/mine.get.ts",
          "app/pages/settings/printers/[id]/duplicate.vue",
          "server/api/print-agent/jobs/[id]/file.get.ts",
          "server/api/print-agent/commands/[id]/result.post.ts",
          "app/pages/settings/printers/index.vue",
          "server/api/print/product.post.ts",
          "server/api/print/picklist.post.ts",
          "server/api/settings/print-agents/[id]/command.post.ts",
          "app/pages/settings/printers/[id]/edit.vue",
          "app/pages/settings/printers/create.vue",
          "server/api/settings/print-agents/status.get.ts",
          "server/api/print/attachment-smart.post.ts",
          "server/utils/printDispatch.ts",
          "server/utils/printSpoolDb.ts",
          "server/api/print/return-label.post.ts",
          "server/api/print-agent/heartbeat.post.ts",
          "server/api/mobile/reconditioning/print-report.post.ts",
          "server/api/settings/print-agents/[id].delete.ts",
          "server/utils/labelMedia.ts",
          "server/api/settings/print-agents/[id].put.ts",
          "server/api/print/inout-labels.post.ts",
          "server/plugins/print-spool-maintenance.ts",
          "server/api/settings/print-agents/enroll-code.post.ts",
          "server/api/settings/print-agents/[id]/commands.get.ts",
          "server/api/settings/print-agents/jobs/[id]/cancel.post.ts",
          "app/composables/usePrinterBinding.ts",
          "server/api/fulfillment/generate-fee-report.post.ts",
          "server/api/settings/print-agents/jobs/[id]/retry.post.ts",
          "app/components/settings/PrintAgentsCard.vue"
        ],
        "commitId" : "5c409d9126b9ab2e347f950c7422daa6b87d88ea",
        "timestamp" : 1793373298000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Printing: per-printer dispatch (local CUPS or LogShip Print Agent in the tenant LAN) — spool, agent protocol, settings UI\u000a\u000aThe 13 `lp` call sites (server/api/print/*, mobile reconditioning report) now go through\u000aserver/utils/printDispatch.ts: printFile()/printFiles() resolve the CUPS queue per printer —\u000ano binding → local `lp` as before (execFile, whitelisted options, no shell string any more);\u000abinding → job spooled for the tenant's Print Agent (status 'queued' + jobId, legacy\u000amessage/stdout fields kept). Storage root configurable (PRINT_STORAGE_DIR, default /root/storage);\u000athe dead GET /api/print smoke route is removed.\u000a\u000aInstance-local SQLite data/print-spool.db (server/utils/printSpoolDb.ts): agents (token hash,\u000aheartbeat inventory/health), enrolment codes, printer→agent bindings keyed by CUST_Printer_ID\u000a(no iDempiere column), jobs (queued→sent→spooled→completed|failed, batch id) and commands.\u000aAgent protocol under /api/print-agent (enroll, heartbeat, long-poll jobs/next with inline files\u000a≤ 300 KB, jobs/:id/file, jobs/ack, commands/:id/result, cups backup) — Bearer agent token.\u000aAdmin routes under /api/settings/print-agents (agents, enrol codes, bindings, jobs, commands,\u000astatus). Maintenance plugin re-queues stale 'sent' jobs and purges finished rows after 24 h.\u000a\u000aSettings → Printers: Print-Agents card (online state, version, device queues with PPD label\u000asize, queue depth, job stats, update/lpstat/restart-cups/journal/support-tunnel commands,\u000adiscovered queues → \"Anlegen\", job list with retry/cancel); printer form gets the per-printer\u000aagent + device-queue picker; create/edit/duplicate save the binding after the iDempiere write.\u000alabelMedia/cups-media read agent-reported label sizes for bound queues. Print-job feedback:\u000aplugins/05.print-jobs.client.ts shows one toast per single job and one progress toast per\u000abatch (SSE relay from the notifications plugin + cross-worker poll of jobs/mine).\u000a",
        "date" : "2026-10-30 16:14:58 +0100",
        "id" : "5c409d9126b9ab2e347f950c7422daa6b87d88ea",
        "msg" : "Printing: per-printer dispatch (local CUPS or LogShip Print Agent in the tenant LAN) — spool, agent protocol, settings UI",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/create.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/jobs/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/inout-labels.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/relabel-labels.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/print-agent/jobs/next.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/PrinterForm.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/[id].put.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/labelMedia.ts"
          },
          {
            "editType" : "add",
            "file" : "server/plugins/print-spool-maintenance.ts"
          },
          {
            "editType" : "add",
            "file" : "app/composables/usePrinterBinding.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/status.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/labelprint.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/enroll-code.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/fulfillment/generate-fee-report.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/attachment-labels.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/print-agent/backup.get.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/jobs/[id]/retry.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/printDispatch.ts"
          },
          {
            "editType" : "delete",
            "file" : "server/api/print/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/[id]/duplicate.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/print-agent/commands/[id]/result.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/[id].delete.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/mobile/reconditioning/print-report.post.ts"
          },
          {
            "editType" : "add",
            "file" : "app/components/settings/PrintAgentsCard.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/[id]/command.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/index.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/print-agent/heartbeat.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/index.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/attachment-smart.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/print-agent/backup.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/printSpoolDb.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/jobs/[id]/cancel.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/return-label.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/printAgentAuth.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/bindings/[printerId].put.ts"
          },
          {
            "editType" : "add",
            "file" : "app/plugins/05.print-jobs.client.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/[id]/commands.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/plugins/03.notifications-stream.client.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/print-agent/jobs/ack.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/order-attachments.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/jobs/mine.get.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/enroll-code/[code].delete.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/[id]/product.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/print-agent/enroll.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/print-agents/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/picklist.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/[id]/locator.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/product.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/printers/cups-media.get.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/print-agent/jobs/[id]/file.get.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".claude/rules/printing/print-agent.md",
          "app/components/settings/PrintAgentsCard.vue",
          "server/utils/printSpoolDb.ts"
        ],
        "commitId" : "defe0d60fe947f5da3b406eda1d06adef4eba43e",
        "timestamp" : 1793374751000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "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\u000a",
        "date" : "2026-10-30 16:39:11 +0100",
        "id" : "defe0d60fe947f5da3b406eda1d06adef4eba43e",
        "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",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/settings/PrintAgentsCard.vue"
          },
          {
            "editType" : "add",
            "file" : ".claude/rules/printing/print-agent.md"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/printSpoolDb.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/print-agent/jobs/next.get.ts",
          "server/utils/printSpoolDb.ts"
        ],
        "commitId" : "e8b6411756532146e174ac448b4b67c71ae4511b",
        "timestamp" : 1793376318000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Print-Agent: fresh-start poll re-queues the agent's claimed jobs at once (no 3-min wait after an agent restart)\u000a",
        "date" : "2026-10-30 17:05:18 +0100",
        "id" : "e8b6411756532146e174ac448b4b67c71ae4511b",
        "msg" : "Print-Agent: fresh-start poll re-queues the agent's claimed jobs at once (no 3-min wait after an agent restart)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/utils/printSpoolDb.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print-agent/jobs/next.get.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/print-agent/jobs/next.get.ts",
          "server/plugins/print-spool-maintenance.ts",
          "server/utils/printSpoolDb.ts"
        ],
        "commitId" : "8d0302a82681f4f1e8aa9238b31994d338bfd07d",
        "timestamp" : 1793377267000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Print-Agent: fresh-start reconcile list of unconfirmed spooled jobs; maintenance closes spooled jobs without completion report after 30 min\u000a",
        "date" : "2026-10-30 17:21:07 +0100",
        "id" : "8d0302a82681f4f1e8aa9238b31994d338bfd07d",
        "msg" : "Print-Agent: fresh-start reconcile list of unconfirmed spooled jobs; maintenance closes spooled jobs without completion report after 30 min",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/plugins/print-spool-maintenance.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print-agent/jobs/next.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/printSpoolDb.ts"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.younex.de/user/info",
      "fullName" : "info"
    }
  ]
}