Skip to content

Changes

Started by timer
Started 1 mo 7 days ago
Took 1 min 7 sec on built-in

Summary

  1. Incoming invoices: searchable vendor picker, amount-based tax detection, learning that actually applies (details)
  2. Incoming invoices review: Nuxt UI selects, complete & next / back, review browsing, booked toast + animated counts (details)
  3. Incoming invoices: vendor filter / sort / grouping with review working set, meaningful confidence score, amount reconciliation (details)
  4. Recipes: incoming invoices inbox — live learned defaults, vendor matching, tax/amount rules, review flow, testing without booking (details)
  5. Banking: manual CAMT.052 file import for periods before EBICS (details)
  6. Lead page: keep Angebot + Vertrag visible, move the rest into a "Mehr" menu (details)
  7. Picklist report: larger type, ~double row height, bordered X/Y/Z locator chips, bold qty — one shared layout for normal, reprint, desktop and mobile (details)
  8. Dashboard: WarGames-style terminal greeting (time-of-day salutation + user name, VT323, type-in + blinking cursor) for admin roles, aligned with the first card (details)
  9. Dashboard greeting: for all roles, no background, animation once per login (type-in + 10 s cursor, then static) (details)
  10. Dashboard greeting: salutation in the app language (en/de/es/ne), breadcrumb trail hidden on mobile (details)
  11. 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 (details)
  12. 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 (details)
  13. 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 (details)
Commit e5fb5e19ca99490429a576155ff11950f17eb139 by info
Incoming invoices: searchable vendor picker, amount-based tax detection, learning that actually applies

Review screen
- vendor picker is a real searchable selection (remembered -> scored candidates -> all vendors of
  the org + org *); "use existing" is never disabled; same-named partners show VAT id / id
- vendor matching scored in Node (VAT id, fuzzy name, partner name tokens on the letterhead,
  e-mail domain) instead of contains(Name, <letterhead line>); own organization is never suggested;
  non-vendor partners are offered and flagged IsVendor on confirm
- learned defaults are resolved LIVE (new GET .../[id]/defaults): document fingerprint -> VAT id /
  IBAN -> layout tokens -> profiles of the selected partner -> the partner's last AP invoice;
  re-resolved when another partner is picked, manually changed fields are never overwritten.
  Fixes: e-invoices never got their profile, documents uploaded before the first confirmation
  never saw it, vat:/layout: key mismatch
- doc type / currency / tax are never empty (document currency, 381 -> AP credit memo, generic
  fallbacks); new cost type (charge) field, learned per vendor
- tax rate: only an e-invoice breakdown is authoritative, otherwise the amounts decide
  (gross == net -> 0 %); no more invented "19 % detected"; warning only when the rate is certain;
  a contradicting tax amount (misread year) is replaced; learned tax preferred among same-rate taxes
- dates shown and entered as dd.mm.yyyy (new DateInputDe), vendor match no longer blocks the page

Confirm
- gross == net means no VAT (a bogus tax amount no longer yields an 810 % rate); the chosen tax is
  kept when its RATE fits instead of being replaced by the first tax of that rate
- learns the EFFECTIVE doc type / currency, and VAT id / IBAN / partner name also in reuse mode
- new vendor address: country from the e-invoice ISO code, else the default country

Extraction
- no guessed tax rate; rate only next to a tax label or when consistent with the amounts;
  section 19 UStG / reverse charge / intra-community phrases -> 0 %; "Steuernummer"/"Tax ID" are
  no tax amounts
- tier 0 (ZUGFeRD/XRechnung) gets a layout signature too; signature tokens extended by file-name
  pattern and e-invoice XMP markers (fuzzy tokens only - learned layout hashes keep matching)
- sha256 file signature + duplicate-upload badge in list and review

