<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.TimerTrigger$TimerTriggerCause'><shortDescription>Started by timer</shortDescription></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesorigindev _class='hudson.plugins.git.util.Build'><buildNumber>741</buildNumber><marked><SHA1>cc0ff592b5ae3cc181da2058102242fd926336b5</SHA1><branch><SHA1>cc0ff592b5ae3cc181da2058102242fd926336b5</SHA1><name>refs/remotes/origin/dev</name></branch></marked><revision><SHA1>cc0ff592b5ae3cc181da2058102242fd926336b5</SHA1><branch><SHA1>cc0ff592b5ae3cc181da2058102242fd926336b5</SHA1><name>refs/remotes/origin/dev</name></branch></revision></refsremotesorigindev></buildsByBranchName><lastBuiltRevision><SHA1>cc0ff592b5ae3cc181da2058102242fd926336b5</SHA1><branch><SHA1>cc0ff592b5ae3cc181da2058102242fd926336b5</SHA1><name>refs/remotes/origin/dev</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/erp-nuxt-frontend.git</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.younex.de/view/all/job/build-logship-frontend/lastStableBuild/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/view/all/job/build-logship-frontend/changes</changesUrl><displayUrl>https://jenkins.younex.de/view/all/job/build-logship-frontend/lastStableBuild/</displayUrl><testsUrl>https://jenkins.younex.de/view/all/job/build-logship-frontend/lastStableBuild/testReport</testsUrl></action><building>false</building><displayName>#741</displayName><duration>70605</duration><estimatedDuration>71602</estimatedDuration><fullDisplayName>build-logship-frontend #741</fullDisplayName><id>741</id><inProgress>false</inProgress><keepLog>false</keepLog><number>741</number><queueId>5746</queueId><result>SUCCESS</result><timestamp>1789776000766</timestamp><url>https://jenkins.younex.de/view/all/job/build-logship-frontend/741/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/amazonAds/importInvoice.ts</affectedPath><affectedPath>server/utils/amazonAds/parseInvoicePdf.ts</affectedPath><affectedPath>server/utils/amazonAds/adsApi.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/import.post.ts</affectedPath><affectedPath>reference/test-scripts/amazon-fee-parse.mjs</affectedPath><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>server/utils/amazonAds/types.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><affectedPath>nuxt.config.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/upload.post.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/status.get.ts</affectedPath><affectedPath>server/utils/amazonAds/parseSellerFeeInvoicePdf.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>9e5d44b9cb79373965ffd173001cf1268e6d3889</commitId><timestamp>1789723068000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: book seller fee invoices (Tax Document Library PDFs) next to Ads invoices

Amazon offers no API for the seller fee invoices in Europe (the SP-API Invoices
API is Brazil-only, no report type covers them), so the PDFs downloaded from
Seller Central are dropped on the existing Amazon invoices page.

- parseSellerFeeInvoicePdf.ts: text-layer parser (kind 'fee'), one line per fee
  type with its own VAT rate; runs before the Ads parser in the upload route
- vendor resolved by the issuer's VAT id, created under org * on first import
- own charge (AMAZON_FEE_CHARGE_ID, default 1000009 "Amazon Gebühren"), tax per
  line rate; credit notes are listed but not importable yet
