{
  "_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" : 731,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "25e57e1d2a58ceb6994e6c82bab7533d42935788",
            "branch" : [
              {
                "SHA1" : "25e57e1d2a58ceb6994e6c82bab7533d42935788",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          },
          "revision" : {
            "SHA1" : "25e57e1d2a58ceb6994e6c82bab7533d42935788",
            "branch" : [
              {
                "SHA1" : "25e57e1d2a58ceb6994e6c82bab7533d42935788",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "25e57e1d2a58ceb6994e6c82bab7533d42935788",
        "branch" : [
          {
            "SHA1" : "25e57e1d2a58ceb6994e6c82bab7533d42935788",
            "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" : "#731",
  "duration" : 64695,
  "estimatedDuration" : 71602,
  "executor" : None,
  "fullDisplayName" : "build-logship-frontend #731",
  "id" : "731",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 731,
  "queueId" : 5661,
  "result" : "SUCCESS",
  "timestamp" : 1788912000272,
  "url" : "https://jenkins.younex.de/job/build-logship-frontend/731/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/public/sign/[token]/index.post.ts",
          "server/api/public/sign/[token]/document/[key].get.ts",
          "server/api/offers/contract/signing-status.get.ts",
          "server/api/public/sign/[token]/index.get.ts",
          "server/utils/offers/contractSigningDb.ts"
        ],
        "commitId" : "6867a990ad10e973d0fcb49b44dd4c5166806fcd",
        "timestamp" : 1788846822000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Signing store: kind column (contract | quote), kind-aware supersede and status history\u000a\u000asigning_requests gets a kind column (migrated in place, default contract) so\u000aquote confirmations share the table, the on-disk document store and the\u000alifecycle with contract signing. Superseding is per kind, signing-status\u000areturns latest / latestQuote / full history of both kinds with daysLeft and\u000aportal document urls, and the /sign routes only accept contract tokens.\u000a",
        "date" : "2026-09-08 07:53:42 +0200",
        "id" : "6867a990ad10e973d0fcb49b44dd4c5166806fcd",
        "msg" : "Signing store: kind column (contract | quote), kind-aware supersede and status history",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/public/sign/[token]/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/public/sign/[token]/document/[key].get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/offers/contract/signing-status.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/public/sign/[token]/index.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/offers/contractSigningDb.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/utils/offers/contactActivity.ts",
          "server/api/offers/contract/send.post.ts",
          "server/utils/offers/contractSigning.ts"
        ],
        "commitId" : "a8c47ec14aacc1ac6e45a92468871c6d9b093212",
        "timestamp" : 1788846822000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Activities: log contract sent and contract signed on the record\u000a\u000aNew contactActivity helper writes C_ContactActivity rows (type E-Mail) for\u000acustomer-facing steps, with the documents referenced in a parseable\u000a[Dokumente] block in Comments (title | url). Contract send logs the package,\u000arecipient and signing link; finalizeSignature logs the signature with the\u000asigned contract and annexes. Fail-soft everywhere.\u000a",
        "date" : "2026-09-08 07:53:42 +0200",
        "id" : "a8c47ec14aacc1ac6e45a92468871c6d9b093212",
        "msg" : "Activities: log contract sent and contract signed on the record",
        "paths" : [
          {
            "editType" : "add",
            "file" : "server/utils/offers/contactActivity.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/offers/contract/send.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/offers/contractSigning.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/utils/offers/quoteConfirmation.ts",
          "app/components/offers/QuoteModal.vue",
          "app/pages/confirm/[token].vue",
          "server/api/public/confirm/[token]/index.post.ts",
          "app/composables/useOfferQuote.ts",
          "server/api/public/confirm/[token]/request-renewal.post.ts",
          "server/api/offers/quote/send.post.ts",
          "server/api/public/confirm/[token]/index.get.ts",
          "server/utils/offers/offerConditions.ts",
          "server/api/public/confirm/[token]/document/[key].get.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "7c8cbf87e7b8d409534fb242a15ad8a95d7ceecf",
        "timestamp" : 1788846822000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Quotes: online confirmation button in the e-mail + public /confirm/<token> page\u000a\u000aOpt-out checkbox in the quote modal (default on). The send creates a kind\u000a'quote' signing request valid as long as the quote, stores the exact PDF and\u000aadds a CTA to the mail; the e-mail default text mentions the button. The\u000apublic page shows the quote, collects company/name/e-mail + declarations and\u000aconfirms: the offer PDF gets an appended confirmation page (pdf-lib), is\u000aattached to the record, written to offer_conditions.quote.confirmation,\u000amailed to the customer and info@logyou.de, and logged as an activity with\u000adocument buttons. Quote send itself is logged as an activity too.\u000a",
        "date" : "2026-09-08 07:53:42 +0200",
        "id" : "7c8cbf87e7b8d409534fb242a15ad8a95d7ceecf",
        "msg" : "Quotes: online confirmation button in the e-mail + public /confirm/<token> page",
        "paths" : [
          {
            "editType" : "add",
            "file" : "server/api/public/confirm/[token]/index.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/offers/offerConditions.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/public/confirm/[token]/document/[key].get.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/offers/quoteConfirmation.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/offers/QuoteModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/offers/quote/send.post.ts"
          },
          {
            "editType" : "add",
            "file" : "app/pages/confirm/[token].vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/useOfferQuote.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/public/confirm/[token]/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "add",
            "file" : "server/api/public/confirm/[token]/request-renewal.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/users/leads/[id]/edit.vue",
          "app/components/offers/SigningLinksPanel.vue",
          "app/components/admin/LeadForm.vue",
          "app/components/admin/LeadDetailRecordActivity.vue",
          "app/components/admin/LeadDetailRecord.vue"
        ],
        "commitId" : "26daf290da8c94ae87d75e2f78f15a33ad8adb34",
        "timestamp" : 1788846822000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Lead page: hero header, side panels for links + attachments, activity timeline\u000a\u000aRestyled /edit/lead-<id>: hero with initials/status/source chips and quick\u000aactions, two-column layout, form sections without Avatar/Tenant, a signing\u000alinks panel listing every contract/quote link with status, remaining validity\u000aand clickable url, an attachments panel, and the activities as a timeline.\u000aThe activity modal has a single note field (Comments, description derived\u000afrom the first line); the timeline shows Comments or the legacy Description\u000aand renders [Dokumente] references as buttons.\u000a",
        "date" : "2026-09-08 07:53:42 +0200",
        "id" : "26daf290da8c94ae87d75e2f78f15a33ad8adb34",
        "msg" : "Lead page: hero header, side panels for links + attachments, activity timeline",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/users/leads/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/admin/LeadForm.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/admin/LeadDetailRecordActivity.vue"
          },
          {
            "editType" : "add",
            "file" : "app/components/offers/SigningLinksPanel.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/admin/LeadDetailRecord.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/sign/[token].vue"
        ],
        "commitId" : "3bcec9625e1768733d5e7136392ece9112854a14",
        "timestamp" : 1788846822000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Sign page: on phones only the PDF pans, the page never scrolls horizontally\u000a",
        "date" : "2026-09-08 07:53:42 +0200",
        "id" : "3bcec9625e1768733d5e7136392ece9112854a14",
        "msg" : "Sign page: on phones only the PDF pans, the page never scrolls horizontally",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/sign/[token].vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/accounting/banking/BankReconcilePanel.vue"
        ],
        "commitId" : "5e677922cb07d6e92ce254ce5aa134c953f82679",
        "timestamp" : 1788847457000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Banking: combinable line filters (status, with suggestion, credit/debit), one Match button per row\u000a\u000aThe Status segment stays single-select (All / Open / Matched); two new\u000achip groups combine with it: 'Mit Vorschlag' (only lines that have a match\u000asuggestion — disabled and cleared while Matched is active, suggestions only\u000aexist for open lines) and an exclusive credit (+) / debit (−) toggle. Chip\u000acounts respect the other active filters; a reset button clears everything.\u000aThe three per-row buttons collapse into one 'Zuordnen' — the modal carries\u000athe invoice / fee / payment tabs and opens on the tab the best suggestion\u000apoints to.\u000a",
        "date" : "2026-09-08 08:04:17 +0200",
        "id" : "5e677922cb07d6e92ce254ce5aa134c953f82679",
        "msg" : "Banking: combinable line filters (status, with suggestion, credit/debit), one Match button per row",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/accounting/banking/BankReconcilePanel.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/accounting/BankLineMatchModal.vue",
          "server/api/invoices/[id]/pdf.get.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "2d529629dd7087711b7fd0272e86a1fb0333d052",
        "timestamp" : 1788847457000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Banking: restyled match modal with invoice thumbnails and inline PDF preview\u000a\u000aThe 'Position zuordnen' modal now uses the banking design system (bk-*):\u000abank-line ticket, segmented tabs, candidate cards with a first-page\u000athumbnail, confidence + signal pills and an eye button that opens the\u000ainvoice PDF in a preview pane inside the modal (the modal widens, the\u000aselection stays). New GET /api/invoices/[id]/pdf streams the invoice as\u000abinary application/pdf (short private cache) for thumbnail + iframe.\u000aModal strings are translatable (banking_modal_*).\u000a",
        "date" : "2026-09-08 08:04:17 +0200",
        "id" : "2d529629dd7087711b7fd0272e86a1fb0333d052",
        "msg" : "Banking: restyled match modal with invoice thumbnails and inline PDF preview",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/accounting/BankLineMatchModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "add",
            "file" : "server/api/invoices/[id]/pdf.get.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/accounting/amazon/order-sources.get.ts",
          "app/pages/accounting/amazon-settlements.vue",
          "app/pages/accounting/ebay-settlements.vue",
          "server/api/accounting/ebay/order-sources.get.ts"
        ],
        "commitId" : "6d6c5a9505a8622125674e8b4c501793d5c96ba8",
        "timestamp" : 1788847924000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Settlements: range picker with presets, calendar and 'last N periods'; order source preset by org\u000a\u000aReplaces the two native date inputs on the Amazon/eBay settlement pages with\u000aone Zeitraum control: a popover with presets (last month, 3/6/12 months,\u000athis/last year), 'Letzte N Abrechnungen/Auszahlungen' (period-count mode —\u000alooks back far enough and keeps the newest N), a two-month range calendar\u000a(Nuxt UI UCalendar, grid pinned by marker CSS) and from/to inputs as typing\u000afallback. Same dateFrom/dateTo contract + range-change emit as before.\u000aThe order source is preselected with the first source owned by the org the\u000auser is logged in with (order-sources routes now return orgId/orgName).\u000a",
        "date" : "2026-09-08 08:12:04 +0200",
        "id" : "6d6c5a9505a8622125674e8b4c501793d5c96ba8",
        "msg" : "Settlements: range picker with presets, calendar and 'last N periods'; order source preset by org",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/accounting/amazon-settlements.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/amazon/order-sources.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/ebay/order-sources.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/accounting/ebay-settlements.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/utils/offers/quotePdf.ts",
          "server/utils/offers/pdfImages.ts",
          "app/pages/users/leads/[id]/edit.vue",
          "server/utils/offers/contractPdf.ts"
        ],
        "commitId" : "7d9f6b6a5f6c39a4c956cc3c7a69dc0698266977",
        "timestamp" : 1788848444000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Offer PDFs: normalise customer logo / screenshot / signature images to PNG or JPEG\u000a\u000apdfmake throws 'Unknown image format' for anything but PNG/JPEG. A lead\u000aavatar in WebP/GIF/SVG (uploaded as company logo) was labelled image/png by\u000athe lead page and killed the whole quote preview. New pdfImages.ts sniffs\u000athe real format, converts other formats with sharp and drops unusable data\u000ainstead of failing; applied to the quote logo + website screenshot and the\u000acontract signature image. The lead page now sniffs webp/gif/svg too.\u000a",
        "date" : "2026-09-08 08:20:44 +0200",
        "id" : "7d9f6b6a5f6c39a4c956cc3c7a69dc0698266977",
        "msg" : "Offer PDFs: normalise customer logo / screenshot / signature images to PNG or JPEG",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/utils/offers/quotePdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/offers/contractPdf.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/offers/pdfImages.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/users/leads/[id]/edit.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/offers/QuoteModal.vue",
          "app/components/offers/ContractModal.vue"
        ],
        "commitId" : "666a2f22c1bedff589d9903b4eba506068632234",
        "timestamp" : 1788848444000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Offer/contract modals: consistent, spaced checkbox rows\u000a\u000aEvery checkbox in the quote and contract modals gets the same row style:\u000agap between box and label, padding + hover surface, 18px box, brand accent,\u000aand the global transform scale on checkbox inputs is neutralised so the box\u000ano longer overlaps its label and neighbouring controls.\u000a",
        "date" : "2026-09-08 08:20:44 +0200",
        "id" : "666a2f22c1bedff589d9903b4eba506068632234",
        "msg" : "Offer/contract modals: consistent, spaced checkbox rows",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/offers/ContractModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/offers/QuoteModal.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/accounting/SettlementSourceFields.vue"
        ],
        "commitId" : "e163c30b60d98dd983bffd29c9b4a35ac30a984c",
        "timestamp" : 1788848478000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Settlements range picker: pin the calendar grid body to table layout\u000a",
        "date" : "2026-09-08 08:21:18 +0200",
        "id" : "e163c30b60d98dd983bffd29c9b4a35ac30a984c",
        "msg" : "Settlements range picker: pin the calendar grid body to table layout",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/accounting/SettlementSourceFields.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "reference/recipes.md"
        ],
        "commitId" : "e175e587f486e8aa322305a03243fe19bc47d7fd",
        "timestamp" : 1788848643000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Recipes: activities [Dokumente] convention, quote confirmation portal, PDF image normalisation, invoice PDF url, UCalendar pinning, checkbox scale override\u000a",
        "date" : "2026-09-08 08:24:03 +0200",
        "id" : "e175e587f486e8aa322305a03243fe19bc47d7fd",
        "msg" : "Recipes: activities [Dokumente] convention, quote confirmation portal, PDF image normalisation, invoice PDF url, UCalendar pinning, checkbox scale override",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "reference/recipes.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/materials/ProductDetailRecordLocatedAt.vue",
          "app/composables/states.ts"
        ],
        "commitId" : "ecadbf8fdba3adfaaf4606a7e1e3f260362ebc28",
        "timestamp" : 1788856346000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product 'Located at' tab: show only locators with any on-hand / ordered / reserved qty by default, toggle for all, qty columns; drop tedir imports\u000a",
        "date" : "2026-09-08 10:32:26 +0200",
        "id" : "ecadbf8fdba3adfaaf4606a7e1e3f260362ebc28",
        "msg" : "Product 'Located at' tab: show only locators with any on-hand / ordered / reserved qty by default, toggle for all, qty columns; drop tedir imports",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/materials/ProductDetailRecordLocatedAt.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/states.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/materials/ProductStockLocatorsCard.vue",
          "app/components/materials/ProductStockActionModal.vue",
          "app/pages/materials/products/[id]/edit.vue"
        ],
        "commitId" : "05ab84b63ee3aba0cfc569b4bb465352ed0ece3e",
        "timestamp" : 1788856346000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product edit: admin 'Bestand je Lagerplatz' card with per-locator tiles and in-page inventory count / goods receipt / movement modals that refresh quantities live\u000a",
        "date" : "2026-09-08 10:32:26 +0200",
        "id" : "05ab84b63ee3aba0cfc569b4bb465352ed0ece3e",
        "msg" : "Product edit: admin 'Bestand je Lagerplatz' card with per-locator tiles and in-page inventory count / goods receipt / movement modals that refresh quantities live",
        "paths" : [
          {
            "editType" : "add",
            "file" : "app/components/materials/ProductStockLocatorsCard.vue"
          },
          {
            "editType" : "add",
            "file" : "app/components/materials/ProductStockActionModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/materials/products/[id]/edit.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/integrations/receive-desktop.vue"
        ],
        "commitId" : "7871bf08102d33741ddd70b99897d88aac182729",
        "timestamp" : 1788856346000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Receive desktop: replace unstyled USelect/native selects with the SelectBox (Nuxt UI) wrapper, ignore stale org cookie entries\u000a",
        "date" : "2026-09-08 10:32:26 +0200",
        "id" : "7871bf08102d33741ddd70b99897d88aac182729",
        "msg" : "Receive desktop: replace unstyled USelect/native selects with the SelectBox (Nuxt UI) wrapper, ignore stale org cookie entries",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/integrations/receive-desktop.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/materials/ProductStockLocatorsCard.vue"
        ],
        "commitId" : "34cafbecb1954b33dde58fc2638abfa8015077d2",
        "timestamp" : 1788857650000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product stock card: 'Etiketten drucken' action opening print-labels-desktop with the article preloaded (productId + productValue hand-off, SKU/UPC fallback)\u000a",
        "date" : "2026-09-08 10:54:10 +0200",
        "id" : "34cafbecb1954b33dde58fc2638abfa8015077d2",
        "msg" : "Product stock card: 'Etiketten drucken' action opening print-labels-desktop with the article preloaded (productId + productValue hand-off, SKU/UPC fallback)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/materials/ProductStockLocatorsCard.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "reference/recipes.md"
        ],
        "commitId" : "f10c9649cb3920d39f04cd8b0114d98441064633",
        "timestamp" : 1788857650000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Recipes: product page stock actions card + modal (data source, cloned document chains, live refresh, page hand-off)\u000a",
        "date" : "2026-09-08 10:54:10 +0200",
        "id" : "f10c9649cb3920d39f04cd8b0114d98441064633",
        "msg" : "Recipes: product page stock actions card + modal (data source, cloned document chains, live refresh, page hand-off)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "reference/recipes.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/integrations/print-labels-desktop.vue"
        ],
        "commitId" : "5b97c2d515fcdfe9d8b51bd9b00570a1a9c0a11b",
        "timestamp" : 1788859286000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Print labels desktop: single full-width column — sticky action bar, scan + search side by side, selected articles as order-style positions (thumb, codes, org, per-row printer, qty); SelectBox for printer pickers\u000a",
        "date" : "2026-09-08 11:21:26 +0200",
        "id" : "5b97c2d515fcdfe9d8b51bd9b00570a1a9c0a11b",
        "msg" : "Print labels desktop: single full-width column — sticky action bar, scan + search side by side, selected articles as order-style positions (thumb, codes, org, per-row printer, qty); SelectBox for printer pickers",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/integrations/print-labels-desktop.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/materials/ProductStockLocatorsCard.vue",
          "app/pages/materials/products/[id]/edit.vue"
        ],
        "commitId" : "17d352cfcb1a5ce5660246960d7a983ec40662d6",
        "timestamp" : 1788859286000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product stock card: 'Etiketten drucken' opens the page's print-labels modal instead of a new tab\u000a",
        "date" : "2026-09-08 11:21:26 +0200",
        "id" : "17d352cfcb1a5ce5660246960d7a983ec40662d6",
        "msg" : "Product stock card: 'Etiketten drucken' opens the page's print-labels modal instead of a new tab",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/materials/products/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/materials/ProductStockLocatorsCard.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/offers/quote/send.post.ts",
          "app/components/offers/QuoteModal.vue",
          "server/utils/offers/offerConditions.ts",
          "app/assets/langs/shared.js",
          "app/composables/useOfferQuote.ts"
        ],
        "commitId" : "915e0f4f6e40350029d376104fc3d26e1dbe677b",
        "timestamp" : 1788859992000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Quote modal: optional PDF attachment when the online confirmation link is sent (default link-only; PDF always attached without link), link-only e-mail texts, persisted in offer conditions\u000a",
        "date" : "2026-09-08 11:33:12 +0200",
        "id" : "915e0f4f6e40350029d376104fc3d26e1dbe677b",
        "msg" : "Quote modal: optional PDF attachment when the online confirmation link is sent (default link-only; PDF always attached without link), link-only e-mail texts, persisted in offer conditions",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/offers/QuoteModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/offers/quote/send.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/offers/offerConditions.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/useOfferQuote.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/print/product.post.ts",
          "app/pages/integrations/print-labels-desktop.vue",
          "app/components/settings/PrinterForm.vue",
          "app/pages/settings/printers/[id]/edit.vue",
          "app/pages/settings/printers/create.vue",
          "server/api/printers/cups-media.get.ts",
          "app/pages/settings/printers/[id]/view.vue",
          "server/api/settings/printers/store.post.ts",
          "server/api/settings/printers/update.put.ts",
          "app/components/sales/RelabelLabelPrintModal.vue",
          "server/api/printers/index.get.ts",
          "server/utils/labelMedia.ts",
          "app/pages/settings/printers/[id]/duplicate.vue",
          "reference/recipes.md",
          "server/utils/cupsMedia.ts",
          "app/pages/settings/printers/index.vue",
          "server/utils/labelBarcode.ts"
        ],
        "commitId" : "d81db0b973c0bf582df7f457d2dfb7974b2615ca",
        "timestamp" : 1788864168000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product labels: size-exact pages per printer, vector CODE128, label size from printer registry with CUPS fallback\u000a\u000a- /api/print/product renders each printer group at the real label size (registry\u000a  LabelWidthMm/LabelHeightMm → CUPS queue PPD default → legacy format) instead of\u000a  A8 + fit-to-page, which used only 24 of 35 mm on labelprinter-2 and shrank the barcode\u000a- fix off-by-one that drew every label on the page created for the next one (first\u000a  label of a batch landed on a default-format page)\u000a- barcodes as vector bars from bwip-js geometry (crisp on the 203 dpi Zebra grid);\u000a  compact layout for labels < 40 mm high, adaptive table layout for larger rolls;\u000a  customSettings (Shopify stock page) keeps the legacy layouts\u000a- registry sizes are sent to lp as -o media=Custom.WxHmm; results carry the resolved media\u000a- Settings → Printers: label size (mm) with \"Aus CUPS übernehmen\" detect\u000a  (/api/printers/cups-media), LabelType reorder reference; wired through form, pages, grid,\u000a  store/update, /api/printers; relabel modal preselects the registry size\u000a- recipe: product labels — page size from registry/CUPS, vector CODE128\u000a",
        "date" : "2026-09-08 12:42:48 +0200",
        "id" : "d81db0b973c0bf582df7f457d2dfb7974b2615ca",
        "msg" : "Product labels: size-exact pages per printer, vector CODE128, label size from printer registry with CUPS fallback",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "reference/recipes.md"
          },
          {
            "editType" : "add",
            "file" : "server/utils/labelMedia.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/settings/printers/store.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/printers/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/settings/printers/update.put.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/[id]/duplicate.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/integrations/print-labels-desktop.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/PrinterForm.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/sales/RelabelLabelPrintModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/create.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/printers/[id]/view.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/print/product.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/printers/cups-media.get.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/labelBarcode.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/cupsMedia.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/print/product.post.ts"
        ],
        "commitId" : "fd32d8ff9d2823cb26fa373678f8f6e702029afe",
        "timestamp" : 1788865575000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product labels (compact): two name rows, barcode lower, org company name rotated along the right edge\u000a\u000a- 35×17 / 54×29 layout: product name wraps to two lines, SKU row, then barcode +\u000a  cleartext value; the 2-digit org code is gone\u000a- ad_org.companyname (fallback Name) printed as one 90°-rotated string on the right\u000a  edge, vertically centred, shrunk to 4 pt then ellipsised to the label height\u000a",
        "date" : "2026-09-08 13:06:15 +0200",
        "id" : "fd32d8ff9d2823cb26fa373678f8f6e702029afe",
        "msg" : "Product labels (compact): two name rows, barcode lower, org company name rotated along the right edge",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/print/product.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/print/product.post.ts"
        ],
        "commitId" : "7c416c6207cd20cb749989c9e7438084d2509284",
        "timestamp" : 1788867149000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product labels (compact): wider text/barcode area, company name at the right edge, barcode lower with a clear gap under the text rows\u000a",
        "date" : "2026-09-08 13:32:29 +0200",
        "id" : "7c416c6207cd20cb749989c9e7438084d2509284",
        "msg" : "Product labels (compact): wider text/barcode area, company name at the right edge, barcode lower with a clear gap under the text rows",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/print/product.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/composables/useOpenShipments.ts"
        ],
        "commitId" : "d57d085a7df0992fea2f94c53a03585617422d88",
        "timestamp" : 1788872894000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Commissioning open-shipments list: expand C_Order_ID and show only shipments of fulfillment orders (isFulfillmentOrder = Y), mirroring the dashboard open-to-commission rule; scan input unchanged\u000a",
        "date" : "2026-09-08 15:08:14 +0200",
        "id" : "d57d085a7df0992fea2f94c53a03585617422d88",
        "msg" : "Commissioning open-shipments list: expand C_Order_ID and show only shipments of fulfillment orders (isFulfillmentOrder = Y), mirroring the dashboard open-to-commission rule; scan input unchanged",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/composables/useOpenShipments.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/requests/RequestForm.vue"
        ],
        "commitId" : "9afa79b55166ae0a4de7ff3f6046ff5752dac38a",
        "timestamp" : 1788882961000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Request edit form: billing dialog gets a 'Betrag' mode next to 'Zeit' — book a direct (also negative) amount without time, same [Zeitabrechnung] envelope and QtySpent rules as the my-tickets detail\u000a",
        "date" : "2026-09-08 17:56:01 +0200",
        "id" : "9afa79b55166ae0a4de7ff3f6046ff5752dac38a",
        "msg" : "Request edit form: billing dialog gets a 'Betrag' mode next to 'Zeit' — book a direct (also negative) amount without time, same [Zeitabrechnung] envelope and QtySpent rules as the my-tickets detail",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/requests/RequestForm.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/requests/requests/create.vue",
          "app/pages/requests/my-tickets/index.vue",
          "app/pages/requests/my-tickets/create.vue"
        ],
        "commitId" : "a91a37f8b47890a451b7d1352939b52ff8bc5eb9",
        "timestamp" : 1788882961000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Ticket creation (Create Request + my-tickets wizard) opens the new ticket in the my-tickets split view (?ticket=<id>); split view refetches its list when a deep-linked ticket is not loaded yet\u000a",
        "date" : "2026-09-08 17:56:01 +0200",
        "id" : "a91a37f8b47890a451b7d1352939b52ff8bc5eb9",
        "msg" : "Ticket creation (Create Request + my-tickets wizard) opens the new ticket in the my-tickets split view (?ticket=<id>); split view refetches its list when a deep-linked ticket is not loaded yet",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/requests/requests/create.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/requests/my-tickets/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/requests/my-tickets/create.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/admin/users/leads/latest.get.ts",
          "app/pages/index.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "25e57e1d2a58ceb6994e6c82bab7533d42935788",
        "timestamp" : 1788882961000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Dashboard Latest Leads: offer and contract badges per lead — greyed when the online link was sent, coloured once the offer is accepted / the contract is signed\u000a",
        "date" : "2026-09-08 17:56:01 +0200",
        "id" : "25e57e1d2a58ceb6994e6c82bab7533d42935788",
        "msg" : "Dashboard Latest Leads: offer and contract badges per lead — greyed when the online link was sent, coloured once the offer is accepted / the contract is signed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "server/api/admin/users/leads/latest.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/index.vue"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.younex.de/user/info",
      "fullName" : "info"
    }
  ]
}