{
  "_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" : 733,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "b0144617e997073012c0381e848fff6798b301d7",
            "branch" : [
              {
                "SHA1" : "b0144617e997073012c0381e848fff6798b301d7",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          },
          "revision" : {
            "SHA1" : "b0144617e997073012c0381e848fff6798b301d7",
            "branch" : [
              {
                "SHA1" : "b0144617e997073012c0381e848fff6798b301d7",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "b0144617e997073012c0381e848fff6798b301d7",
        "branch" : [
          {
            "SHA1" : "b0144617e997073012c0381e848fff6798b301d7",
            "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" : "#733",
  "duration" : 74361,
  "estimatedDuration" : 71602,
  "executor" : None,
  "fullDisplayName" : "build-logship-frontend #733",
  "id" : "733",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 733,
  "queueId" : 5679,
  "result" : "SUCCESS",
  "timestamp" : 1789084800272,
  "url" : "https://jenkins.younex.de/job/build-logship-frontend/733/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/offers/contract/send.post.ts",
          "app/components/offers/QuoteModal.vue",
          "server/utils/offers/quoteConfirmation.ts",
          "app/pages/confirm/[token].vue",
          "app/composables/useOfferQuote.ts",
          "app/composables/useOfferContract.ts",
          "server/api/offers/quote/send.post.ts",
          "app/pages/sign/[token].vue",
          "app/assets/langs/shared.js",
          "server/utils/offers/contractSigning.ts"
        ],
        "commitId" : "a7aa7ae42b222bbcc0ef3667b6bf58dc4e2892f3",
        "timestamp" : 1789024134000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Offer/contract e-mails: button is 'Angebot öffnen' / 'Dokumente öffnen' (view only, non-binding) — accepting or signing is described as a separate, optional step on the page; default message texts, info boxes and modal label reworded accordingly\u000a",
        "date" : "2026-09-10 09:08:54 +0200",
        "id" : "a7aa7ae42b222bbcc0ef3667b6bf58dc4e2892f3",
        "msg" : "Offer/contract e-mails: button is 'Angebot öffnen' / 'Dokumente öffnen' (view only, non-binding) — accepting or signing is described as a separate, optional step on the page; default message texts, info boxes and modal label reworded accordingly",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/confirm/[token].vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/offers/QuoteModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/useOfferContract.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/sign/[token].vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/useOfferQuote.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/offers/quoteConfirmation.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/offers/quote/send.post.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/api/mobile/transcribe-text.post.ts",
          "app/pages/mobile/movement.vue"
        ],
        "commitId" : "fc1d48ab4d2e46c5f22309169e84c1c8a839300d",
        "timestamp" : 1789026457000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile movement: opt-in billable ticket after completion — post-completion screen with selectable moved articles/qty, time or direct amount ([Zeitabrechnung]), typed or voice-transcribed note (new sync /api/mobile/transcribe-text), ticket for the partner linked to the source locator's org, audio attached to the ticket\u000a",
        "date" : "2026-09-10 09:47:37 +0200",
        "id" : "fc1d48ab4d2e46c5f22309169e84c1c8a839300d",
        "msg" : "Mobile movement: opt-in billable ticket after completion — post-completion screen with selectable moved articles/qty, time or direct amount ([Zeitabrechnung]), typed or voice-transcribed note (new sync /api/mobile/transcribe-text), ticket for the partner linked to the source locator's org, audio attached to the ticket",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/movement.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/mobile/transcribe-text.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle",
          "scripts/release-app.sh",
          "scripts/upload-mobile-update.sh",
          "scripts/stage-mobile-update.sh"
        ],
        "commitId" : "1d1b2d4e81e0dda86dad7771d4f6e9b54d1a265d",
        "timestamp" : 1789026991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile app release channel moved into the logyou.de website repo: new scripts/stage-mobile-update.sh copies APK + version.json into ../logship/logyou-landing/public/logship (archives the replaced APK into history/, merges history.json, keeps last 10); release-app.sh hands off to it (MOBILE_PUBLISH=sftp keeps the SFTP uploader for Blut24, --push also deploys the site); release app 1.0.40 (code 41)\u000a",
        "date" : "2026-09-10 09:56:31 +0200",
        "id" : "1d1b2d4e81e0dda86dad7771d4f6e9b54d1a265d",
        "msg" : "Mobile app release channel moved into the logyou.de website repo: new scripts/stage-mobile-update.sh copies APK + version.json into ../logship/logyou-landing/public/logship (archives the replaced APK into history/, merges history.json, keeps last 10); release-app.sh hands off to it (MOBILE_PUBLISH=sftp keeps the SFTP uploader for Blut24, --push also deploys the site); release app 1.0.40 (code 41)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "scripts/release-app.sh"
          },
          {
            "editType" : "add",
            "file" : "scripts/stage-mobile-update.sh"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          },
          {
            "editType" : "edit",
            "file" : "scripts/upload-mobile-update.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/settings/mobile-app/index.vue",
          "scripts/release-app.sh",
          "app/composables/menu/admin/settings.ts",
          "scripts/stage-mobile-update.sh",
          "reference/ci/deploy-production.sh",
          ".gitignore",
          "server/api/mobile/app-versions.get.ts",
          ".env",
          "server/api/mobile/app-download-link.get.ts",
          "server/api/settings/mobile-app/publish.post.ts",
          "server/api/mobile/app-version.get.ts",
          "scripts/upload-mobile-update.sh",
          ".env-dev",
          "nuxt.config.ts",
          "server/utils/mobileReleases.ts",
          "server/api/public/mobile/[token]/[...path].ts",
          "scripts/publish-mobile-update.sh",
          ".env-prod",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "2ccbd5088aaa0422989f669a9d2e67bf1827d8d7",
        "timestamp" : 1789028835000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile app release channel inside the ERP: APK + manifests live server-side in data/mobile-releases (never in the bundle or git), served via expiring HMAC-signed public download URLs (/api/public/mobile/<token>/…, Range support); app-version/app-versions read the local channel for authenticated checks and keep proxying www.logyou.de/logship for old builds (MOBILE_APP_LEGACY_FALLBACK); new Settings → Mobile App page with QR install code, download link and admin upload form; publish endpoint (admin verified via ad_role or service token) + scripts/publish-mobile-update.sh; release-app.sh publishes to erp,landing; deploy script preserves data/mobile-releases\u000a",
        "date" : "2026-09-10 10:27:15 +0200",
        "id" : "2ccbd5088aaa0422989f669a9d2e67bf1827d8d7",
        "msg" : "Mobile app release channel inside the ERP: APK + manifests live server-side in data/mobile-releases (never in the bundle or git), served via expiring HMAC-signed public download URLs (/api/public/mobile/<token>/…, Range support); app-version/app-versions read the local channel for authenticated checks and keep proxying www.logyou.de/logship for old builds (MOBILE_APP_LEGACY_FALLBACK); new Settings → Mobile App page with QR install code, download link and admin upload form; publish endpoint (admin verified via ad_role or service token) + scripts/publish-mobile-update.sh; release-app.sh publishes to erp,landing; deploy script preserves data/mobile-releases",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "nuxt.config.ts"
          },
          {
            "editType" : "edit",
            "file" : "scripts/release-app.sh"
          },
          {
            "editType" : "add",
            "file" : "app/pages/settings/mobile-app/index.vue"
          },
          {
            "editType" : "edit",
            "file" : ".env"
          },
          {
            "editType" : "add",
            "file" : "scripts/publish-mobile-update.sh"
          },
          {
            "editType" : "edit",
            "file" : "server/api/mobile/app-versions.get.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/settings/mobile-app/publish.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/menu/admin/settings.ts"
          },
          {
            "editType" : "edit",
            "file" : ".env-prod"
          },
          {
            "editType" : "edit",
            "file" : "scripts/stage-mobile-update.sh"
          },
          {
            "editType" : "add",
            "file" : "server/api/mobile/app-download-link.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : ".env-dev"
          },
          {
            "editType" : "edit",
            "file" : "server/api/mobile/app-version.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "reference/ci/deploy-production.sh"
          },
          {
            "editType" : "edit",
            "file" : ".gitignore"
          },
          {
            "editType" : "add",
            "file" : "server/api/public/mobile/[token]/[...path].ts"
          },
          {
            "editType" : "edit",
            "file" : "scripts/upload-mobile-update.sh"
          },
          {
            "editType" : "add",
            "file" : "server/utils/mobileReleases.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/materials/products/search.get.ts",
          "app/pages/mobile/inventory.vue",
          "app/pages/mobile/receive.vue",
          "reference/~$roadsurfer_Fulfillment_Anfrage_Preisblatt_LogYou.xlsx",
          "app/pages/mobile/print-labels.vue",
          "app/pages/mobile/fix-locator-owner.vue",
          "reference/roadsurfer_Fulfillment_Anfrage_Preisblatt (3).xlsx",
          "app/pages/mobile/product.vue",
          "server/api/mobile/product-search.post.ts",
          "reference/roadsurfer_Fulfillment_Anfrage_Preisblatt_LogYou.xlsx",
          "app/pages/mobile/return.vue",
          "app/pages/mobile/movement.vue"
        ],
        "commitId" : "6ec8b08642bd83c7778bedbbc43d14bd77423300",
        "timestamp" : 1789030903000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "show bom on mobile search\u000a",
        "date" : "2026-09-10 11:01:43 +0200",
        "id" : "6ec8b08642bd83c7778bedbbc43d14bd77423300",
        "msg" : "show bom on mobile search",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/search.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/product.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/print-labels.vue"
          },
          {
            "editType" : "add",
            "file" : "reference/roadsurfer_Fulfillment_Anfrage_Preisblatt_LogYou.xlsx"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/movement.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/return.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/fix-locator-owner.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/inventory.vue"
          },
          {
            "editType" : "add",
            "file" : "reference/~$roadsurfer_Fulfillment_Anfrage_Preisblatt_LogYou.xlsx"
          },
          {
            "editType" : "edit",
            "file" : "server/api/mobile/product-search.post.ts"
          },
          {
            "editType" : "add",
            "file" : "reference/roadsurfer_Fulfillment_Anfrage_Preisblatt (3).xlsx"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/receive.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/app/build.gradle",
          "android/update-files/version.json"
        ],
        "commitId" : "7dfb2c9d7a1f68be35d33c900a9558fbb28e0b31",
        "timestamp" : 1789031079000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "release app 1.0.41 (code 42): movement ticket + BOM in mobile search\u000a",
        "date" : "2026-09-10 11:04:39 +0200",
        "id" : "7dfb2c9d7a1f68be35d33c900a9558fbb28e0b31",
        "msg" : "release app 1.0.41 (code 42): movement ticket + BOM in mobile search",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          },
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/release-app.sh"
        ],
        "commitId" : "80eb9f223b2040bdd659ad95c627f20ddd818207",
        "timestamp" : 1789031406000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "release-app.sh: interactive release — asks for versionName (Enter = auto bump), release notes, publish target (default: ERP channel only; landing/sftp optional, website push asked separately) and a final confirmation with summary; --yes runs non-interactively with the defaults\u000a",
        "date" : "2026-09-10 11:10:06 +0200",
        "id" : "80eb9f223b2040bdd659ad95c627f20ddd818207",
        "msg" : "release-app.sh: interactive release — asks for versionName (Enter = auto bump), release notes, publish target (default: ERP channel only; landing/sftp optional, website push asked separately) and a final confirmation with summary; --yes runs non-interactively with the defaults",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "scripts/release-app.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/mobile/ProductThumb.vue",
          "server/api/materials/products/search.get.ts",
          "app/pages/mobile/inventory.vue",
          "app/pages/mobile/receive.vue",
          "server/api/mobile/product-thumb/[id].get.ts",
          "app/pages/mobile/fix-locator-owner.vue",
          "app/pages/mobile/print-labels.vue",
          "server/api/mobile/product-search.post.ts",
          "app/pages/mobile/product.vue",
          "app/pages/mobile/return.vue",
          "app/pages/mobile/movement.vue"
        ],
        "commitId" : "a9d04682477bb7e454899e41ffba3b62510f6ce7",
        "timestamp" : 1789032523000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile article search: BOM / JTL-BOM tags on results, \"Stücklisten (BOM) ausblenden\" filter checkbox (default off, on all 7 pages incl. receive), article names clamped to 3 lines, viewport-lazy product thumbnails (MobileProductThumb + GET /api/mobile/product-thumb/{id}, per-product client + 10-min server cache) — search endpoints return isBOM/isJtlBom/imageUrl\u000a",
        "date" : "2026-09-10 11:28:43 +0200",
        "id" : "a9d04682477bb7e454899e41ffba3b62510f6ce7",
        "msg" : "Mobile article search: BOM / JTL-BOM tags on results, \"Stücklisten (BOM) ausblenden\" filter checkbox (default off, on all 7 pages incl. receive), article names clamped to 3 lines, viewport-lazy product thumbnails (MobileProductThumb + GET /api/mobile/product-thumb/{id}, per-product client + 10-min server cache) — search endpoints return isBOM/isJtlBom/imageUrl",
        "paths" : [
          {
            "editType" : "add",
            "file" : "app/components/mobile/ProductThumb.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/mobile/product-thumb/[id].get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/fix-locator-owner.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/movement.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/print-labels.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/mobile/product-search.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/receive.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/search.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/inventory.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/return.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/product.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/app/build.gradle",
          "app/plugins/00.capacitor-api.client.ts",
          "android/update-files/version.json",
          "app/composables/useAppUpdate.ts"
        ],
        "commitId" : "de1f81e0ec815245ce32ccd881ddcfb7784b93ea",
        "timestamp" : 1789034450000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile app update check now authenticated: useAppUpdate uses relative /api/mobile/app-version(s) so the Capacitor fetch wrapper injects the Bearer token (absolute URLs bypassed it and only ever saw the legacy www.logyou.de manifest); the raw-fetch wrapper also handles absolute apiBase/api URLs; release app 1.0.44 (code 45)\u000a",
        "date" : "2026-09-10 12:00:50 +0200",
        "id" : "de1f81e0ec815245ce32ccd881ddcfb7784b93ea",
        "msg" : "Mobile app update check now authenticated: useAppUpdate uses relative /api/mobile/app-version(s) so the Capacitor fetch wrapper injects the Bearer token (absolute URLs bypassed it and only ever saw the legacy www.logyou.de manifest); the raw-fetch wrapper also handles absolute apiBase/api URLs; release app 1.0.44 (code 45)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/composables/useAppUpdate.ts"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          },
          {
            "editType" : "edit",
            "file" : "app/plugins/00.capacitor-api.client.ts"
          },
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle"
        ],
        "commitId" : "9579d52a373e994fba20c9069e0c34d64f5d48df",
        "timestamp" : 1789034519000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "release app 1.0.45 (code 46): authenticated update check\u000a",
        "date" : "2026-09-10 12:01:59 +0200",
        "id" : "9579d52a373e994fba20c9069e0c34d64f5d48df",
        "msg" : "release app 1.0.45 (code 46): authenticated update check",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".claude/settings.json",
          ".gitignore"
        ],
        "commitId" : "2d2b2fb44183b2f0fc103fe7b58bb02ef2bf0fae",
        "timestamp" : 1789034920000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Track .claude/settings.json so cloud sessions default to bypass permissions\u000a",
        "date" : "2026-09-10 12:08:40 +0200",
        "id" : "2d2b2fb44183b2f0fc103fe7b58bb02ef2bf0fae",
        "msg" : "Track .claude/settings.json so cloud sessions default to bypass permissions",
        "paths" : [
          {
            "editType" : "add",
            "file" : ".claude/settings.json"
          },
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/materials/ProductDetailRecordLocatedAt.vue"
        ],
        "commitId" : "811b119c435d102b227b8ba1f4cd92edda76c8a1",
        "timestamp" : 1789044442000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product Located-at tab: quantity pills aligned with their column headers, Active column removed, Date Material Policy shown as dd.mm.yyyy\u000a",
        "date" : "2026-09-10 14:47:22 +0200",
        "id" : "811b119c435d102b227b8ba1f4cd92edda76c8a1",
        "msg" : "Product Located-at tab: quantity pills aligned with their column headers, Active column removed, Date Material Policy shown as dd.mm.yyyy",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/materials/ProductDetailRecordLocatedAt.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/materials/ProductForm.vue"
        ],
        "commitId" : "6c46f67746d277eea733bd682852131879b9ee28",
        "timestamp" : 1789044442000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product form: hide Summary Level checkbox (commented out, not needed for now; isSummary stays in the model)\u000a",
        "date" : "2026-09-10 14:47:22 +0200",
        "id" : "6c46f67746d277eea733bd682852131879b9ee28",
        "msg" : "Product form: hide Summary Level checkbox (commented out, not needed for now; isSummary stays in the model)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/materials/ProductForm.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/composables/useTransactionReportPdf.ts",
          "server/api/materials/products/search.get.ts",
          "app/pages/materials/transactions.vue"
        ],
        "commitId" : "8ffa636208f0c71cfa4ff4d8c47b2bc8649ba9fc",
        "timestamp" : 1789044442000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Transactions page: product search on the Nuxt UI SelectBox wrapper (tedir-select dropped) with rich results (thumbnail, article no., SKU/MPN/category, BOM + org + inactive tags), selected-product card with product link, ?productId= deep link that preloads the product and its history; PDF report extracted into useTransactionReportPdf; product search returns org/category/active\u000a",
        "date" : "2026-09-10 14:47:22 +0200",
        "id" : "8ffa636208f0c71cfa4ff4d8c47b2bc8649ba9fc",
        "msg" : "Transactions page: product search on the Nuxt UI SelectBox wrapper (tedir-select dropped) with rich results (thumbnail, article no., SKU/MPN/category, BOM + org + inactive tags), selected-product card with product link, ?productId= deep link that preloads the product and its history; PDF report extracted into useTransactionReportPdf; product search returns org/category/active",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/search.get.ts"
          },
          {
            "editType" : "add",
            "file" : "app/composables/useTransactionReportPdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/materials/transactions.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/materials/products/[id]/transaction/index.get.ts",
          "app/components/materials/ProductDetailRecordTransaction.vue"
        ],
        "commitId" : "937074b2db7cebfe41e77f58b283eb186d9fe1da",
        "timestamp" : 1789044442000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Product Transactions tab: order + shipment links (server resolves M_InOutLine → M_InOut → C_Order with a batched lookup; sales vs purchase routes), dates as dd.mm.yyyy with muted booking time, coloured movement-type icons and signed quantity pills, Active column removed, Report button (PDF preview modal + download) and link to the prefilled transactions page\u000a",
        "date" : "2026-09-10 14:47:22 +0200",
        "id" : "937074b2db7cebfe41e77f58b283eb186d9fe1da",
        "msg" : "Product Transactions tab: order + shipment links (server resolves M_InOutLine → M_InOut → C_Order with a batched lookup; sales vs purchase routes), dates as dd.mm.yyyy with muted booking time, coloured movement-type icons and signed quantity pills, Active column removed, Report button (PDF preview modal + download) and link to the prefilled transactions page",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/materials/ProductDetailRecordTransaction.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/[id]/transaction/index.get.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/utils/fetchHelper.ts",
          "server/utils/refreshTokenHelper.ts",
          "server/middleware/fetch.ts"
        ],
        "commitId" : "11ac029738ce4ae6caf08464d24d7972fb8c9352",
        "timestamp" : 1789048717000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "iDempiere fetch layer: no ofetch auto-retry, 90 s timeout, and no token-refresh retry after backend errors\u000a\u000afetchHelper and event.context.fetch now send retry: 0 (ofetch retried every GET once on 500/502/503/504) plus a timeout (IDEMPIERE_FETCH_TIMEOUT_MS, default 90 s) and record the last iDempiere error on event.context. refreshTokenHelper throws instead of refreshing when that error is not 401/403, so the standard catch → refresh → retry route pattern no longer re-runs a query that just timed out on a stalled backend (2026-09-10 retry storm: 6 → 79 calls/min of one heavy query, 178 of 200 Jetty threads blocked).\u000a",
        "date" : "2026-09-10 15:58:37 +0200",
        "id" : "11ac029738ce4ae6caf08464d24d7972fb8c9352",
        "msg" : "iDempiere fetch layer: no ofetch auto-retry, 90 s timeout, and no token-refresh retry after backend errors",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/utils/refreshTokenHelper.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/middleware/fetch.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/fetchHelper.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/utils/productStorageHelper.ts",
          "server/api/materials/products/qty-on-hand-overview.get.ts",
          "server/api/materials/products/qty-on-hand-pit.get.ts",
          "server/api/materials/products/index.get.ts",
          "server/api/materials/locators/priority-recommendations.get.ts",
          "server/api/materials/products/ag-grid/products.post.ts",
          "server/api/materials/products/qty-on-hand-by-locator.get.ts"
        ],
        "commitId" : "df9ce51c1905ff2e546a2f03d259fc6d6ae689d0",
        "timestamp" : 1789048717000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Products with stock: drop $expand=M_Storage (global-lock hazard in idempiere-rest) for a paged m_storage join\u000a\u000aNew server/utils/productStorageHelper.ts fetches products plainly and joins m_storage rows in Node (by-id chunks for a page, all rows with a 30 s single-flight cache for full lists), keeping the M_Storage array shape. A detail expand runs DefaultQueryConverter.convertStatement (synchronized singleton) once per parent record — 3.3k products = ~6.6k serialized queries under one lock that every other $filter request waits on. Switched: materials/products (also gains ?top=&skip= and a 60 s per client/role/org response cache with single-flight), ag-grid products, qty-on-hand overview/by-locator/pit, locator priority recommendations.\u000a",
        "date" : "2026-09-10 15:58:37 +0200",
        "id" : "df9ce51c1905ff2e546a2f03d259fc6d6ae689d0",
        "msg" : "Products with stock: drop $expand=M_Storage (global-lock hazard in idempiere-rest) for a paged m_storage join",
        "paths" : [
          {
            "editType" : "add",
            "file" : "server/utils/productStorageHelper.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/ag-grid/products.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/qty-on-hand-pit.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/qty-on-hand-overview.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/materials/locators/priority-recommendations.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/materials/products/qty-on-hand-by-locator.get.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/utils/synologyHelper.ts"
        ],
        "commitId" : "029c404ada50027cefc2e31638d4ca37741234f4",
        "timestamp" : 1789048717000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Synology helper: timeouts on every NAS call, shared session, re-login on session errors\u000a\u000aEvery Surveillance Station request carries an AbortSignal timeout (15 s API, 5 min download) so a hung NAS cannot pin a request. One login is reused for 30 min across requests instead of login+logout per call; error codes 105/106/107/119 trigger exactly one re-login + retry with the session updated in place. synologyLogout is a no-op unless force=true, so the route handlers are unchanged.\u000a",
        "date" : "2026-09-10 15:58:37 +0200",
        "id" : "029c404ada50027cefc2e31638d4ca37741234f4",
        "msg" : "Synology helper: timeouts on every NAS call, shared session, re-login on session errors",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/utils/synologyHelper.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "reference/recipes.md"
        ],
        "commitId" : "8c172c0be5713df8d7222328e4d66d38cf2b47a8",
        "timestamp" : 1789048717000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Recipes: iDempiere REST load rules (no child $expand over big lists, no blind retries, $top everywhere) and the Synology session/timeout conventions\u000a",
        "date" : "2026-09-10 15:58:37 +0200",
        "id" : "8c172c0be5713df8d7222328e4d66d38cf2b47a8",
        "msg" : "Recipes: iDempiere REST load rules (no child $expand over big lists, no blind retries, $top everywhere) and the Synology session/timeout conventions",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "reference/recipes.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/mobile/reconditioning.vue",
          "server/utils/returnLocatorHelper.ts",
          "server/api/mobile/reconditioning/lookup.post.ts",
          "app/pages/mobile/index.vue",
          "server/api/mobile/reconditioning/target-locators.post.ts",
          "server/api/materials/stock-transfers/store.post.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "06b01d4c15174f621d93d5f66812bee129e41177",
        "timestamp" : 1789051910000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile Reconditioning page (/mobile/reconditioning): scan return label (RMA no. / customer-return doc no. / product code) → customer return with lines on non-shippable locators only, select articles + qty (capped by on-hand and already-reconditioned qty), target locator with org default preselected, books an M_Movement linked via M_Movement.M_Customer_Return_ID (fail-soft if column missing), then optional billable 'Reconditioning' ticket (time/amount, articles as message, no note/voice); endpoints /api/mobile/reconditioning/{lookup,target-locators}; dashboard tile + en/de/es/ne translations\u000a",
        "date" : "2026-09-10 16:51:50 +0200",
        "id" : "06b01d4c15174f621d93d5f66812bee129e41177",
        "msg" : "Mobile Reconditioning page (/mobile/reconditioning): scan return label (RMA no. / customer-return doc no. / product code) → customer return with lines on non-shippable locators only, select articles + qty (capped by on-hand and already-reconditioned qty), target locator with org default preselected, books an M_Movement linked via M_Movement.M_Customer_Return_ID (fail-soft if column missing), then optional billable 'Reconditioning' ticket (time/amount, articles as message, no note/voice); endpoints /api/mobile/reconditioning/{lookup,target-locators}; dashboard tile + en/de/es/ne translations",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/materials/stock-transfers/store.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "add",
            "file" : "app/pages/mobile/reconditioning.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/mobile/reconditioning/lookup.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/mobile/reconditioning/target-locators.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/returnLocatorHelper.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/index.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/app/build.gradle",
          "android/update-files/version.json"
        ],
        "commitId" : "59962537dce5a8b573a7c0895f02e00770863f7c",
        "timestamp" : 1789052001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "release app 1.0.46 (code 47): mobile Reconditioning page\u000a",
        "date" : "2026-09-10 16:53:21 +0200",
        "id" : "59962537dce5a8b573a7c0895f02e00770863f7c",
        "msg" : "release app 1.0.46 (code 47): mobile Reconditioning page",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          },
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/bi/product-performance.get.ts",
          "app/composables/menu/admin/bi.ts",
          "app/pages/bi/product-performance.vue",
          "app/components/MainNavigationMenu.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "63146b1cd06c93d864c5f8c03573b917757d37ba",
        "timestamp" : 1789052728000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "BI Product Performance (/bi/product-performance, admins only): per-merchant product sales analytics — rolling window (3d…12m) with previous-period deltas or 12/6/24-month matrix (heat cells, sparklines, 3M-vs-3M trend); sold/returned/return-rate/net revenue/on-hand/coverage per product; scope = top N sellers or manual pick list (persisted per org, pin from table); KPI cards, daily and monthly charts, category share, worst return rates, CSV export; direct-Postgres route server/api/bi/product-performance.get.ts; sidebar + top-menu entries, en/de/es translations\u000a",
        "date" : "2026-09-10 17:05:28 +0200",
        "id" : "63146b1cd06c93d864c5f8c03573b917757d37ba",
        "msg" : "BI Product Performance (/bi/product-performance, admins only): per-merchant product sales analytics — rolling window (3d…12m) with previous-period deltas or 12/6/24-month matrix (heat cells, sparklines, 3M-vs-3M trend); sold/returned/return-rate/net revenue/on-hand/coverage per product; scope = top N sellers or manual pick list (persisted per org, pin from table); KPI cards, daily and monthly charts, category share, worst return rates, CSV export; direct-Postgres route server/api/bi/product-performance.get.ts; sidebar + top-menu entries, en/de/es translations",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/MainNavigationMenu.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/bi/product-performance.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/menu/admin/bi.ts"
          },
          {
            "editType" : "add",
            "file" : "app/pages/bi/product-performance.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/bi/product-performance.vue"
        ],
        "commitId" : "77517cfa18d11aab027e793d79f92f3ab9cf573f",
        "timestamp" : 1789053260000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "BI Product Performance: hide charts/table until a report is loaded (no stale chart data when switching org or with an empty manual selection), subtle row action buttons\u000a",
        "date" : "2026-09-10 17:14:20 +0200",
        "id" : "77517cfa18d11aab027e793d79f92f3ab9cf573f",
        "msg" : "BI Product Performance: hide charts/table until a report is loaded (no stale chart data when switching org or with an empty manual selection), subtle row action buttons",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/bi/product-performance.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/mobile/reconditioning.vue",
          "server/api/mobile/reconditioning/lookup.post.ts",
          "app/pages/mobile/return.vue",
          "app/pages/integrations/returns-desktop.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "6fd692b75c4074aaff411735e54a2ca8301c8de9",
        "timestamp" : 1789060461000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile Reconditioning: lookup by RMA number only (no return-doc-no / product-code fallback), return label barcode now encodes the RMA number (was product SKU, so scanning never hit the RMA path), keep-alive focus lifecycle for the hidden scanner input, en/de/es hint texts\u000a",
        "date" : "2026-09-10 19:14:21 +0200",
        "id" : "6fd692b75c4074aaff411735e54a2ca8301c8de9",
        "msg" : "Mobile Reconditioning: lookup by RMA number only (no return-doc-no / product-code fallback), return label barcode now encodes the RMA number (was product SKU, so scanning never hit the RMA path), keep-alive focus lifecycle for the hidden scanner input, en/de/es hint texts",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/mobile/reconditioning/lookup.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/reconditioning.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/return.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/integrations/returns-desktop.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/mobile/reconditioning/print-report.post.ts",
          "app/pages/mobile/reconditioning.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "5b77679c090a7efc6f52a11c276005f81798ebcf",
        "timestamp" : 1789060807000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile Reconditioning: A4 movement report (Umlagerungsbericht) printed after booking — server-rendered pdfmake sheet grouped by target locator (article, qty, from → to, checkboxes, disposed lines, signature line) sent via lp to the remembered paper printer (CUST_Printer 'pap', default-on toggle + printer select persisted per device); per-line 'Entsorgen' option books non-reconditionable articles OUT via physical inventory (MMIPI, qtyCount = on-hand − disposed, description documents the disposal) instead of moving them, target locator only required when something is moved; ticket + report cover both; en/de/es keys\u000a",
        "date" : "2026-09-10 19:20:07 +0200",
        "id" : "5b77679c090a7efc6f52a11c276005f81798ebcf",
        "msg" : "Mobile Reconditioning: A4 movement report (Umlagerungsbericht) printed after booking — server-rendered pdfmake sheet grouped by target locator (article, qty, from → to, checkboxes, disposed lines, signature line) sent via lp to the remembered paper printer (CUST_Printer 'pap', default-on toggle + printer select persisted per device); per-line 'Entsorgen' option books non-reconditionable articles OUT via physical inventory (MMIPI, qtyCount = on-hand − disposed, description documents the disposal) instead of moving them, target locator only required when something is moved; ticket + report cover both; en/de/es keys",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "add",
            "file" : "server/api/mobile/reconditioning/print-report.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/reconditioning.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/app/build.gradle",
          "android/update-files/version.json"
        ],
        "commitId" : "affedcf372684fb431685c61bb299efef3542419",
        "timestamp" : 1789060902000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "release app 1.0.47 (code 48): Reconditioning RMA-only scan, A4 movement report, disposal option\u000a",
        "date" : "2026-09-10 19:21:42 +0200",
        "id" : "affedcf372684fb431685c61bb299efef3542419",
        "msg" : "release app 1.0.47 (code 48): Reconditioning RMA-only scan, A4 movement report, disposal option",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          },
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/mobile/return.vue",
          "app/pages/integrations/returns-desktop.vue",
          "server/api/print/return-label.post.ts"
        ],
        "commitId" : "3720a71faf263fcf49588812d303e43e52fd2baa",
        "timestamp" : 1789062247000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Return label rebuilt: ONE label per return (was one per article and qty) rendered server-side by POST /api/print/return-label at the printer's real label size (registry → CUPS → legacy fallback, same as product labels) with size-driven layouts (tiny 35×17 / compact 54×29 / standard 74×52, 56×75, 102×152 with continuation pages), vector CODE128 of the RMA or customer-return document number, ad_org.companyname header band, partner · reason · locator line and an article table with quantities; mobile return page + desktop returns page now call the route instead of building jsPDF labels client-side\u000a",
        "date" : "2026-09-10 19:44:07 +0200",
        "id" : "3720a71faf263fcf49588812d303e43e52fd2baa",
        "msg" : "Return label rebuilt: ONE label per return (was one per article and qty) rendered server-side by POST /api/print/return-label at the printer's real label size (registry → CUPS → legacy fallback, same as product labels) with size-driven layouts (tiny 35×17 / compact 54×29 / standard 74×52, 56×75, 102×152 with continuation pages), vector CODE128 of the RMA or customer-return document number, ad_org.companyname header band, partner · reason · locator line and an article table with quantities; mobile return page + desktop returns page now call the route instead of building jsPDF labels client-side",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/integrations/returns-desktop.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/print/return-label.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/return.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle"
        ],
        "commitId" : "a7077f906fa454a31e9d28a5415ce57f617140ed",
        "timestamp" : 1789062317000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "release app 1.0.48 (code 49): new return label (one per return, server-rendered)\u000a",
        "date" : "2026-09-10 19:45:17 +0200",
        "id" : "a7077f906fa454a31e9d28a5415ce57f617140ed",
        "msg" : "release app 1.0.48 (code 49): new return label (one per return, server-rendered)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/settings/OrderSourceForm.vue",
          "app/pages/settings/order-sources/[id]/edit.vue",
          "app/pages/settings/order-sources/create.vue",
          "server/api/settings/order-sources/update.put.ts",
          "server/api/settings/order-sources/store.post.ts",
          "app/pages/settings/order-sources/[id]/view.vue"
        ],
        "commitId" : "b0144617e997073012c0381e848fff6798b301d7",
        "timestamp" : 1789065370000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order sources: Amazon returns import flag (isImportReturns) + lookback days (importReturnsDaysFilter) wired through create/edit/view + store/update routes — toggle in the Marketplace-Specific tab's Amazon SP-API block gates the middleware's daily MFN returns → RMA import\u000a",
        "date" : "2026-09-10 20:36:10 +0200",
        "id" : "b0144617e997073012c0381e848fff6798b301d7",
        "msg" : "Order sources: Amazon returns import flag (isImportReturns) + lookback days (importReturnsDaysFilter) wired through create/edit/view + store/update routes — toggle in the Marketplace-Specific tab's Amazon SP-API block gates the middleware's daily MFN returns → RMA import",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/settings/order-sources/create.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/settings/order-sources/store.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/order-sources/[id]/view.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/settings/order-sources/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/settings/OrderSourceForm.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/settings/order-sources/update.put.ts"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.younex.de/user/info",
      "fullName" : "info"
    }
  ]
}