- list route checks bookings across the Ads vendor and all fee vendors
- page: Type / Aussteller / Empfänger columns, second charge selector
</comment><date>2026-09-18 11:17:48 +0200</date><id>9e5d44b9cb79373965ffd173001cf1268e6d3889</id><msg>Amazon invoices: book seller fee invoices (Tax Document Library PDFs) next to Ads invoices</msg><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/import.post.ts</file></path><path><editType>edit</editType><file>nuxt.config.ts</file></path><path><editType>edit</editType><file>server/utils/amazonAds/importInvoice.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/status.get.ts</file></path><path><editType>edit</editType><file>server/utils/amazonAds/parseInvoicePdf.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/utils/amazonAds/types.ts</file></path><path><editType>add</editType><file>reference/test-scripts/amazon-fee-parse.mjs</file></path><path><editType>edit</editType><file>server/utils/amazonAds/adsApi.ts</file></path><path><editType>add</editType><file>server/utils/amazonAds/parseSellerFeeInvoicePdf.ts</file></path><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/upload.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/offers/conditions/index.post.ts</affectedPath><affectedPath>server/utils/offers/quotePdf.ts</affectedPath><affectedPath>app/pages/partners/partners/[id]/edit.vue</affectedPath><affectedPath>app/components/offers/QuoteModal.vue</affectedPath><affectedPath>server/utils/offers/quoteConfirmation.ts</affectedPath><affectedPath>app/components/offers/ForecastModal.vue</affectedPath><affectedPath>app/composables/useOfferQuote.ts</affectedPath><affectedPath>server/utils/offers/forecastPdf.ts</affectedPath><affectedPath>server/api/offers/forecast/preview.post.ts</affectedPath><affectedPath>server/utils/offers/offerConditions.ts</affectedPath><affectedPath>app/pages/users/leads/[id]/edit.vue</affectedPath><affectedPath>server/api/offers/quote/send.post.ts</affectedPath><affectedPath>server/api/offers/forecast/send.post.ts</affectedPath><affectedPath>app/composables/useOfferForecast.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>08ca7d5f074a1d4399860ffe4859350839a41e06</commitId><timestamp>1789726519000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Offers: custom forecast modal (scenarios, editable positions, PDF/send) + editable quote validity

Custom forecast ("Individuelle Prognose"): standalone cost forecast for leads and
partners, opened from a new "Prognose" button on both pages and from the quote
modal's forecast card (seeded from the live quote form). Seeds from the saved
custom forecast, else the saved quote conditions, else list prices. Every
position can be switched off, relabelled and re-priced (per order with factor or
% share, or per month), own positions added, up to 4 volume scenarios side by
side (3+ print landscape), display toggles for calculation column, unit prices,
subtotals, cost per order, yearly total and disclaimer. Save as draft
(offer_conditions.forecast), download, or e-mail with record attachment and
activity. Client computes, server only renders.

Quote validity: "Gültig (Tage)" and "Gültig bis" pair in the quote modal, default
7 days from now. One server resolver (resolveQuoteValidity) drives the PDF, the
e-mail text, the activity, the saved conditions and the confirmation link expiry.
</comment><date>2026-09-18 12:15:19 +0200</date><id>08ca7d5f074a1d4399860ffe4859350839a41e06</id><msg>Offers: custom forecast modal (scenarios, editable positions, PDF/send) + editable quote validity</msg><path><editType>add</editType><file>server/api/offers/forecast/preview.post.ts</file></path><path><editType>edit</editType><file>app/pages/users/leads/[id]/edit.vue</file></path><path><editType>edit</editType><file>app/components/offers/QuoteModal.vue</file></path><path><editType>edit</editType><file>server/api/offers/conditions/index.post.ts</file></path><path><editType>add</editType><file>server/api/offers/forecast/send.post.ts</file></path><path><editType>add</editType><file>server/utils/offers/forecastPdf.ts</file></path><path><editType>add</editType><file>app/composables/useOfferForecast.ts</file></path><path><editType>edit</editType><file>app/pages/partners/partners/[id]/edit.vue</file></path><path><editType>edit</editType><file>server/utils/offers/offerConditions.ts</file></path><path><editType>edit</editType><file>server/utils/offers/quotePdf.ts</file></path><path><editType>edit</editType><file>app/composables/useOfferQuote.ts</file></path><path><editType>edit</editType><file>server/api/offers/quote/send.post.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>add</editType><file>app/components/offers/ForecastModal.vue</file></path><path><editType>edit</editType><file>server/utils/offers/quoteConfirmation.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>server/api/accounting/amazon-ads/booking.get.ts</affectedPath><affectedPath>server/utils/amazonAds/importInvoice.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><commitId>7c40ce743ed6563a2b58c00f358be5d811025e38</commitId><timestamp>1789729923000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: document details, paid vs created status, Lexoffice reset, pinned actions

