Incoming invoices: vendor filter / sort / grouping with review working set, meaningful confidence score, amount reconciliation (details)
Recipes: incoming invoices inbox — live learned defaults, vendor matching, tax/amount rules, review flow, testing without booking (details)
Banking: manual CAMT.052 file import for periods before EBICS (details)
Lead page: keep Angebot + Vertrag visible, move the rest into a "Mehr" menu (details)
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)
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)
Dashboard greeting: for all roles, no background, animation once per login (type-in + 10 s cursor, then static) (details)
Dashboard greeting: salutation in the app language (en/de/es/ne), breadcrumb trail hidden on mobile (details)
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)
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)
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)
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
- 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
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
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.
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.
Dashboard: WarGames-style terminal greeting (time-of-day salutation + user name, VT323, type-in + blinking cursor) for admin roles, aligned with the first card
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