Inbox list
- list view and the "ready to review" filter are the default
- action icons sit in fixed slots, a missing action leaves its slot empty
- period filter uses dd.mm.yyyy
The file was modifiedserver/utils/bankReconciliationSuggestions.ts (diff)
The file was modifiedserver/utils/inbox/fieldExtractors.ts (diff)
The file was addedserver/utils/inbox/vendorDefaults.ts
The file was modifiedserver/api/accounting/incoming-invoices/[id]/confirm.post.ts (diff)
The file was modifiedapp/assets/langs/shared.js (diff)
The file was modifiedserver/utils/inbox/inboxDb.ts (diff)
The file was modifiedserver/utils/inbox/layoutFingerprint.ts (diff)
The file was addedapp/utils/inboxTaxRate.ts
The file was modifiedapp/pages/accounting/incoming-invoices/index.vue (diff)
The file was modifiedserver/utils/inbox/vendorProfile.ts (diff)
The file was modifiedapp/components/accounting/inbox/InvoiceReview.vue (diff)
The file was modifiedserver/utils/inbox/extractPipeline.ts (diff)
The file was modifiedapp/components/accounting/inbox/InboxList.vue (diff)
The file was modifiedserver/utils/inbox/processDocument.ts (diff)
The file was addedapp/components/DateInputDe.vue
The file was addedserver/api/accounting/incoming-invoices/[id]/defaults.get.ts
The file was modifiedserver/api/accounting/incoming-invoices/match-vendor.get.ts (diff)
Commit 10b0c575f7a675c2b8f21559877718a2f9bc874f by info
Incoming invoices review: Nuxt UI selects, complete & next / back, review browsing, booked toast + animated counts

- review screen no longer uses tedir-select / ComboBox: doc type, currency, tax, cost type and the
  vendor picker run on the global SelectBox wrapper (USelectMenu); vendor options show VAT id /
  partner id as searchable subtext, cost type is clearable; triggers aligned with the Bulma inputs
- SelectBox wrapper: opt-in filterProps (search more than the label) and virtualize
- two booking buttons: "Complete & Back" (return to the inbox) and "Complete & Next" (rightmost,
  continues with the next document waiting for review; falls back to the inbox when none is left);
  reject is an icon button so the bar stays on one row
- browsing bar on top of the review (inbox / previous / position / next) - pure navigation, nothing
  is saved; new GET next-review returns the open ids in inbox order + the next id
- after booking the inbox shows a success toast (warning toast when completion failed / booked
  net) with an "open invoice" action; shared useInboxBookedToast, hand-off via useInboxJustBooked
- inbox status chips tween their counts and pulse with a floating +1 / -1 on every change
  (upload -> processing -> ready to review -> booked); the kept-alive inbox now refetches on
  re-activation; the just-booked row flashes; prefers-reduced-motion respected
The file was addedapp/composables/useInboxBookedToast.ts
The file was modifiedapp/assets/langs/shared.js (diff)
The file was addedserver/api/accounting/incoming-invoices/next-review.get.ts
The file was modifiedapp/composables/states.ts (diff)
The file was modifiedapp/pages/accounting/incoming-invoices/index.vue (diff)
The file was modifiedapp/components/SelectBox.vue (diff)
The file was modifiedapp/components/accounting/inbox/InboxList.vue (diff)
The file was modifiedapp/components/accounting/inbox/InvoiceReview.vue (diff)
Commit 285b6c4dd798b3b06091c9a7012d476762217e0a by info
Incoming invoices: vendor filter / sort / grouping with review working set, meaningful confidence score, amount reconciliation

Inbox list
- vendor facet filter with counts (same vendor = first segment of the letterhead line, ignoring
  case / punctuation / legal form; a learned profile name wins), sort select (last uploaded,
  invoice date, vendor, amount, recognition %) with direction, group-by-vendor headers
- default = no vendor filter, no grouping, last uploaded on top; sort/group are not remembered
  across visits; rows show the short vendor label
- opening a review from a filtered / re-sorted list stores that result set as the WORKING SET
  (useInboxReviewQueue + sessionStorage): the review's previous / next, the position counter and
  "complete & next" walk exactly that set in that order; a chip shows it and clears it; booked
  documents leave the set, an exhausted set returns to the inbox

Confidence badge
- was a plain average over ALL stored confidences, including internal helper keys with fixed
  heuristic values (currency 0.6, taxBasisTotal 0.5, taxes, isTaxIncluded 0.7) - a perfectly read
  document could not get past ~85-90 %. Now weighted over the fields a reviewer checks (number,
  date, vendor, net / tax / gross); amounts that add up are trusted, amounts that do not pull the
  score down, a missing key field counts as zero

