quick-rma: reuse an orphaned marketplace RMA only when it covers every receipt line (details)
quick-rma: create a fresh RMA next to a marketplace RMA that already authorizes a shipment line (details)
Per-customer DHL/DPD accounts with shared three-tier account resolvers (details)
Revert scanbot SDK files accidentally included in the previous commit (details)
SIS listings: sortable product name, own sortable article-number column, narrower channel column, BOM tag directly after the name (details)
SMS (Sales Management System): rename from SIS, purchase cost + marketplace fee + VAT pricing floor per listing (details)
amazon-stocks: follow the /api/sales/sms route rename (details)
SMS: shipping + packaging in the pricing floor (DHL/DPD contract rates incl. surcharges), column regroup, Buy Box removed (details)
SMS: hover popovers (header info, BOM, min-price calculation) as teleported UPopover hover cards so the table overflow no longer clips them (details)
SMS: DPD shipping in the pricing floor = contract price only (3,00 €); energy / fuel / toll / peak add-ons are opt-in env values defaulting to 0 (details)
SMS: DPD shipping per the myDPD G300 price list — base 3,00 € plus Maut 0,35 €, Sicherheitsgebühr 0,15 €, Energiezuschlag Straße and Emergency Fuel Surcharge (env defaults 31 % / 4,08 %) (details)
quick-rma: reuse an orphaned marketplace RMA only when it covers every receipt line
A completed Amazon-imported RMA on the shipment (e.g. 535011 / RMA 30595) was reused for the mobile customer return even when it had no line for a returned product; the receipt line then had neither M_RMALine_ID nor C_OrderLine_ID and iDempiere rejected it with 'Fill mandatory fields: Sales Order Line'. The line matching now lives in matchRmaLine and is run as a pre-check: if any receipt line stays unmatched, a fresh RMA is created instead of reusing the orphan.
quick-rma: create a fresh RMA next to a marketplace RMA that already authorizes a shipment line
Follow-up to 3e5766907. The fresh RMA for shipment 535011 was rejected with 'Amount to be returned is greater than the amount shipped': the Amazon RMA 30595 already authorizes both shipped HYDRO units, and iDempiere's MRMALine.checkQty sums every completed/closed RMA line on a shipment line (a completed RMA also takes no new lines).
quick-rma now collects the authorized qty per shipment line from CO/CL RMAs and creates such an RMA line without M_InOutLine_ID (product + qty, description notes the conflict); the receipt line still links to it via M_RMALine_ID. useReturnedQty attributes receipt lines of unlinked RMA lines to the shipment line by product (callers pass the shipment lines) so the remaining qty stays correct.
Per-customer DHL/DPD accounts with shared three-tier account resolvers
Labels, reprints, cancels, resets and tracking now pick the carrier account in one place per carrier (server/utils/dhlAccountResolver.ts, dpdAccountResolver.ts): order source with its own account → the org's business partner when "customer uses own account" is on and credentials are filled → LogYou main. Label creation is refused (422) for a flagged customer without credentials anywhere, so a manual order can no longer be labelled on the LogYou account by accident. Custom accounts get a Kleinpaket billing number; without it a qualifying parcel ships as V01PAK instead of a V62KP on the wrong procedure.
Partner create/edit/view and order-source create/edit/view carry the new fields with precedence explanations, tooltips and carrier icons (DE flag, globe, DHL Kleinpaket badge, DPD card). Partner saves invalidate the shared org-partner cache (orgPartnerCache.ts).
Also: the DHL cancel route no longer returns the account password to the browser, and dhlCustomHelper no longer shares one token cookie across different custom accounts.
SIS listings: sortable product name, own sortable article-number column, narrower channel column, BOM tag directly after the name
Also adds reference/test-scripts/ebay-listings-import-check.mts, a dry read of the eBay adapter import (one line per listing with its variant rows) used to confirm that variation listings are imported one row per SKU.
SMS (Sales Management System): rename from SIS, purchase cost + marketplace fee + VAT pricing floor per listing
- /sales/sis → /sales/sms (page, components SalesSms*, API /api/sales/sms/**, menu + lang labels; old URL = 301 stub) - shared/utils/sisPricing.ts: fee models (band / marginal tiers, fixed per order, min fee, extra fixed), minimal gross price solver (margin 0 after VAT, fees and purchase cost) and margin at a given price — used by server and page - server/utils/listings/feeModel.ts: eBay.de business fee schedule by top-level category (+0,35/0,45 € per order), Amazon.de referral fee by product type (apparel 5/10/15 % tiers, min 0,30 €) blended with a real fee estimate - sisMatching: purchase price list per org (IsSOPriceList=N), net purchase price of products and BOM components - listings GET: purchaseCost (BOM = Σ component price × QtyBOM), vatRate, feeModel, minPrice, marginAtTarget per row - eBay import: primary category path per listing via one cached GetItem (fee schedule key) - page: Purchase / Fees / Min. price columns (stacked cells, breakdown popover), current marketplace price under the Price input and internal qty under the Qty input (old marketplace-price / int-qty columns removed), two-line headers, sortable Source / Purchase / Fees / Price / Qty / Min. price, BOM tag right-aligned, SKU hidden when = article no.
SMS: DPD shipping per the myDPD G300 price list — base 3,00 € plus Maut 0,35 €, Sicherheitsgebühr 0,15 €, Energiezuschlag Straße and Emergency Fuel Surcharge (env defaults 31 % / 4,08 %)