- "Beleg in" column (org · vendor) + details dialog per created AP invoice
  (new booking.get.ts: header, payment/Lexoffice state, lines with charge + tax)
- status no longer says "Verbucht" for a merely created document: "Beleg erstellt
  · Zahlung offen" until iDempiere has the invoice allocated to a payment
  (IsPaid) → "Bezahlt"; separate counters
- Lexoffice reset for selected rows and from the details dialog (shared
  /api/invoices/lexoffice-reset), with a confirm that the voucher in Lexoffice
  is not deleted
- actions column pinned right, status/document columns moved left, API notice
  collapsed by default, PDF icon fixed (ti-pdf)
</comment><date>2026-09-18 13:12:03 +0200</date><id>7c40ce743ed6563a2b58c00f358be5d811025e38</id><msg>Amazon invoices: document details, paid vs created status, Lexoffice reset, pinned actions</msg><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path><path><editType>edit</editType><file>server/utils/amazonAds/importInvoice.ts</file></path><path><editType>add</editType><file>server/api/accounting/amazon-ads/booking.get.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/amazonAds/importInvoice.ts</affectedPath><affectedPath>server/api/invoices/so.get.ts</affectedPath><affectedPath>server/utils/amazonAds/parseSellerFeeInvoicePdf.ts</affectedPath><affectedPath>app/pages/sales/invoices/index.vue</affectedPath><affectedPath>server/api/accounting/opos/index.get.ts</affectedPath><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>server/utils/amazonAds/types.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><commitId>8aac736389fbef7e2d88535f9f39bc7b296c4eb9</commitId><timestamp>1789731297000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: recognise fee credit notes and book them as AP CreditMemo

- parser: "STEUERGUTSCHRIFT" template (Gutschriftennummer, Ausstellungsdatum /
  Zeitraum der Gutschrift), amounts with the sign before the currency
  ("-EUR 2.61"), "Ursprüngliche Rechnungsnummer" → originalInvoiceNo
- import: credit notes become a vendor credit memo — doctype DocBaseType APC
  (AP CreditMemo) with positive amounts, reference to the original invoice in
  the description; no longer refused
- OPOS + /sales/invoices: doctype 1000006 counts as customer-side only when the
  partner is flagged IsCustomer, so genuine vendor credit memos stay on the
  payables side (existing customer credit notes unchanged)
</comment><date>2026-09-18 13:34:57 +0200</date><id>8aac736389fbef7e2d88535f9f39bc7b296c4eb9</id><msg>Amazon invoices: recognise fee credit notes and book them as AP CreditMemo</msg><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path><path><editType>edit</editType><file>server/utils/amazonAds/importInvoice.ts</file></path><path><editType>edit</editType><file>server/utils/amazonAds/types.ts</file></path><path><editType>edit</editType><file>server/api/invoices/so.get.ts</file></path><path><editType>edit</editType><file>app/pages/sales/invoices/index.vue</file></path><path><editType>edit</editType><file>server/api/accounting/opos/index.get.ts</file></path><path><editType>edit</editType><file>server/utils/amazonAds/parseSellerFeeInvoicePdf.ts</file></path><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/AgGrid/AgCopyEmail.vue</affectedPath><affectedPath>app/components/AgGrid/AgDialPhone.vue</affectedPath><affectedPath>app/pages/users/leads/index.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>9779bba8ea83bac8745a1d1a8386e89c2a9a1135</commitId><timestamp>1789731297000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Leads list: dial icon aligned to the right edge, copy button on the e-mail column

- AgDialPhone: number stays left, only the dial button is pushed to the right
  (shared renderer — also applies to the users / external users lists)
- new AgCopyEmail cell renderer: copy-to-clipboard button with check-mark
  feedback, does not start the inline editor