Amounts
- net + tax must equal gross: when a value read from a LEARNED position breaks that (totals block
  floats with the number of line items - easybell: the "Netto" box landed on the VAT line and
  read 3,29 instead of 17,29 with confidence 1.0), the label-based reading is used or the odd one
  out is derived; done in the pipeline for new uploads and in the review for stored documents;
  hint under the totals when the amounts really do not add up
- such a position is forgotten on confirm and not learned again for the vendor (hint.floating);
  re-drawing the box by hand re-enables it
- learned regions yield the VALUE, not label + value: VAT id / IBAN by pattern
  ("USTIDDE249984363" -> DE249984363, "IBAN:DE35..." -> DE35...), money = last amount token
The file was modifiedapp/components/accounting/inbox/InvoiceReview.vue (diff)
The file was modifiedserver/utils/inbox/extractPipeline.ts (diff)
The file was addedapp/utils/inboxVendor.ts
The file was modifiedapp/pages/accounting/incoming-invoices/index.vue (diff)
The file was modifiedapp/utils/inboxTaxRate.ts (diff)
The file was modifiedapp/components/accounting/inbox/InboxList.vue (diff)
The file was modifiedserver/utils/inbox/vendorProfile.ts (diff)
The file was modifiedapp/assets/langs/shared.js (diff)
The file was modifiedserver/api/accounting/incoming-invoices/[id]/confirm.post.ts (diff)
The file was modifiedapp/composables/states.ts (diff)
Commit 33a4d37b433bc59301ed746093ec6b7216ee91d0 by info
Recipes: incoming invoices inbox — live learned defaults, vendor matching, tax/amount rules, review flow, testing without booking
The file was modifiedreference/recipes.md (diff)
Commit ae5839cc12876467da2bc3b4c76a80a5fdda2f70 by info
Banking: manual CAMT.052 file import for periods before EBICS

Adds "Datei importieren (CAMT.052)" to the Import tab of /accounting/banking:
upload the online-banking export (ZIP or XML) -> dry-run preview -> chunked
import with progress. Nuxt-only, no Laravel staging: statements are created
Drafted directly in iDempiere and appear in step 2 (reconcile).

- camt052Parser: fflate + fast-xml-parser, ISO-8859-1 aware, camt.052/053 in
  any .001.xx version; unpacks ZIPs completely (sub-folders, nested ZIPs,
  extension-less XML, macOS resource forks ignored). The Volksbank export is
  ONE report paginated over the whole period, so entries are split into one
  statement per booking day with a derived balance chain (verified against the
  daily closings of the MT940 export of the same period).
- bankFileImport: duplicate detection by the bank reference (AcctSvcrRef <->
  C_BankStatementLine.EftTrxID, the column the EBICS import fills), fallback
  date+amount+memo multiset; foreign same-day statements are never modified
  (conflict), own Drafted ones are resumed; balance-chain check against existing
  iDempiere statements; plan recomputed live before every write.
- Routes accounting/bank-file-import/{preview,import}; parsed uploads parked in
  data/bank-file-import (git-ignored, 24 h), originals archived on import.
- Reconcile statements list: $top 100 -> 500 (history imports).
- fast-xml-parser declared as a direct dependency (was optional transitive).
- MT940 / CSV / PDF deliberately unsupported (MT940 discontinued by DK 11/2025).
- Translations banking_file_* (en/de/es); sample bank exports git-ignored.
The file was modified.gitignore (diff)
The file was modifiedapp/assets/langs/shared.js (diff)
The file was addedserver/utils/banking/camt052Parser.ts
The file was addedapp/components/accounting/banking/BankFileImportModal.vue
The file was addedserver/api/accounting/bank-file-import/import.post.ts
The file was addedserver/api/accounting/bank-file-import/preview.post.ts
The file was modifiedapp/components/accounting/banking/BankImportTab.vue (diff)
The file was addedserver/utils/banking/bankFileImport.ts
The file was modifiedapp/pages/accounting/banking/index.vue (diff)
The file was modifiedpackage-lock.json (diff)
The file was modifiedserver/api/accounting/bank-reconciliation/statements.get.ts (diff)
The file was modifiedpackage.json (diff)
Commit 1c1bdadaece0a9a3cc7e3814ae7a17e6c915f739 by info
Lead page: keep Angebot + Vertrag visible, move the rest into a "Mehr" menu

