{
  "_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" : 739,
          "buildResult" : null,
          "marked" : {
            "SHA1" : "1e77ee19cf43852966794881cd3f1642880f624d",
            "branch" : [
              {
                "SHA1" : "1e77ee19cf43852966794881cd3f1642880f624d",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          },
          "revision" : {
            "SHA1" : "1e77ee19cf43852966794881cd3f1642880f624d",
            "branch" : [
              {
                "SHA1" : "1e77ee19cf43852966794881cd3f1642880f624d",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "1e77ee19cf43852966794881cd3f1642880f624d",
        "branch" : [
          {
            "SHA1" : "1e77ee19cf43852966794881cd3f1642880f624d",
            "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" : null,
  "displayName" : "#739",
  "duration" : 71887,
  "estimatedDuration" : 71602,
  "executor" : null,
  "fullDisplayName" : "build-logship-frontend #739",
  "id" : "739",
  "inProgress" : false,
  "keepLog" : false,
  "number" : 739,
  "queueId" : 5727,
  "result" : "SUCCESS",
  "timestamp" : 1789603200766,
  "url" : "https://jenkins.younex.de/view/all/job/build-logship-frontend/739/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/print/return-label.post.ts"
        ],
        "commitId" : "1901094c902d6779b7ae601e4ea8109aea054959",
        "timestamp" : 1789543405000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Return label: tighten header band, put doc number next to title\u000a\u000aShrinks the top black header-band height and moves the document number\u000aonto the same row as the RETOURE/KUNDENRÜCKSENDUNG title (top-aligned,\u000aright of it) instead of stacking them, freeing vertical space for more\u000aarticle rows before a continuation label is needed. Title is now bold\u000aand slightly larger; company/date text in the band keeps its prior size.\u000a\u000aCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\u000aClaude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E\u000a",
        "date" : "2026-09-16 09:23:25 +0200",
        "id" : "1901094c902d6779b7ae601e4ea8109aea054959",
        "msg" : "Return label: tighten header band, put doc number next to title",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/print/return-label.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/print/return-label.post.ts"
        ],
        "commitId" : "7944e52f1d3f243da24bcdbd08afc40629fccd44",
        "timestamp" : 1789545906000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Return label: shrink header band further, lift doc number 1mm\u000a\u000aContinues the earlier band/title tightening: band height reduced\u000aagain (10/7mm -> 9/6mm) and the document number nudged 1mm above the\u000atitle's baseline for a slightly better visual balance on the row.\u000a\u000aCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\u000aClaude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E\u000a",
        "date" : "2026-09-16 10:05:06 +0200",
        "id" : "7944e52f1d3f243da24bcdbd08afc40629fccd44",
        "msg" : "Return label: shrink header band further, lift doc number 1mm",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/print/return-label.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/mobile/return.vue"
        ],
        "commitId" : "0ded69844c268c0bbcfe1ac463f1f1fa7a7bb3e1",
        "timestamp" : 1789545914000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile return: fix qty locked at 0 when scanning an Amazon-imported RMA\u000a\u000aScanning a return parcel's external RMA number (M_RMA.externalRmaNumber)\u000afinds the matching pre-imported Amazon RMA and loads its linked shipment,\u000abut that RMA is already DocStatus=CO with the expected qty on its line —\u000agetReturnedQtyMap counted it as \"already returned\" against its own\u000ashipment, zeroing maxQty and locking the qty stepper at 0 for every line.\u000aConfirmed against a live prod record (RMA 1000688 / externalRmaNumber\u000a\"DydTw8rHRRMA\": CO, one M_RMALine Qty=1 on the exact line whose remaining\u000aqty then computed to 0).\u000a\u000aFix: exclude the matched RMA's own id from the already-returned tally —\u000ait's the incoming authorization being fulfilled right now, not a separate\u000aprior return. Searching by bpartner and selecting the shipment manually\u000awas unaffected since it doesn't go through this RMA-number match at all.\u000a\u000aCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\u000aClaude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E\u000a",
        "date" : "2026-09-16 10:05:14 +0200",
        "id" : "0ded69844c268c0bbcfe1ac463f1f1fa7a7bb3e1",
        "msg" : "Mobile return: fix qty locked at 0 when scanning an Amazon-imported RMA",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/return.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/sales/returns/[id]/view.vue",
          "app/components/AgGrid/Shipments/AgCustomLink.vue",
          "app/pages/sales/returns/index.vue"
        ],
        "commitId" : "130a2dfe89a8ab37acd85c775b105a96667f9bca",
        "timestamp" : 1789546745000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Customer Returns: link doc number to detail view, add label reprint button\u000a\u000aThe list grid's Doc Number column was plain text — no way to open a\u000areturn's detail view from it. Add AgCustomLink (mirrors the\u000aMaterialReceipt/Shippers pattern) linking to /sales/returns/[id]/view.\u000a\u000aOn that detail view, add a \"Etikett erneut drucken\" button that re-fetches\u000athe return's lines (GET /api/inouts/[id]/return-detail) and reprints the\u000areturn label via POST /api/print/return-label (kind: 'customer-return',\u000ausing the printer queue from useReturnLabelPrinter) — for when the label\u000adidn't come out at intake for any reason.\u000a\u000aCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\u000aClaude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E\u000a",
        "date" : "2026-09-16 10:19:05 +0200",
        "id" : "130a2dfe89a8ab37acd85c775b105a96667f9bca",
        "msg" : "Customer Returns: link doc number to detail view, add label reprint button",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/sales/returns/[id]/view.vue"
          },
          {
            "editType" : "add",
            "file" : "app/components/AgGrid/Shipments/AgCustomLink.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/sales/returns/index.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "nuxt.config.ts"
        ],
        "commitId" : "954812a8077115a4364b65372e92980e3ea4685b",
        "timestamp" : 1789547570000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Dev: pre-bundle AG Grid + vue-pdf deps to fix grid never rendering\u000a\u000aEvery AG Grid page (any of them — confirmed on both Customer Returns and\u000aShippers) rendered a completely empty <div class=\"ag-theme-balham\">: no\u000arows, no \"No Rows\" overlay, no console error. Root cause was the same\u000aclass of issue the surrounding optimizeDeps.include comment already\u000adocuments for other packages, just not yet applied to these: ag-grid-community,\u000aag-grid-enterprise, ag-grid-vue3, and @tato30/vue-pdf were never in the\u000alist, so Vite only discovered them when the first page using <AgGrid>/\u000a<PrintViewer> actually rendered — triggering a disruptive re-optimize +\u000aforced reload mid-render. That reload left AgGridVue's internal grid\u000acreation desynced from AgGrid.vue's provideGlobalGridOptions({theme:\u000a\"legacy\"}) call, surfacing as AG Grid's own \"error #239\" (Theming API vs\u000aCSS File Theme conflict) — and, on the very first hit of a session, as a\u000atotally blank grid with no error at all.\u000a\u000aAlso adds @capacitor/preferences (pulled in by plugins/00.capacitor-api.client.ts\u000afor the dual web/Capacitor build, which stays in the dev module graph even\u000athough it early-returns on web) — same failure mode, same fix.\u000a\u000aConfirmed fixed: clean nuxt dev restart + rm -rf .nuxt node_modules/.cache,\u000aCustomer Returns list and detail view both rendered fully on first load,\u000ano \"Vite discovered new dependencies at runtime\" warning, no AG Grid error.\u000aDev-only change (vite.optimizeDeps has no effect on the production build).\u000a\u000aCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\u000aClaude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E\u000a",
        "date" : "2026-09-16 10:32:50 +0200",
        "id" : "954812a8077115a4364b65372e92980e3ea4685b",
        "msg" : "Dev: pre-bundle AG Grid + vue-pdf deps to fix grid never rendering",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "nuxt.config.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/requests/requests/update.put.ts",
          "app/components/requests/MyTicketDetail.vue",
          "app/pages/mobile/tasks.vue",
          "server/api/requests/requests/[id]/push-task.post.ts",
          "server/api/mobile/pushed-tasks.get.ts",
          "app/composables/states.ts",
          "app/pages/mobile/index.vue",
          "app/layouts/mobile.vue",
          "server/utils/fcmNotifier.ts",
          "app/composables/usePushedTasks.ts",
          "app/plugins/20.native-push.client.ts"
        ],
        "commitId" : "39a918fde9d11a993c8aa2aad04a6d94d3171136",
        "timestamp" : 1789553513000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Requests: push tickets to mobile workers as priority tasks\u000a\u000aLets dispatchers push a ticket to a specific mobile worker's device (native\u000aFCM + web push) so it pops up and stays pinned as a priority-task banner on\u000athe mobile dashboard until the worker starts the timer on it. Opening it\u000areuses the existing ticket instructions/chat/timer flow in tasks.vue; a new\u000aglobal running-timer banner keeps the timer visible while navigating other\u000amobile pages.\u000a\u000aNeeds two new custom columns on R_Request in iDempiere (IsPushedTask Yes-No,\u000aPushedTaskAt Date+Time) — stays inert until those exist.\u000a",
        "date" : "2026-09-16 12:11:53 +0200",
        "id" : "39a918fde9d11a993c8aa2aad04a6d94d3171136",
        "msg" : "Requests: push tickets to mobile workers as priority tasks",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/layouts/mobile.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/plugins/20.native-push.client.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/requests/requests/update.put.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/requests/requests/[id]/push-task.post.ts"
          },
          {
            "editType" : "add",
            "file" : "app/composables/usePushedTasks.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/mobile/pushed-tasks.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/states.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/requests/MyTicketDetail.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/fcmNotifier.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/tasks.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/sales/returns/[id]/view.vue"
        ],
        "commitId" : "f2540ba61045ce40c991525ed3931844b57bc0ef",
        "timestamp" : 1789554804000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Fix return-label reprint printing wrong DocumentNo\u000a\u000aThe \"Etikett erneut drucken\" button on the return detail page always\u000aprinted the customer-return's own DocumentNo, but /mobile/reconditioning\u000aonly scans the linked RMA's DocumentNo (571/572 live returns have one).\u000aNow prints the RMA's number when present, matching what intake already\u000aprints, and falls back to the return's own number only when there's no\u000alinked RMA.\u000a",
        "date" : "2026-09-16 12:33:24 +0200",
        "id" : "f2540ba61045ce40c991525ed3931844b57bc0ef",
        "msg" : "Fix return-label reprint printing wrong DocumentNo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/sales/returns/[id]/view.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/plugins/warm-cid-lookup.ts",
          "server/api/telephony/cid-lookup/[number].get.ts",
          "reference/recipes.md",
          "server/utils/telephony/cidDirectory.ts"
        ],
        "commitId" : "3534d36393ce6175fe9b2f1c21ed9741129048c8",
        "timestamp" : 1789554829000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Reverse caller-ID lookup: replace Elasticsearch with a direct iDempiere-backed in-memory directory — server/utils/telephony/cidDirectory.ts fetches the small active ad_user set with phone/phone2 (SERVICE token, same pattern as phoneActivity.ts/extensions.ts) into a 60s TTL stale-while-revalidate cache so cid-lookup/[number].get.ts has zero network calls on the hot path (was querying a Postgres-trigger-fed ES index that could lag/stall behind iDempiere edits); server/plugins/warm-cid-lookup.ts pre-warms the cache at server boot so the first call after a deploy/restart is instant too; recipe note in reference/recipes.md\u000a",
        "date" : "2026-09-16 12:33:49 +0200",
        "id" : "3534d36393ce6175fe9b2f1c21ed9741129048c8",
        "msg" : "Reverse caller-ID lookup: replace Elasticsearch with a direct iDempiere-backed in-memory directory — server/utils/telephony/cidDirectory.ts fetches the small active ad_user set with phone/phone2 (SERVICE token, same pattern as phoneActivity.ts/extensions.ts) into a 60s TTL stale-while-revalidate cache so cid-lookup/[number].get.ts has zero network calls on the hot path (was querying a Postgres-trigger-fed ES index that could lag/stall behind iDempiere edits); server/plugins/warm-cid-lookup.ts pre-warms the cache at server boot so the first call after a deploy/restart is instant too; recipe note in reference/recipes.md",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/telephony/cid-lookup/[number].get.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/telephony/cidDirectory.ts"
          },
          {
            "editType" : "add",
            "file" : "server/plugins/warm-cid-lookup.ts"
          },
          {
            "editType" : "edit",
            "file" : "reference/recipes.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/attachments/[table]/[id]/index.get.ts"
        ],
        "commitId" : "4fc7a95b074a29eacb5e9ff0da45ea06db028255",
        "timestamp" : 1789558991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Fix attachment-lookup N+1: skip the live ad_table query for known table names\u000a\u000aserver/api/attachments/[table]/[id]/index.get.ts hit iDempiere's ad_table\u000amodel on every call to resolve a table name to its numeric id, even though\u000athe very same route already had a complete hardcoded fallback map for the\u000acommon tables. Every AgGrid row with an attachment cell (AgCustomAttachment.vue)\u000afires this once, so a large order/shipment grid render turned into hundreds\u000aof redundant REST calls, each going through the synchronized\u000aDefaultQueryConverter singleton (see the \"iDempiere REST load rules\" recipe /\u000a2026-09-10 incident) — a live capture on prod showed 287 of these in one\u000agrid render. Now the static map is checked first and iDempiere is only\u000aqueried for a genuinely unmapped table name. Behavior-preserving: also drops\u000aa dead duplicate M_Product branch that was unreachable (208 always won).\u000a",
        "date" : "2026-09-16 13:43:11 +0200",
        "id" : "4fc7a95b074a29eacb5e9ff0da45ea06db028255",
        "msg" : "Fix attachment-lookup N+1: skip the live ad_table query for known table names",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/attachments/[table]/[id]/index.get.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/requests/requests/[id]/request-history/index.get.ts",
          "app/components/requests/MyTicketDetail.vue",
          "server/api/requests/requests/latest-updates.get.ts",
          "server/api/requests/requests/[id]/request-update/index.get.ts",
          "server/utils/ticketViewer.ts",
          "server/api/requests/requests/[id]/request-update/index.post.ts",
          "server/api/requests/requests/[id]/author-orgs.get.ts"
        ],
        "commitId" : "26a325c9da0087ee13a1ed7a95bba6080578f643",
        "timestamp" : 1789559285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Tickets: show staff replies to limited merchant roles (service-token reads)\u000a\u000aStaff replies on merchant tickets were stamped with the staff member's\u000aactive org (LogYou) instead of the ticket's org, so iDempiere's org\u000arow-level security hid them from the merchant's limited role — customers\u000asaw only their own messages (85 such rows across 5 merchants on prod,\u000ae.g. Wonderhome ticket 1000439 with both LogYou replies missing).\u000aAD_Org_ID is not updateable on R_Request/R_RequestUpdate/R_RequestAction,\u000aso the rows cannot be re-stamped.\u000a\u000a- server/utils/ticketViewer.ts: role FrontendMenu resolved server-side\u000a  (service token, cached), caller-token ticket access check, server-side\u000a  twin of the client's internal-entry filter ('I' / [Zeitabrechnung]).\u000a- request-update / request-history GET: a proven-limited viewer reads the\u000a  ticket's rows with the service token AFTER the caller-token access check;\u000a  internal entries are dropped server-side. Both lists now ordered + capped.\u000a- request-update POST: AD_Org_ID derived from the ticket server-side\u000a  (body.organizationId ignored) so every caller stamps the right org;\u000a  limited roles can never post an 'I' entry. Write stays on the caller's\u000a  token so CreatedBy is correct.\u000a- author-orgs: collect update/action authors with the service token for\u000a  limited viewers so the newly visible staff rows get their LogYou label.\u000a- latest-updates: limited viewers get updates of their visible tickets via\u000a  chunked `R_Request_ID in (...)` with the service token, filtered.\u000a",
        "date" : "2026-09-16 13:48:05 +0200",
        "id" : "26a325c9da0087ee13a1ed7a95bba6080578f643",
        "msg" : "Tickets: show staff replies to limited merchant roles (service-token reads)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/requests/requests/[id]/author-orgs.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/requests/requests/[id]/request-history/index.get.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/ticketViewer.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/requests/MyTicketDetail.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/requests/requests/latest-updates.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/requests/requests/[id]/request-update/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/requests/requests/[id]/request-update/index.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/requests/MyTicketDetail.vue"
        ],
        "commitId" : "4e94b7513ae63f4e85e54ccfdc83f8ceaaa7169b",
        "timestamp" : 1789559459000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Ticket detail: wrap toolbar instead of overlapping in the split view\u000a\u000aThe ticket header bar was a single non-wrapping row with hidden horizontal\u000ascroll; in the my-tickets split view (and small windows) the action group\u000apainted over the metadata chips (ticket no., date, type, category,\u000aassignee). The bar now wraps into a metadata row and an action row when\u000aspace runs out, chips wrap inside each group, and in narrow bars the\u000asecondary actions (push to mobile, accounting flag) collapse to icon\u000abuttons with tooltips via a container query.\u000a",
        "date" : "2026-09-16 13:50:59 +0200",
        "id" : "4e94b7513ae63f4e85e54ccfdc83f8ceaaa7169b",
        "msg" : "Ticket detail: wrap toolbar instead of overlapping in the split view",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/requests/MyTicketDetail.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/composables/useOpenShipments.ts",
          "server/api/inouts/open-to-commission-list.get.ts"
        ],
        "commitId" : "40b7c61af8d06bd8bc95b02f3393b1f37fd504c5",
        "timestamp" : 1789559494000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Fix unbounded open-shipments query: replace child-table $expand with direct-Postgres list + batched line fetch\u000a\u000auseOpenShipments.ts (backing components/integrations/OpenShipments.vue, polled every\u000a2 minutes per open tab on the commissioning page) queried m_inout with a 5-way $expand\u000aincluding the CHILD table m_inoutline($expand=m_product_id) and no $top — same shape as\u000athe 2026-09-10 incident's m_product $expand=M_Storage, hitting the synchronized\u000aDefaultQueryConverter singleton once per shipment per line. A live capture returned 2MB\u000ain one response; only 67 rows today but it only gets heavier as open-shipment volume grows.\u000a\u000aFix, following the same pattern already used for products+storage (productStorageHelper.ts):\u000a- Shipment list now comes from the existing direct-Postgres endpoint\u000a  server/api/inouts/open-to-commission-list.get.ts (already used by the dashboard \"Offene\u000a  Aufträge\" card and the commissioning modal), extended with the fields the widget needs\u000a  (location/shipper name, PO reference, line-qty sum) so it's purely additive for its\u000a  existing consumers.\u000a- Line items (needed for the barcode-scan-to-shipment search in commission.vue) are fetched\u000a  in one bounded REST call: m_inoutline top-level list with $filter=M_InOut_ID in (...)\u000a  and $expand=M_Product_ID as a to-one FK expand, not a child expand under m_inout, so it\u000a  takes the cheap code path per the \"iDempiere REST load rules\" recipe. Verified directly\u000a  against prod (SQL query + REST filter) before committing.\u000a",
        "date" : "2026-09-16 13:51:34 +0200",
        "id" : "40b7c61af8d06bd8bc95b02f3393b1f37fd504c5",
        "msg" : "Fix unbounded open-shipments query: replace child-table $expand with direct-Postgres list + batched line fetch",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/composables/useOpenShipments.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/inouts/open-to-commission-list.get.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle"
        ],
        "commitId" : "9ab77d566a46409c11846c82a81629cb020bfd70",
        "timestamp" : 1789559554000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Mobile app: bump version to 1.0.49 (versionCode 50)\u000a",
        "date" : "2026-09-16 13:52:34 +0200",
        "id" : "9ab77d566a46409c11846c82a81629cb020bfd70",
        "msg" : "Mobile app: bump version to 1.0.49 (versionCode 50)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/ChangeLogButton.vue",
          "app/pages/materials/products/[id]/edit.vue",
          "app/pages/partners/partners/[id]/edit.vue",
          "app/pages/sales/orders/[id]/edit.vue",
          "server/utils/changeLogHelper.ts",
          "app/components/ChangeLogModal.vue",
          "server/api/changelog/detail/[table]/[recid].get.ts",
          "app/pages/sales/shipments/[id]/edit.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "6ef4fadbda7e9d755b39ea38b02904770c07e887",
        "timestamp" : 1789560600000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Change log modal (admin only) for orders, shipments, products and partners\u000a\u000aAdds an iDempiere AD_ChangeLog viewer like the ZK 'Change Log' / 'Time Line' tab:\u000a- server/utils/changeLogHelper.ts + GET /api/changelog/detail/{table}/{id}:\u000a  paged changelog read with column metadata, list values resolved via\u000a  AD_Ref_List, foreign keys resolved to record labels (bounded, cached),\u000a  child lines included (order/shipment lines, partner locations + contacts),\u000a  record creation event; role must be IsClientAdministrator (checked server-side)\u000a- components/ChangeLogModal.vue: timeline (grouped per transaction, day\u000a  separators) + table view, search, line/technical-field toggles, DE/EN/ES\u000a- components/ChangeLogButton.vue: admin-gated toolbar button, wired into the\u000a  order, shipment, product and business-partner edit pages\u000a",
        "date" : "2026-09-16 14:10:00 +0200",
        "id" : "6ef4fadbda7e9d755b39ea38b02904770c07e887",
        "msg" : "Change log modal (admin only) for orders, shipments, products and partners",
        "paths" : [
          {
            "editType" : "add",
            "file" : "server/api/changelog/detail/[table]/[recid].get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/sales/shipments/[id]/edit.vue"
          },
          {
            "editType" : "add",
            "file" : "server/utils/changeLogHelper.ts"
          },
          {
            "editType" : "add",
            "file" : "app/components/ChangeLogModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/partners/partners/[id]/edit.vue"
          },
          {
            "editType" : "add",
            "file" : "app/components/ChangeLogButton.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/sales/orders/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/materials/products/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/AgGrid/Shipments/AgShipmentEditLink.vue",
          "app/pages/sales/shipments/index.vue"
        ],
        "commitId" : "4068470597d78282ca601129755254f00bd0a7c5",
        "timestamp" : 1789560600000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Shipments list: link document numbers directly to the shipment edit page\u000a",
        "date" : "2026-09-16 14:10:00 +0200",
        "id" : "4068470597d78282ca601129755254f00bd0a7c5",
        "msg" : "Shipments list: link document numbers directly to the shipment edit page",
        "paths" : [
          {
            "editType" : "add",
            "file" : "app/components/AgGrid/Shipments/AgShipmentEditLink.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/sales/shipments/index.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/sales/orders/[id]/edit.vue",
          "app/pages/sales/orders/index.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "679f81dc67cf8b18be03cdd88c38f3e00bf257c1",
        "timestamp" : 1789560984000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order edit: restructure the action toolbar, rename reactivation to 'Auftrag wiederöffnen'\u000a\u000aThe order edit bar had grown to ~20 coloured icon-only buttons. It is now a\u000aneutral, text-labelled toolbar: Save, Files (with badge), Complete / Reopen\u000aorder, Create shipment, Create invoice, Void, and a grouped 'More actions'\u000adropdown (print / labels / duplicate / video / reminders / compare / change\u000alog). All visibility rules live in one data-driven action list; on phones\u000a(<= 768px) only Save, Files and the status action stay outside the dropdown.\u000aRight side: Abort, share, Back, Ticket as labelled buttons.\u000a\u000a- 'Reaktivieren' is now 'Auftrag wiederöffnen' (Reopen order); the orders list\u000a  batch action 'Auf Entwurf' uses the same wording\u000a- new translation keys (en/de/es): reopen_order, more_actions,\u000a  create_shipment_action, create_invoice_action, shipment_created,\u000a  invoice_created, void_not_possible_shipped, force_void_short,\u000a  manual_commission_short, reprint_label, order_reminders, show_video\u000a",
        "date" : "2026-09-16 14:16:24 +0200",
        "id" : "679f81dc67cf8b18be03cdd88c38f3e00bf257c1",
        "msg" : "Order edit: restructure the action toolbar, rename reactivation to 'Auftrag wiederöffnen'",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/sales/orders/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/sales/orders/[id]/edit.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/sales/OrderForm.vue",
          "app/components/ChangeLogModal.vue"
        ],
        "commitId" : "f158c2abbbf73217d0b95096455df4882b77d43d",
        "timestamp" : 1789561286000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order tab: fix column overlap (30% / auto / 22%); change log table: truncate line labels, hide technical fields by default\u000a\u000a- OrderForm: explicit flex bases + min-width:0 on the three order-tab columns\u000a  (numbers/refs wider, shipping address flexible, 'General' column narrower) so\u000a  the row can no longer overflow under the side cards; long e-mails wrap\u000a- ChangeLogModal: fixed table layout with column widths, line badges truncated\u000a  with full text as tooltip, 'Hide technical fields' on by default\u000a",
        "date" : "2026-09-16 14:21:26 +0200",
        "id" : "f158c2abbbf73217d0b95096455df4882b77d43d",
        "msg" : "Order tab: fix column overlap (30% / auto / 22%); change log table: truncate line labels, hide technical fields by default",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/ChangeLogModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/sales/OrderForm.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/sales/OrderForm.vue"
        ],
        "commitId" : "7eb042353e2b5a3fbc37ccee28f6b5b2ace61a6c",
        "timestamp" : 1789561790000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order tab: make the 'General' column really 22% wide, stack its paired fields\u000a\u000aThe earlier width rule lost to Bulma's .column.is-one-third (higher specificity),\u000aso the column was still a third of the row. The selector now outranks it and\u000athe Date Ordered/Promised and Organization/Tenant pairs stack vertically so\u000anothing truncates in the narrow column.\u000a",
        "date" : "2026-09-16 14:29:50 +0200",
        "id" : "7eb042353e2b5a3fbc37ccee28f6b5b2ace61a6c",
        "msg" : "Order tab: make the 'General' column really 22% wide, stack its paired fields",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/sales/OrderForm.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/sales/OrderForm.vue"
        ],
        "commitId" : "6e5caf40f53fed39d1a293b80f62304060008fb8",
        "timestamp" : 1789561862000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order tab: move the partner link into the shipping-address header as a right-aligned 'Kunde' link\u000a\u000aThe partner row above the recipient name is replaced by a compact 'Kunde' link\u000a(with open-link icon) on the right of the 'Lieferanschrift' header; the partner\u000aname is shown as tooltip only. Limited roles get a static label.\u000a",
        "date" : "2026-09-16 14:31:02 +0200",
        "id" : "6e5caf40f53fed39d1a293b80f62304060008fb8",
        "msg" : "Order tab: move the partner link into the shipping-address header as a right-aligned 'Kunde' link",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/sales/OrderForm.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/sales/OrderForm.vue"
        ],
        "commitId" : "cce23cadaf525474a569212d8c883efbd265512a",
        "timestamp" : 1789561969000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order tab 'General' column: Organization first, compact German-formatted date row, Tenant as tooltip\u000a\u000a- Organization is the first field; Tenant is no longer a field, it shows as a\u000a  tooltip on hover over Organization\u000a- Date Ordered / Date Promised sit side by side in one compact row (smaller\u000a  label + input, short labels 'Ordered' / 'Promised' with full title); on\u000a  completed/voided orders the read-only values display as dd.mm.yyyy\u000a",
        "date" : "2026-09-16 14:32:49 +0200",
        "id" : "cce23cadaf525474a569212d8c883efbd265512a",
        "msg" : "Order tab 'General' column: Organization first, compact German-formatted date row, Tenant as tooltip",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/sales/OrderForm.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/sales/orders/[id]/edit.vue"
        ],
        "commitId" : "67b55a0e93a3b98c8d50c634e6c42f29d52c436d",
        "timestamp" : 1789562001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order edit toolbar: ticket button in the app-wide yellow (same as .button.is-ticket)\u000a",
        "date" : "2026-09-16 14:33:21 +0200",
        "id" : "67b55a0e93a3b98c8d50c634e6c42f29d52c436d",
        "msg" : "Order edit toolbar: ticket button in the app-wide yellow (same as .button.is-ticket)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/sales/orders/[id]/edit.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/OrderQuickAddModal.vue",
          "app/pages/sales/orders/[id]/edit.vue"
        ],
        "commitId" : "b23e90b7728a7cee87ddf690a385dde8403b453d",
        "timestamp" : 1789562270000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Order edit: no stale 'Abort' button when opening an order\u000a\u000a- loadOrderData() resets the global useActiveSave flag before loading — a\u000a  fresh record has nothing unsaved; the flag is shared by every edit page and\u000a  modal, so a leftover true (e.g. from a dismissed quick-add) showed 'Abort'\u000a  and blocked navigation on the next order opened from the grid\u000a- the Abort button additionally requires the form to be really dirty\u000a  (activeSave && !noEdit)\u000a- OrderQuickAddModal clears the flag when it is closed without saving\u000a",
        "date" : "2026-09-16 14:37:50 +0200",
        "id" : "b23e90b7728a7cee87ddf690a385dde8403b453d",
        "msg" : "Order edit: no stale 'Abort' button when opening an order",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/sales/orders/[id]/edit.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/OrderQuickAddModal.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/requests/requests/[id]/push-task-status.post.ts",
          "app/components/requests/MyTicketDetail.vue",
          "app/pages/mobile/tasks.vue",
          "server/api/requests/requests/[id]/push-task.post.ts",
          "server/api/mobile/pushed-tasks.get.ts",
          "app/pages/mobile/index.vue",
          "app/composables/usePushedTasks.ts"
        ],
        "commitId" : "f81ead42e45699211b185cc66502b6580111e91b",
        "timestamp" : 1789565593000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Pushed tasks: instruction note, worker actions, take-back and deep-link fix\u000a\u000aRounds out the push-to-mobile-worker flow into one coherent workflow:\u000a\u000a- Desktop push modal: the note becomes an instruction for the worker (up to\u000a  1000 chars) and is stored as an INTERNAL chat note \"[Anweisung] …\" — never\u000a  visible to the merchant and no merchant notification. The modal shows which\u000a  order/product is linked (rendered on the device with the instruction).\u000a- Desktop ticket: a prominent banner while the ticket lives on a device\u000a  (\"An Mobilgerät gepusht · wartet\" / \"In Arbeit auf dem Mobilgerät · X\"),\u000a  a state pill in the toolbar and a \"Zurückholen\" button (optional take-back).\u000a- New route [id]/push-task-status.post.ts: start → TaskStatus 20 %, return →\u000a  IsPushedTask cleared (+ internal note, staff toast when from mobile),\u000a  complete → IsComplete + TaskStatus 100 % + IsPushedTask cleared. push-task\u000a  sets TaskStatus 0 %; the pending list now includes started tasks\u000a  (TaskStatus ≠ 0 → \"In Arbeit\") plus linked order/product.\u000a- Mobile ticket modal for a pushed task: instruction card, order/product\u000a  cards, \"Timer starten\" (keeps the task in the list as \"In Arbeit\"),\u000a  \"Arbeit abschließen\" (stops the timer, books the time, completes and hands\u000a  the ticket back to the desktop) and \"Zurück an Desktop\" (optional reason).\u000a  Full history collapsed behind \"Verlauf anzeigen\".\u000a- Dashboard banner separates new vs. \"in Arbeit\" pushed tasks.\u000a- Fix: opening a pushed task from the dashboard again after leaving the\u000a  keep-alive'd tasks page re-showed the state it was left in (wizard step,\u000a  open list). Deep links are now handled on every activation/query change\u000a  and reset the page first (a running timer is never discarded).\u000a",
        "date" : "2026-09-16 15:33:13 +0200",
        "id" : "f81ead42e45699211b185cc66502b6580111e91b",
        "msg" : "Pushed tasks: instruction note, worker actions, take-back and deep-link fix",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/mobile/pushed-tasks.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/usePushedTasks.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/tasks.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/requests/requests/[id]/push-task.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/requests/requests/[id]/push-task-status.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/requests/MyTicketDetail.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/requests/MyTicketDetail.vue"
        ],
        "commitId" : "a05516e158e1274739e9bf16292acf5114274e7f",
        "timestamp" : 1789565721000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Ticket detail toolbar: chips + two workflow buttons + 'Weitere Aktionen' dropdown\u000a\u000aSame pattern as the order edit toolbar: state chips (open/completed, owner,\u000apushed, accounted) on the left of the action group, the two workflow actions\u000a(hand over / take back, close / reopen) as text buttons, and everything else\u000a(push to mobile, take back from mobile, accounting flag, PDF report, open\u000afull page) grouped in a data-driven \"Weitere Aktionen\" dropdown — so the bar\u000afits one row in the split view instead of a wall of buttons.\u000a",
        "date" : "2026-09-16 15:35:21 +0200",
        "id" : "a05516e158e1274739e9bf16292acf5114274e7f",
        "msg" : "Ticket detail toolbar: chips + two workflow buttons + 'Weitere Aktionen' dropdown",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/requests/MyTicketDetail.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/offers/LeadQuestionnaireModal.vue",
          "app/pages/users/leads/index.vue",
          "server/utils/offers/questionnairePdf.ts",
          "app/utils/leadQuestionnaire.ts",
          "app/pages/users/leads/[id]/edit.vue",
          "server/api/offers/questionnaire/pdf.post.ts",
          "server/utils/offers/offerConditions.ts",
          "server/api/offers/questionnaire/save.post.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "6556f77238142892a52f9c9b0e26663c42a909e6",
        "timestamp" : 1789568496000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Lead questionnaire: initial-call form (DE/EN) with blank print, draft and PDF attachment\u000a\u000aNew \"Fragebogen\" on the lead page (hero CTA + toolbar icon): a catalog-driven\u000aquestionnaire staff fill in while talking to a prospect — current situation,\u000aorder volume, articles (barcode, MHD, serials), additional services\u000a(customisation, kitting, Amazon Prime/FBA/Pre-FBA), inbound & storage,\u000aorganisational. German by default, EN toggle switches labels and PDF.\u000a\u000a- Question catalog in app/utils/leadQuestionnaire.ts, shared by the modal and\u000a  the server renderer; adding a question is one entry.\u000a- server/utils/offers/questionnairePdf.ts (pdf-lib): blank mode = fillable\u000a  AcroForm (text fields + check boxes) for hand-written answers, filled mode =\u000a  drawn values; the free-notes box grows to the rest of its page.\u000a- Routes: offers/questionnaire/pdf (render) and offers/questionnaire/save\u000a  (answers on offer_conditions.questionnaire; with attach: filled PDF attached\u000a  to Lead_User via Strapi + C_ContactActivity with the answer summary).\u000a- Draft save / reopen prefilled, progress chip, conversation meta (date,\u000a  channel, interviewer).\u000a- Leads list: \"Leerer Fragebogen\" (+ EN) prints the blank form without any\u000a  lead prefill.\u000a- offerConditions section type widened to string (new 'questionnaire' section).\u000a",
        "date" : "2026-09-16 16:21:36 +0200",
        "id" : "6556f77238142892a52f9c9b0e26663c42a909e6",
        "msg" : "Lead questionnaire: initial-call form (DE/EN) with blank print, draft and PDF attachment",
        "paths" : [
          {
            "editType" : "add",
            "file" : "app/utils/leadQuestionnaire.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/offers/offerConditions.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/offers/questionnairePdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/users/leads/index.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/offers/questionnaire/save.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/users/leads/[id]/edit.vue"
          },
          {
            "editType" : "add",
            "file" : "app/components/offers/LeadQuestionnaireModal.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/offers/questionnaire/pdf.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle"
        ],
        "commitId" : "84f6e38b0d2d238419af49bc604a98c97074e6f0",
        "timestamp" : 1789568496000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Android app 1.0.50 (versionCode 51): Mobile Push Tasks release\u000a",
        "date" : "2026-09-16 16:21:36 +0200",
        "id" : "84f6e38b0d2d238419af49bc604a98c97074e6f0",
        "msg" : "Android app 1.0.50 (versionCode 51): Mobile Push Tasks release",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/plugins/20.native-push.client.ts"
        ],
        "commitId" : "ed5155594b06a3de2a0b937148dc0a67bc965024",
        "timestamp" : 1789574610000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Pushed tasks: refresh the mobile dashboard live on a foreground push\u000a\u000aAndroid hands a foreground FCM message to the app without a tray\u000anotification, so a worker sitting on the dashboard saw nothing until they\u000aleft and came back. The native plugin now refetches the pushed-task list on\u000aa 'pushed_task' receipt, plays the warning feedback and shows a toast.\u000a",
        "date" : "2026-09-16 18:03:30 +0200",
        "id" : "ed5155594b06a3de2a0b937148dc0a67bc965024",
        "msg" : "Pushed tasks: refresh the mobile dashboard live on a foreground push",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/plugins/20.native-push.client.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/requests/MyTicketDetail.vue",
          "app/pages/mobile/index.vue"
        ],
        "commitId" : "4931f7663993c142be7e4ed09071c1b04489782c",
        "timestamp" : 1789574610000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Pushed tasks: neutral dashboard banner with urgency tags, native refresh poll\u000a\u000aThe banner stays sticky at the top but drops the red block: rows are neutral\u000aand only priority 1 (Dringend) / 3 (Hoch) carry a tag. The native app adds a\u000a60 s refetch while the dashboard is visible as a safety net for missed pushes.\u000aThe desktop \"Gepusht · wartet\" pill uses the blue working-state colours.\u000a",
        "date" : "2026-09-16 18:03:30 +0200",
        "id" : "4931f7663993c142be7e4ed09071c1b04489782c",
        "msg" : "Pushed tasks: neutral dashboard banner with urgency tags, native refresh poll",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/requests/MyTicketDetail.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/mobile/tasks.vue",
          "app/composables/usePushedTasks.ts",
          "server/api/mobile/pushed-tasks.get.ts"
        ],
        "commitId" : "82990a75948958eacd02ef68561ba8961b52ef9d",
        "timestamp" : 1789574610000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Pushed tasks: task modal — back to dashboard, return fix, linked record cards\u000a\u000a- Closing a task opened from the dashboard/notification deep link returns to\u000a  the dashboard (history entry replaced) instead of the new-task wizard.\u000a- \"Zurück an Desktop\" confirmation replaces the action row in place (it used\u000a  to render below the fold), books a running timer instead of refusing, and\u000a  hands back to the dashboard afterwards.\u000a- Linked product (thumbnail, codes, stock per locator, open shortcut), order\u000a  (customer, ship-to, lines, shipments) and shipment (status, tracking, lines)\u000a  are rendered as cards; the pushed-task list now carries M_InOut_ID.\u000a- Pinned list uses neutral colours with Dringend/Hoch tags.\u000a",
        "date" : "2026-09-16 18:03:30 +0200",
        "id" : "82990a75948958eacd02ef68561ba8961b52ef9d",
        "msg" : "Pushed tasks: task modal — back to dashboard, return fix, linked record cards",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/tasks.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/mobile/pushed-tasks.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/usePushedTasks.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/mobile/tasks.vue",
          "app/pages/mobile/index.vue"
        ],
        "commitId" : "1e77ee19cf43852966794881cd3f1642880f624d",
        "timestamp" : 1789575694000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Pushed tasks: colour rows by priority tier (high red, default orange, low blue)\u000a\u000aDashboard banner rows and the pinned list now carry the ticket's priority\u000atier on border/background plus a solid tag: 1/3 (Urgent/High) red, 5 (the\u000adefault) orange, 7/9 (Low/Minor) light blue. Theme tokens only, so dark mode\u000afollows automatically.\u000a",
        "date" : "2026-09-16 18:21:34 +0200",
        "id" : "1e77ee19cf43852966794881cd3f1642880f624d",
        "msg" : "Pushed tasks: colour rows by priority tier (high red, default orange, low blue)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/tasks.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/index.vue"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.younex.de/user/info",
      "fullName" : "info"
    }
  ]
}