</comment><date>2026-09-18 13:34:57 +0200</date><id>9779bba8ea83bac8745a1d1a8386e89c2a9a1135</id><msg>Leads list: dial icon aligned to the right edge, copy button on the e-mail column</msg><path><editType>edit</editType><file>app/pages/users/leads/index.vue</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>add</editType><file>app/components/AgGrid/AgCopyEmail.vue</file></path><path><editType>edit</editType><file>app/components/AgGrid/AgDialPhone.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/dashboard/RecentCallsCard.vue</affectedPath><affectedPath>app/components/telephony/BlacklistControl.vue</affectedPath><affectedPath>server/api/telephony/blacklist.post.ts</affectedPath><affectedPath>server/api/telephony/blacklist.get.ts</affectedPath><affectedPath>app/components/DialButton.vue</affectedPath><affectedPath>server/utils/telephony/blacklist.ts</affectedPath><affectedPath>server/api/telephony/blacklist.delete.ts</affectedPath><commitId>c8fb1add4aec93b10d32265652cff746fddd349b</commitId><timestamp>1789732626000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Recent calls card: blacklist control moved into the number popover, with live status and unblock

- no per-row block button any more (it cost a column of width); clicking the
  number opens the popover, which now shows the FreePBX blacklist status and
  either "Nummer sperren" (two-step confirm) or "gesperrt · Entsperren"
- new TelephonyBlacklistControl, used inside the dial popover (DialButton
  show-blacklist) and in the card's own popover for sessions that cannot dial
- server: blacklist status read via AMI DBGet (one session for the ≤ 10 numbers
  of a page), unblock via DBDel; GET + DELETE /api/telephony/blacklist. An
  unexpected AMI error is "status unknown", never a false "not blocked"
- blocked numbers are marked red with a ban icon in the list
</comment><date>2026-09-18 13:57:06 +0200</date><id>c8fb1add4aec93b10d32265652cff746fddd349b</id><msg>Recent calls card: blacklist control moved into the number popover, with live status and unblock</msg><path><editType>add</editType><file>app/components/telephony/BlacklistControl.vue</file></path><path><editType>edit</editType><file>app/components/dashboard/RecentCallsCard.vue</file></path><path><editType>edit</editType><file>server/api/telephony/blacklist.post.ts</file></path><path><editType>add</editType><file>server/api/telephony/blacklist.delete.ts</file></path><path><editType>edit</editType><file>server/utils/telephony/blacklist.ts</file></path><path><editType>edit</editType><file>app/components/DialButton.vue</file></path><path><editType>add</editType><file>server/api/telephony/blacklist.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>server/utils/amazonAds/parseSellerFeeInvoicePdf.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>b2d24d604b14700496f0d0ebc1f53dd8a3358015</commitId><timestamp>1789732626000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: recognise the 2025 fee-invoice template, label the charge boxes as import settings

- parser: 2025 labels (Rechnungsnr, Name des Anbieters / Verkaeufers, Adresse /
  UStID des Anbieters) plus a label-independent fallback for supplier name and
  VAT id, so the next rename by Amazon does not break recognition
- page: the two charge selectors are grouped as "Import-Einstellung · Kostenart
  für neue Belege (kein Filter)" with an explanatory tooltip
</comment><date>2026-09-18 13:57:06 +0200</date><id>b2d24d604b14700496f0d0ebc1f53dd8a3358015</id><msg>Amazon invoices: recognise the 2025 fee-invoice template, label the charge boxes as import settings</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/utils/amazonAds/parseSellerFeeInvoicePdf.ts</file></path><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><commitId>7b3ffcb02f1a492cae8e96636728f270a769594e</commitId><timestamp>1789733700000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: quick filters, optional date range, collapsed import settings, square upload box

- quick-filter chips with counts: Typ (Ads / Gebühren / Gutschriften), Beleg
  (ohne / erstellt / bezahlt), Lexoffice (noch nicht hochgeladen / hochgeladen);
  totals follow the filter ("1 von 3")
- no date filter by default; the optional invoice-date range sits behind a quiet
  "Zeitraum" button, reloads on change, and an upload widens it so new invoices
  are never hidden. The Ads API call keeps a bounded 12-month window server-side
