{
  "_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" : 743,
          "buildResult" : null,
          "marked" : {
            "SHA1" : "07e934be183c1c9f644eaf4b8cb261be0c1f9e73",
            "branch" : [
              {
                "SHA1" : "07e934be183c1c9f644eaf4b8cb261be0c1f9e73",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          },
          "revision" : {
            "SHA1" : "07e934be183c1c9f644eaf4b8cb261be0c1f9e73",
            "branch" : [
              {
                "SHA1" : "07e934be183c1c9f644eaf4b8cb261be0c1f9e73",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "07e934be183c1c9f644eaf4b8cb261be0c1f9e73",
        "branch" : [
          {
            "SHA1" : "07e934be183c1c9f644eaf4b8cb261be0c1f9e73",
            "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" : "#743",
  "duration" : 67622,
  "estimatedDuration" : 61503,
  "executor" : null,
  "fullDisplayName" : "build-logship-frontend #743",
  "id" : "743",
  "inProgress" : false,
  "keepLog" : false,
  "number" : 743,
  "queueId" : 5760,
  "result" : "SUCCESS",
  "timestamp" : 1789948800765,
  "url" : "https://jenkins.younex.de/job/build-logship-frontend/743/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/accounting/incoming-invoices/index.vue",
          "app/components/DateInputDe.vue",
          "server/utils/inbox/inboxDb.ts",
          "server/utils/inbox/processDocument.ts",
          "server/api/accounting/incoming-invoices/[id]/confirm.post.ts",
          "app/components/accounting/inbox/InboxList.vue",
          "server/api/accounting/incoming-invoices/[id]/defaults.get.ts",
          "server/utils/inbox/extractPipeline.ts",
          "app/utils/inboxTaxRate.ts",
          "app/components/accounting/inbox/InvoiceReview.vue",
          "server/utils/inbox/vendorDefaults.ts",
          "server/api/accounting/incoming-invoices/match-vendor.get.ts",
          "server/utils/inbox/layoutFingerprint.ts",
          "server/utils/inbox/vendorProfile.ts",
          "server/utils/bankReconciliationSuggestions.ts",
          "server/utils/inbox/fieldExtractors.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "e5fb5e19ca99490429a576155ff11950f17eb139",
        "timestamp" : 1789891865000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Incoming invoices: searchable vendor picker, amount-based tax detection, learning that actually applies\u000a\u000aReview screen\u000a- vendor picker is a real searchable selection (remembered -> scored candidates -> all vendors of\u000a  the org + org *); \"use existing\" is never disabled; same-named partners show VAT id / id\u000a- vendor matching scored in Node (VAT id, fuzzy name, partner name tokens on the letterhead,\u000a  e-mail domain) instead of contains(Name, <letterhead line>); own organization is never suggested;\u000a  non-vendor partners are offered and flagged IsVendor on confirm\u000a- learned defaults are resolved LIVE (new GET .../[id]/defaults): document fingerprint -> VAT id /\u000a  IBAN -> layout tokens -> profiles of the selected partner -> the partner's last AP invoice;\u000a  re-resolved when another partner is picked, manually changed fields are never overwritten.\u000a  Fixes: e-invoices never got their profile, documents uploaded before the first confirmation\u000a  never saw it, vat:/layout: key mismatch\u000a- doc type / currency / tax are never empty (document currency, 381 -> AP credit memo, generic\u000a  fallbacks); new cost type (charge) field, learned per vendor\u000a- tax rate: only an e-invoice breakdown is authoritative, otherwise the amounts decide\u000a  (gross == net -> 0 %); no more invented \"19 % detected\"; warning only when the rate is certain;\u000a  a contradicting tax amount (misread year) is replaced; learned tax preferred among same-rate taxes\u000a- dates shown and entered as dd.mm.yyyy (new DateInputDe), vendor match no longer blocks the page\u000a\u000aConfirm\u000a- gross == net means no VAT (a bogus tax amount no longer yields an 810 % rate); the chosen tax is\u000a  kept when its RATE fits instead of being replaced by the first tax of that rate\u000a- learns the EFFECTIVE doc type / currency, and VAT id / IBAN / partner name also in reuse mode\u000a- new vendor address: country from the e-invoice ISO code, else the default country\u000a\u000aExtraction\u000a- no guessed tax rate; rate only next to a tax label or when consistent with the amounts;\u000a  section 19 UStG / reverse charge / intra-community phrases -> 0 %; \"Steuernummer\"/\"Tax ID\" are\u000a  no tax amounts\u000a- tier 0 (ZUGFeRD/XRechnung) gets a layout signature too; signature tokens extended by file-name\u000a  pattern and e-invoice XMP markers (fuzzy tokens only - learned layout hashes keep matching)\u000a- sha256 file signature + duplicate-upload badge in list and review\u000a\u000aInbox list\u000a- list view and the \"ready to review\" filter are the default\u000a- action icons sit in fixed slots, a missing action leaves its slot empty\u000a- period filter uses dd.mm.yyyy\u000a",
        "date" : "2026-09-20 10:11:05 +0200",
        "id" : "e5fb5e19ca99490429a576155ff11950f17eb139",
        "msg" : "Incoming invoices: searchable vendor picker, amount-based tax detection, learning that actually applies",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/utils/inbox/fieldExtractors.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/inbox/vendorProfile.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/inbox/vendorDefaults.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/incoming-invoices/match-vendor.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/inbox/processDocument.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/accounting/inbox/InboxList.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/accounting/incoming-invoices/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/inbox/layoutFingerprint.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/inbox/extractPipeline.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/incoming-invoices/[id]/confirm.post.ts"
          },
          {
            "editType" : "add",
            "file" : "app/components/DateInputDe.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/accounting/inbox/InvoiceReview.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/accounting/incoming-invoices/[id]/defaults.get.ts"
          },
          {
            "editType" : "add",
            "file" : "app/utils/inboxTaxRate.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/inbox/inboxDb.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/bankReconciliationSuggestions.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/accounting/incoming-invoices/next-review.get.ts",
          "app/composables/useInboxBookedToast.ts",
          "app/pages/accounting/incoming-invoices/index.vue",
          "app/components/accounting/inbox/InboxList.vue",
          "app/composables/states.ts",
          "app/components/SelectBox.vue",
          "app/components/accounting/inbox/InvoiceReview.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "10b0c575f7a675c2b8f21559877718a2f9bc874f",
        "timestamp" : 1789893719000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Incoming invoices review: Nuxt UI selects, complete & next / back, review browsing, booked toast + animated counts\u000a\u000a- review screen no longer uses tedir-select / ComboBox: doc type, currency, tax, cost type and the\u000a  vendor picker run on the global SelectBox wrapper (USelectMenu); vendor options show VAT id /\u000a  partner id as searchable subtext, cost type is clearable; triggers aligned with the Bulma inputs\u000a- SelectBox wrapper: opt-in filterProps (search more than the label) and virtualize\u000a- two booking buttons: \"Complete & Back\" (return to the inbox) and \"Complete & Next\" (rightmost,\u000a  continues with the next document waiting for review; falls back to the inbox when none is left);\u000a  reject is an icon button so the bar stays on one row\u000a- browsing bar on top of the review (inbox / previous / position / next) - pure navigation, nothing\u000a  is saved; new GET next-review returns the open ids in inbox order + the next id\u000a- after booking the inbox shows a success toast (warning toast when completion failed / booked\u000a  net) with an \"open invoice\" action; shared useInboxBookedToast, hand-off via useInboxJustBooked\u000a- inbox status chips tween their counts and pulse with a floating +1 / -1 on every change\u000a  (upload -> processing -> ready to review -> booked); the kept-alive inbox now refetches on\u000a  re-activation; the just-booked row flashes; prefers-reduced-motion respected\u000a",
        "date" : "2026-09-20 10:41:59 +0200",
        "id" : "10b0c575f7a675c2b8f21559877718a2f9bc874f",
        "msg" : "Incoming invoices review: Nuxt UI selects, complete & next / back, review browsing, booked toast + animated counts",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "add",
            "file" : "server/api/accounting/incoming-invoices/next-review.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/SelectBox.vue"
          },
          {
            "editType" : "add",
            "file" : "app/composables/useInboxBookedToast.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/accounting/inbox/InvoiceReview.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/accounting/inbox/InboxList.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/accounting/incoming-invoices/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/states.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/accounting/incoming-invoices/index.vue",
          "server/api/accounting/incoming-invoices/[id]/confirm.post.ts",
          "server/utils/inbox/vendorProfile.ts",
          "app/components/accounting/inbox/InboxList.vue",
          "app/utils/inboxVendor.ts",
          "app/composables/states.ts",
          "server/utils/inbox/extractPipeline.ts",
          "app/utils/inboxTaxRate.ts",
          "app/components/accounting/inbox/InvoiceReview.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "285b6c4dd798b3b06091c9a7012d476762217e0a",
        "timestamp" : 1789896144000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Incoming invoices: vendor filter / sort / grouping with review working set, meaningful confidence score, amount reconciliation\u000a\u000aInbox list\u000a- vendor facet filter with counts (same vendor = first segment of the letterhead line, ignoring\u000a  case / punctuation / legal form; a learned profile name wins), sort select (last uploaded,\u000a  invoice date, vendor, amount, recognition %) with direction, group-by-vendor headers\u000a- default = no vendor filter, no grouping, last uploaded on top; sort/group are not remembered\u000a  across visits; rows show the short vendor label\u000a- opening a review from a filtered / re-sorted list stores that result set as the WORKING SET\u000a  (useInboxReviewQueue + sessionStorage): the review's previous / next, the position counter and\u000a  \"complete & next\" walk exactly that set in that order; a chip shows it and clears it; booked\u000a  documents leave the set, an exhausted set returns to the inbox\u000a\u000aConfidence badge\u000a- was a plain average over ALL stored confidences, including internal helper keys with fixed\u000a  heuristic values (currency 0.6, taxBasisTotal 0.5, taxes, isTaxIncluded 0.7) - a perfectly read\u000a  document could not get past ~85-90 %. Now weighted over the fields a reviewer checks (number,\u000a  date, vendor, net / tax / gross); amounts that add up are trusted, amounts that do not pull the\u000a  score down, a missing key field counts as zero\u000a\u000aAmounts\u000a- net + tax must equal gross: when a value read from a LEARNED position breaks that (totals block\u000a  floats with the number of line items - easybell: the \"Netto\" box landed on the VAT line and\u000a  read 3,29 instead of 17,29 with confidence 1.0), the label-based reading is used or the odd one\u000a  out is derived; done in the pipeline for new uploads and in the review for stored documents;\u000a  hint under the totals when the amounts really do not add up\u000a- such a position is forgotten on confirm and not learned again for the vendor (hint.floating);\u000a  re-drawing the box by hand re-enables it\u000a- learned regions yield the VALUE, not label + value: VAT id / IBAN by pattern\u000a  (\"USTIDDE249984363\" -> DE249984363, \"IBAN:DE35...\" -> DE35...), money = last amount token\u000a",
        "date" : "2026-09-20 11:22:24 +0200",
        "id" : "285b6c4dd798b3b06091c9a7012d476762217e0a",
        "msg" : "Incoming invoices: vendor filter / sort / grouping with review working set, meaningful confidence score, amount reconciliation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/utils/inbox/extractPipeline.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/utils/inboxTaxRate.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/incoming-invoices/[id]/confirm.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/inbox/vendorProfile.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/components/accounting/inbox/InvoiceReview.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/accounting/incoming-invoices/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/states.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/accounting/inbox/InboxList.vue"
          },
          {
            "editType" : "add",
            "file" : "app/utils/inboxVendor.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "reference/recipes.md"
        ],
        "commitId" : "33a4d37b433bc59301ed746093ec6b7216ee91d0",
        "timestamp" : 1789896422000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Recipes: incoming invoices inbox — live learned defaults, vendor matching, tax/amount rules, review flow, testing without booking\u000a",
        "date" : "2026-09-20 11:27:02 +0200",
        "id" : "33a4d37b433bc59301ed746093ec6b7216ee91d0",
        "msg" : "Recipes: incoming invoices inbox — live learned defaults, vendor matching, tax/amount rules, review flow, testing without booking",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "reference/recipes.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/utils/banking/camt052Parser.ts",
          ".gitignore",
          "package-lock.json",
          "app/components/accounting/banking/BankFileImportModal.vue",
          "app/components/accounting/banking/BankImportTab.vue",
          "package.json",
          "server/api/accounting/bank-file-import/import.post.ts",
          "server/utils/banking/bankFileImport.ts",
          "app/pages/accounting/banking/index.vue",
          "server/api/accounting/bank-file-import/preview.post.ts",
          "server/api/accounting/bank-reconciliation/statements.get.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "ae5839cc12876467da2bc3b4c76a80a5fdda2f70",
        "timestamp" : 1789902433000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Banking: manual CAMT.052 file import for periods before EBICS\u000a\u000aAdds \"Datei importieren (CAMT.052)\" to the Import tab of /accounting/banking:\u000aupload the online-banking export (ZIP or XML) -> dry-run preview -> chunked\u000aimport with progress. Nuxt-only, no Laravel staging: statements are created\u000aDrafted directly in iDempiere and appear in step 2 (reconcile).\u000a\u000a- camt052Parser: fflate + fast-xml-parser, ISO-8859-1 aware, camt.052/053 in\u000a  any .001.xx version; unpacks ZIPs completely (sub-folders, nested ZIPs,\u000a  extension-less XML, macOS resource forks ignored). The Volksbank export is\u000a  ONE report paginated over the whole period, so entries are split into one\u000a  statement per booking day with a derived balance chain (verified against the\u000a  daily closings of the MT940 export of the same period).\u000a- bankFileImport: duplicate detection by the bank reference (AcctSvcrRef <->\u000a  C_BankStatementLine.EftTrxID, the column the EBICS import fills), fallback\u000a  date+amount+memo multiset; foreign same-day statements are never modified\u000a  (conflict), own Drafted ones are resumed; balance-chain check against existing\u000a  iDempiere statements; plan recomputed live before every write.\u000a- Routes accounting/bank-file-import/{preview,import}; parsed uploads parked in\u000a  data/bank-file-import (git-ignored, 24 h), originals archived on import.\u000a- Reconcile statements list: $top 100 -> 500 (history imports).\u000a- fast-xml-parser declared as a direct dependency (was optional transitive).\u000a- MT940 / CSV / PDF deliberately unsupported (MT940 discontinued by DK 11/2025).\u000a- Translations banking_file_* (en/de/es); sample bank exports git-ignored.\u000a",
        "date" : "2026-09-20 13:07:13 +0200",
        "id" : "ae5839cc12876467da2bc3b4c76a80a5fdda2f70",
        "msg" : "Banking: manual CAMT.052 file import for periods before EBICS",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/accounting/banking/BankImportTab.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/accounting/bank-file-import/import.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/banking/camt052Parser.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/accounting/bank-file-import/preview.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/banking/bankFileImport.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/accounting/banking/index.vue"
          },
          {
            "editType" : "edit",
            "file" : ".gitignore"
          },
          {
            "editType" : "add",
            "file" : "app/components/accounting/banking/BankFileImportModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "package-lock.json"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/bank-reconciliation/statements.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "package.json"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/users/leads/[id]/edit.vue"
        ],
        "commitId" : "1c1bdadaece0a9a3cc7e3814ae7a17e6c915f739",
        "timestamp" : 1789903987000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Lead page: keep Angebot + Vertrag visible, move the rest into a \"Mehr\" menu\u000a\u000aThe hero CTA row showed six coloured buttons. Only Angebot and Vertrag stay\u000avisible; a \"Mehr\" dropdown on the right holds Fragebogen, Prognose, SEPA and\u000aOnboarding (in that order, each with its icon/colour). Closes on outside\u000aclick, Escape and after picking an entry; full-width under the buttons on\u000asmall screens. The compact icon toolbar at the top is unchanged.\u000a",
        "date" : "2026-09-20 13:33:07 +0200",
        "id" : "1c1bdadaece0a9a3cc7e3814ae7a17e6c915f739",
        "msg" : "Lead page: keep Angebot + Vertrag visible, move the rest into a \"Mehr\" menu",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/users/leads/[id]/edit.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/generate-shipments.vue",
          "app/pages/integrations/picklist-desktop.vue",
          "app/utils/picklistPdf.ts",
          "app/pages/mobile/generate-shipments.vue",
          "app/pages/mobile/picklist.vue",
          "app/composables/usePicklistPdf.ts"
        ],
        "commitId" : "2ac713011b72609ee4c067905a6f7bf9bb0f10f9",
        "timestamp" : 1789922611000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Picklist report: larger type, ~double row height, bordered X/Y/Z locator chips, bold qty — one shared layout for normal, reprint, desktop and mobile\u000a",
        "date" : "2026-09-20 18:43:31 +0200",
        "id" : "2ac713011b72609ee4c067905a6f7bf9bb0f10f9",
        "msg" : "Picklist report: larger type, ~double row height, bordered X/Y/Z locator chips, bold qty — one shared layout for normal, reprint, desktop and mobile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/generate-shipments.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/generate-shipments.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/usePicklistPdf.ts"
          },
          {
            "editType" : "add",
            "file" : "app/utils/picklistPdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/integrations/picklist-desktop.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/picklist.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/NewBreadCrumb.vue",
          "app/assets/css/fonts.css",
          "nuxt.config.ts",
          "app/pages/index.vue",
          "app/components/dashboard/TerminalGreeting.vue",
          "public/fonts/vt323-regular.woff2"
        ],
        "commitId" : "fd3f01982dcc34d670b3373940f185198e8fd139",
        "timestamp" : 1789926482000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Dashboard: WarGames-style terminal greeting (time-of-day salutation + user name, VT323, type-in + blinking cursor) for admin roles, aligned with the first card\u000a",
        "date" : "2026-09-20 19:48:02 +0200",
        "id" : "fd3f01982dcc34d670b3373940f185198e8fd139",
        "msg" : "Dashboard: WarGames-style terminal greeting (time-of-day salutation + user name, VT323, type-in + blinking cursor) for admin roles, aligned with the first card",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "nuxt.config.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/NewBreadCrumb.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/css/fonts.css"
          },
          {
            "editType" : "add",
            "file" : "app/components/dashboard/TerminalGreeting.vue"
          },
          {
            "editType" : "add",
            "file" : "public/fonts/vt323-regular.woff2"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/dashboard/TerminalGreeting.vue",
          "app/pages/index.vue",
          "server/api/idempiere-auth/session-key.get.ts"
        ],
        "commitId" : "3cc7c5852471fdc5dab977c1a3168b3311d2a79b",
        "timestamp" : 1789926710000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Dashboard greeting: for all roles, no background, animation once per login (type-in + 10 s cursor, then static)\u000a",
        "date" : "2026-09-20 19:51:50 +0200",
        "id" : "3cc7c5852471fdc5dab977c1a3168b3311d2a79b",
        "msg" : "Dashboard greeting: for all roles, no background, animation once per login (type-in + 10 s cursor, then static)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/dashboard/TerminalGreeting.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/idempiere-auth/session-key.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/index.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/dashboard/TerminalGreeting.vue",
          "app/pages/index.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "ec04cbef07291cc963ea8a6bf90d032d9ee5a286",
        "timestamp" : 1789928205000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Dashboard greeting: salutation in the app language (en/de/es/ne), breadcrumb trail hidden on mobile\u000a",
        "date" : "2026-09-20 20:16:45 +0200",
        "id" : "ec04cbef07291cc963ea8a6bf90d032d9ee5a286",
        "msg" : "Dashboard greeting: salutation in the app language (en/de/es/ne), breadcrumb trail hidden on mobile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/components/dashboard/TerminalGreeting.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/partners/partners/create.vue",
          "app/pages/partners/partners/[id]/view.vue",
          "app/components/partners/PartnerForm.vue",
          "app/pages/partners/partners/[id]/edit.vue",
          "app/utils/pickCode.ts",
          "server/api/partners/partners/store.post.ts",
          "server/utils/pickIdentifier.ts",
          "server/api/partners/partners/update.put.ts",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "bf39545a21ccb81dd95647742beae472333d64ed",
        "timestamp" : 1789941163000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Business partner: Pick Code identifier (C_BPartner.PickProductIdentifier) — Nuxt UI select on the Fulfillment Customer tab, create/edit/view + store/update routes, shared pick-code resolver\u000a",
        "date" : "2026-09-20 23:52:43 +0200",
        "id" : "bf39545a21ccb81dd95647742beae472333d64ed",
        "msg" : "Business partner: Pick Code identifier (C_BPartner.PickProductIdentifier) — Nuxt UI select on the Fulfillment Customer tab, create/edit/view + store/update routes, shared pick-code resolver",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/components/partners/PartnerForm.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/partners/partners/[id]/edit.vue"
          },
          {
            "editType" : "add",
            "file" : "server/utils/pickIdentifier.ts"
          },
          {
            "editType" : "add",
            "file" : "app/utils/pickCode.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/partners/partners/update.put.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/partners/partners/[id]/view.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/partners/partners/create.vue"
          },
          {
            "editType" : "edit",
            "file" : "server/api/partners/partners/store.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/generate-shipments.vue",
          "app/pages/integrations/picklist-desktop.vue",
          "server/api/processes/inouts/[id]/index.get.ts",
          "app/utils/picklistPdf.ts",
          "app/pages/mobile/picklist.vue",
          "app/pages/mobile/generate-shipments.vue"
        ],
        "commitId" : "248df14cced048bc3f6139214a8684929db8e0aa",
        "timestamp" : 1789941163000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Picklists: merchant pick code — lines carry the org partner's identifier; PDF gets Org / Locator / Qty / Pick Code / Name order with a large pick code, whitespace-only org wrapping and smaller reference columns; digital lists highlight the partner code first, product PickListCode as fallback\u000a",
        "date" : "2026-09-20 23:52:43 +0200",
        "id" : "248df14cced048bc3f6139214a8684929db8e0aa",
        "msg" : "Picklists: merchant pick code — lines carry the org partner's identifier; PDF gets Org / Locator / Qty / Pick Code / Name order with a large pick code, whitespace-only org wrapping and smaller reference columns; digital lists highlight the partner code first, product PickListCode as fallback",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/processes/inouts/[id]/index.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/integrations/picklist-desktop.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/utils/picklistPdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/generate-shipments.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/picklist.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/generate-shipments.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/admin/users/leads.get.ts",
          "app/components/AgGrid.vue",
          "app/pages/users/leads/index.vue",
          "app/assets/langs/shared.js"
        ],
        "commitId" : "07e934be183c1c9f644eaf4b8cb261be0c1f9e73",
        "timestamp" : 1789941438000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Leads list: search + column filters, offer/contract filters, created / last activity / offer / contract columns (German dates), URL opens in a new tab; newest-first default kept\u000a",
        "date" : "2026-09-20 23:57:18 +0200",
        "id" : "07e934be183c1c9f644eaf4b8cb261be0c1f9e73",
        "msg" : "Leads list: search + column filters, offer/contract filters, created / last activity / offer / contract columns (German dates), URL opens in a new tab; newest-first default kept",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "server/api/admin/users/leads.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/users/leads/index.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/assets/langs/shared.js"
          },
          {
            "editType" : "edit",
            "file" : "app/components/AgGrid.vue"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.younex.de/user/info",
      "fullName" : "info"
    }
  ]
}