The hero CTA row showed six coloured buttons. Only Angebot and Vertrag stay
visible; a "Mehr" dropdown on the right holds Fragebogen, Prognose, SEPA and
Onboarding (in that order, each with its icon/colour). Closes on outside
click, Escape and after picking an entry; full-width under the buttons on
small screens. The compact icon toolbar at the top is unchanged.
The file was modifiedapp/pages/users/leads/[id]/edit.vue (diff)
Commit 2ac713011b72609ee4c067905a6f7bf9bb0f10f9 by info
Picklist report: larger type, ~double row height, bordered X/Y/Z locator chips, bold qty — one shared layout for normal, reprint, desktop and mobile
The file was modifiedapp/pages/mobile/picklist.vue (diff)
The file was modifiedapp/pages/integrations/picklist-desktop.vue (diff)
The file was addedapp/utils/picklistPdf.ts
The file was modifiedapp/pages/generate-shipments.vue (diff)
The file was modifiedapp/composables/usePicklistPdf.ts (diff)
The file was modifiedapp/pages/mobile/generate-shipments.vue (diff)
Commit fd3f01982dcc34d670b3373940f185198e8fd139 by info
Dashboard: WarGames-style terminal greeting (time-of-day salutation + user name, VT323, type-in + blinking cursor) for admin roles, aligned with the first card
The file was addedapp/components/dashboard/TerminalGreeting.vue
The file was modifiednuxt.config.ts (diff)
The file was modifiedapp/pages/index.vue (diff)
The file was addedpublic/fonts/vt323-regular.woff2
The file was modifiedapp/assets/css/fonts.css (diff)
The file was modifiedapp/components/NewBreadCrumb.vue (diff)
Commit 3cc7c5852471fdc5dab977c1a3168b3311d2a79b by info
Dashboard greeting: for all roles, no background, animation once per login (type-in + 10 s cursor, then static)
The file was modifiedapp/pages/index.vue (diff)
The file was modifiedapp/components/dashboard/TerminalGreeting.vue (diff)
The file was addedserver/api/idempiere-auth/session-key.get.ts
Commit ec04cbef07291cc963ea8a6bf90d032d9ee5a286 by info
Dashboard greeting: salutation in the app language (en/de/es/ne), breadcrumb trail hidden on mobile
The file was modifiedapp/components/dashboard/TerminalGreeting.vue (diff)
The file was modifiedapp/assets/langs/shared.js (diff)
The file was modifiedapp/pages/index.vue (diff)
Commit bf39545a21ccb81dd95647742beae472333d64ed by info
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
The file was modifiedserver/api/partners/partners/store.post.ts (diff)
The file was modifiedserver/api/partners/partners/update.put.ts (diff)
The file was modifiedapp/pages/partners/partners/create.vue (diff)
The file was modifiedapp/assets/langs/shared.js (diff)
The file was modifiedapp/components/partners/PartnerForm.vue (diff)
The file was addedapp/utils/pickCode.ts
The file was modifiedapp/pages/partners/partners/[id]/view.vue (diff)
The file was addedserver/utils/pickIdentifier.ts
The file was modifiedapp/pages/partners/partners/[id]/edit.vue (diff)
Commit 248df14cced048bc3f6139214a8684929db8e0aa by info
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
The file was modifiedapp/utils/picklistPdf.ts (diff)
The file was modifiedapp/pages/mobile/picklist.vue (diff)
The file was modifiedserver/api/processes/inouts/[id]/index.get.ts (diff)
The file was modifiedapp/pages/integrations/picklist-desktop.vue (diff)
The file was modifiedapp/pages/generate-shipments.vue (diff)
The file was modifiedapp/pages/mobile/generate-shipments.vue (diff)
Commit 07e934be183c1c9f644eaf4b8cb261be0c1f9e73 by info
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
The file was modifiedserver/api/admin/users/leads.get.ts (diff)
The file was modifiedapp/components/AgGrid.vue (diff)
The file was modifiedapp/pages/users/leads/index.vue (diff)
The file was modifiedapp/assets/langs/shared.js (diff)