- the two cost-type selectors are collapsed behind "Import-Einstellungen" with a
  one-line summary and an info box (what they do, why two, not a filter, when to
  change); the panel opens by itself when a cost type is missing
- upload area is a square drop box on the right with drag feedback and keyboard
  support
</comment><date>2026-09-18 14:15:00 +0200</date><id>7b3ffcb02f1a492cae8e96636728f270a769594e</id><msg>Amazon invoices: quick filters, optional date range, collapsed import settings, square upload box</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/accounting/amazon-ads/booking.get.ts</affectedPath><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>786df63b6cc3a86132f1f9a056fec00574c6943a</commitId><timestamp>1789734174000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: show voided documents properly, match them by POReference

- a voided invoice row names its Storno document ("Storniert #&lt;id&gt; · erneut
  importierbar"), opens its details (banner + link to iDempiere's reversal
  document, no Lexoffice reset), has its own row tint, a "Storno-Beleg" action,
  a "Storniert" quick-filter chip and a counter; it no longer counts as
  "Ohne Beleg (neu)"
- list route: documents are matched to the Amazon invoice by POReference (full
  number) instead of DocumentNo — the void rename '&lt;no&gt;-VOID-&lt;id&gt;' is truncated
  to the 30-char column ('DE-AEU-2025-2978769' → 'DE-AEU-2025-29787-VOID-…'),
  so a voided document was not recognised; reversal documents are flagged and
  listed after the original
</comment><date>2026-09-18 14:22:54 +0200</date><id>786df63b6cc3a86132f1f9a056fec00574c6943a</id><msg>Amazon invoices: show voided documents properly, match them by POReference</msg><path><editType>edit</editType><file>server/api/accounting/amazon-ads/booking.get.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/accounting/amazon-ads/document.get.ts</affectedPath><affectedPath>reference/ci/deploy-production.sh</affectedPath><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>bcd4de9387b784591e675d94d2d83cd354b63cb6</commitId><timestamp>1789737288000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: iDempiere is the source of truth for booked invoices, PDFs from the document attachment

The page's list lived only in data/amazon-ads.db, which was missing from the
deploy script's preserve list — every deploy wiped it, so booked invoices
vanished from the page (the documents themselves were never affected).

- list route: every Amazon invoice that HAS a document is rebuilt from iDempiere
  (AP documents of the Amazon vendors, found by vendor flag + name; key =
  POReference; kind from the vendor, credit note from the doctype, period from
  the description). The local store only adds uploads that are not imported yet
  plus parsed details / PDF cache
- document route: without a local copy the ORIGINAL PDF attached to the
  iDempiere document is served (&amp;cInvoiceId=); the page passes the document id
- rows rebuilt from iDempiere are labelled (Quelle "iDempiere", PDF "Anhang");
  a voided one asks for the PDF to be uploaded again before re-import
- deploy script: amazon-ads.db + data/amazon-ads/ added to the preserve lists
  (must be pasted into the Jenkins job to take effect)
</comment><date>2026-09-18 15:14:48 +0200</date><id>bcd4de9387b784591e675d94d2d83cd354b63cb6</id><msg>Amazon invoices: iDempiere is the source of truth for booked invoices, PDFs from the document attachment</msg><path><editType>edit</editType><file>server/api/accounting/amazon-ads/document.get.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path><path><editType>edit</editType><file>reference/ci/deploy-production.sh</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/accounting/amazon-ads/upload.post.ts</affectedPath><affectedPath>server/utils/amazonAds/invoiceStore.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/document.get.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/status.get.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/import.post.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/void.post.ts</affectedPath><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><commitId>bcd159169e2557be05d88bbad7d54b88e7c038cf</commitId><timestamp>1789741744000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: store uploads in the iDempiere table CUST_AmazonInvoiceInbox (PDF in Strapi)

- new invoiceStore.ts: one async storage API with two backends — the iDempiere
  table (row via REST, PDF attached in Strapi) and, only as a fallback when the
  table is not reachable, the old SQLite file
- upload / list / import / void / document routes use it; the upload route reads
  the multipart body once and retries with a refreshed token
- rows still in the SQLite file are moved over when the page loads (bounded,
  idempotent, fail-soft; imported rows keep their PDF on the c_invoice document,
  pending rows get their PDF uploaded to Strapi). A run where nothing can be
  written pauses for 10 minutes instead of retrying on every load, and rows that
  are not in the table yet stay visible and importable from the local file
- status/list responses report the active backend
</comment><date>2026-09-18 16:29:04 +0200</date><id>bcd159169e2557be05d88bbad7d54b88e7c038cf</id><msg>Amazon invoices: store uploads in the iDempiere table CUST_AmazonInvoiceInbox (PDF in Strapi)</msg><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/import.post.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/void.post.ts</file></path><path><editType>add</editType><file>server/utils/amazonAds/invoiceStore.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/document.get.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/status.get.ts</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/upload.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><commitId>f5a4b95955cba38382c3ac8c7cc1ffae1e2654e7</commitId><timestamp>1789742168000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: keep inbox rows consistent with iDempiere's documents (self-heal)

On each list load an inbox row whose document exists but is not linked (imported
on another host / before the table existed) gets status 'imported' + the link;
a row that still points to a voided or missing document is released. Bounded,
fail-soft, idempotent — the page itself reads the documents and never depends on it.
</comment><date>2026-09-18 16:36:08 +0200</date><id>f5a4b95955cba38382c3ac8c7cc1ffae1e2654e7</id><msg>Amazon invoices: keep inbox rows consistent with iDempiere's documents (self-heal)</msg><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/accounting/BankLineMatchModal.vue</affectedPath><affectedPath>app/components/accounting/banking/BankReconcilePanel.vue</affectedPath><affectedPath>server/utils/bankReconciliationSuggestions.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>d6003a7b7ccaba8faa27e1d466fff5d221e8dd67</commitId><timestamp>1789742659000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Bank reconciliation: suggestions need at least 2 matching criteria, fuzzy names, date signal, score ranking

- a candidate is only suggested when at least 2 of 4 criteria match: document
  number, amount, partner (IBAN or name count as one) and date. On the current
  33 open statements all 47 old invoice suggestions rested on a single signal
- new date signal: statement line date −5 … +60 days around the invoice date
- fuzzy partner names: umlauts spelled out, accents stripped, legal forms and
  filler words ignored, prefix matches, brand word, brand inside run-together
  text or the remittance text ("AMAZON PAYMENTS EUROPE S.C.A." matches "Amazon EU
  S.à r.l., Niederlassung Deutschland"; "Deutsche Bank" does not match
  "Deutsche Post")
- ranking by score, best first (doc no. 50 · amount 30 · IBAN 25 / name 10–25 ·
  date closeness 0–15); up to 8 candidates per line
- match dialog: top 3 + "weitere anzeigen", date chip, n/4 criteria, best-match
  marker, top candidate preselected; list pill shows "+n" and a criteria tooltip
</comment><date>2026-09-18 16:44:19 +0200</date><id>d6003a7b7ccaba8faa27e1d466fff5d221e8dd67</id><msg>Bank reconciliation: suggestions need at least 2 matching criteria, fuzzy names, date signal, score ranking</msg><path><editType>edit</editType><file>app/components/accounting/banking/BankReconcilePanel.vue</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/utils/bankReconciliationSuggestions.ts</file></path><path><editType>edit</editType><file>app/components/accounting/BankLineMatchModal.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><commitId>6e71fb22714beae7d74a7a44353b11faad234015</commitId><timestamp>1789743036000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: report the PDF as available when it sits on the iDempiere document

Rows migrated from the local file (and rows rebuilt from documents) carry no file
of their own — their original PDF is the document's attachment. The list flagged
them as "no PDF" although the link works; they now show "Anhang".
</comment><date>2026-09-18 16:50:36 +0200</date><id>6e71fb22714beae7d74a7a44353b11faad234015</id><msg>Amazon invoices: report the PDF as available when it sits on the iDempiere document</msg><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/accounting/amazon-ads-invoices/index.vue</affectedPath><affectedPath>server/api/accounting/amazon-ads/import.post.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>87678796cc3032e2763f178f8e4731c10c6ed9b2</commitId><timestamp>1789744764000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: confirm every import with the cost type shown, no remembered cost types

12 fee invoices were booked to "Werbekosten": the page remembered the last
selection of each cost-type box in the browser and a stale value silently
overrode the correct default.

- cost types are no longer stored in the browser (old keys are removed); every
  page load starts from the server defaults (Ads → Werbekosten, fees/credit notes
  → Amazon Gebühren); a deviation is flagged (amber summary, reset to default)
- every import goes through a confirmation dialog that groups the invoices by
  type, shows the cost type each group will be booked to (changeable there, the
  default is marked, a deviation is highlighted) and lists already booked ones as
  skipped. It opens on "Ausgewählte importieren" and right after an upload
  ("jetzt importieren" / "Später")
- the import result names the cost type that was used per invoice
</comment><date>2026-09-18 17:19:24 +0200</date><id>87678796cc3032e2763f178f8e4731c10c6ed9b2</id><msg>Amazon invoices: confirm every import with the cost type shown, no remembered cost types</msg><path><editType>edit</editType><file>server/api/accounting/amazon-ads/import.post.ts</file></path><path><editType>edit</editType><file>app/pages/accounting/amazon-ads-invoices/index.vue</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/accounting/amazon-ads/invoices.get.ts</affectedPath><commitId>267e7becbfac41d14dbd209d510b958cf7628124</commitId><timestamp>1789745316000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: match documents by the full number in the description (POReference is 20 chars)

The first credit-memo import showed that POReference cannot carry the key: the
column is 20 chars, so 'DE-CN-AEU-2026-134720' (21) is stored as
'DE-CN-AEU-2026-13472' — the new AP CreditMemo was not recognised as the credit
note's document and the self-heal released its inbox row ('voided').

The importer's description starts with the FULL Amazon number on every document
(active, voided rename, iDempiere's reversal), so that is the primary match key
now; DocumentNo / POReference remain the fallback for documents not created by
the importer. No double booking was possible — the importer's duplicate guard
checks the full DocumentNo.
</comment><date>2026-09-18 17:28:36 +0200</date><id>267e7becbfac41d14dbd209d510b958cf7628124</id><msg>Amazon invoices: match documents by the full number in the description (POReference is 20 chars)</msg><path><editType>edit</editType><file>server/api/accounting/amazon-ads/invoices.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/amazonAds/importInvoice.ts</affectedPath><commitId>cc0ff592b5ae3cc181da2058102242fd926336b5</commitId><timestamp>1789745741000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Amazon invoices: book the exact VAT from the PDF when a line-level purchase tax exists

Amazon rounds the VAT down (74,66 × 19 % → 14,18), iDempiere half-up (14,19); with
the document-level "19% Mwst." the VAT is recomputed at completion, so 3 of 15
documents ended up one cent above the Amazon total.

iDempiere keeps a manually entered line TaxAmt on purchase documents whose tax
rate is NOT document level. The importer now prefers such a rate (purchase,
IsDocumentLevel = N) and writes the VAT from the PDF on each line (per-line VAT
for fee invoices, proportional for Ads campaigns, remainder on the largest line).
Without such a rate nothing changes — except that a difference between the booked
total and the Amazon document is now reported as a warning instead of going unnoticed.
</comment><date>2026-09-18 17:35:41 +0200</date><id>cc0ff592b5ae3cc181da2058102242fd926336b5</id><msg>Amazon invoices: book the exact VAT from the PDF when a line-level purchase tax exists</msg><path><editType>edit</editType><file>server/utils/amazonAds/importInvoice.ts</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName><id>info</id></culprit></freeStyleBuild>