- Import wizard: "Create missing products" (minimal M_Product, Value = SKU, asin, Amazon price, Strapi record) and "Import images from Amazon" (ASIN MAIN catalog picture, only when the product has no picture); result counters, pages of 40 with side effects - Per-row links to the Amazon offer page and the Seller Central offer editor (marketplace domain from the order source), "listed on Amazon" date label - DELETE listings/[id]: remove the SIS record + change history (409 while sending); row + bulk buttons - BOM rows: components with stock from pp_product_bom; internal qty = first component's on-hand, hover popover with all components - Relist reopens a "Closed" Amazon offer (purchasable_offer replace without end_at + qty) and is allowed for inactive listings; VALID preview results are non-blocking - Outbox: iDempiere Created/Updated are server-local with a literal Z -> serverLocalToIso() (IDEMPIERE_TZ); the debounce held every change for one UTC-offset hour before. Timer first run 10 s - Page layout: wider product column with fixed-width name, tighter numeric columns, toolbar and selection-bar buttons styled, lighter link icons
- adapters/shopify.ts: GraphQL Admin API 2025-10 for `shopify` (token) and `shopify-new` (client credentials) sources; one row per variant (variant / product / inventoryItem GIDs), import with available qty at the configured or first location, price via productVariantsBulkUpdate, qty via inventorySetQuantities (+ inventoryActivate), delist/relist as qty, create via productCreate + variant sku/price + publish; synchronous results settle as confirmed (PushResult.confirmed) and carry the assigned ids (PushResult.remote) - order-sources lists every source with a listings adapter (marketplace key + label); listings route returns marketplace + shop link data; create route handles Shopify (no ASIN, SKU key) - importer: index-aligned preview rows, external ids / meta / image URL per row, image import from the marketplace picture for non-Amazon sources (importImageFromUrlIfMissing) - page: order-source picker with marketplace icons, generic "Import listings", labels/columns/ links per marketplace (Buy Box, FBA, ASIN, min/max = Amazon only), BOM stat tile + filter - wizard: source picker with icon, BOM tag/filter/count, fixed-width name column, styled buttons; list-products modal: Shopify mode without ASIN/min/max, styled buttons
- adapters/shopware.ts: Admin API (integration client credentials against {marketplace_url}/oauth/token), one row per sellable product (variants inherit name/price/cover/tax from the parent), price patch replaces only the default-currency entry (net from the product tax rate), qty = stock, create via POST /product with storefront visibilities; synchronous confirm; registry maps Marketplace `shopware6` - GET listings accepts orderSourceId=a,b,c or all=1, enriches per org and returns per-source marketplace / link data; page: checkbox picker with "All order sources", Source column, per-row marketplace for labels, links, Buy Box cells, Send now across the selection; wizard keeps its own switchable source - Import wizard: "Only with ERP stock" (+ ERP qty column) and "Only active" filters, fixed-width name column - German date/time formatting (app/utils/sisDate.ts) on the page, wizard and history drawer - Brand-coloured MDI marketplace icons (Tabler 2.21 has no Shopify glyph) in picker, rows and wizard - Thumbnail @error fallback to the placeholder (a broken picture no longer stretches the row) - Styled modal buttons, aligned BOM tag in the wizard
- /materials/transactions-by-org: all M_Transaction rows of one org/warehouse in a date window, shared enrichment helper (transactionEnrichHelper) now also used by the product history route, inventory/movement document links, warehouse column, Excel/CSV/PDF export - /bi/shipping-performance: cut-off SLA per merchant (c_bpartner.CutOffTime, default 14:00, override), working days minus CUST_NonWorkingDays, Berlin timezone handling (berlinTime.ts), KPIs, month/day/hour/weekday/lateness charts, source table, order grid - sidebar + BI mega menu entries, en/de/es translations - recipe: iDempiere REST timestamp semantics (Created = Berlin local with fake Z)
Mobile return: DPD routing-barcode + multi-parcel scan lookup, partner-search overview, profile user line
- shipmentScanCandidates/shipmentScanFilter (app/utils/scanCode.ts): a DPD label scan is the 28-char routing code (% + postcode + 14-digit parcel no + service + country) while M_InOut stores only the parcel number; parcels 2..n live in trackingnoarray. Used by the mobile return page, the dashboard scan dispatcher and the desktop returns page. - Return page: external-RMA hit without InOut_ID offers the customer's shipments instead of 'not found' (standalone RMAs from the Amazon import); selection list shows positions (qty, name, SKU); detail shows all product identifiers, 2-line names, back-to-selection button; e-mail notification on by default. - /api/idempiere-auth/user was missing (profile modal showed no user data); cookie-based route added; 'Angemeldet als …' shown next to the app-update check.
Dashboard SameDay card: per-merchant cut-off from C_BPartner.CutOffTime (default 14:00)
prime-due-today computes each SameDay merchant's deadline from its own cut-off; the header counts down to the nearest upcoming deadline, org chips show the cut-off when merchants differ, tooltip lists all. Texts no longer hard-code 14:03.
nuxt generate boots Nitro in-process, so the listing-outbox plugin armed its setTimeout/setInterval inside the build and kept the process alive ("still running: 2 timers"); it would also have flushed the prod outbox from a dev machine. Gate on import.meta.prerender, unref the timers, recipe note in mobile/capacitor-app-build.md. Includes the app version bump 1.0.71 (code 72) left by the aborted release runs.
- adapters/ebay.ts: Sell Inventory API (inventory item → offer → listing; ListingKey = offerId, ExternalProductId = listingId, SKU as inventory id) + Trading API for listings never migrated to the Inventory API (GetMyeBaySelling with variations, ReviseInventoryStatus / EndFixedPriceItem / RelistFixedPriceItem); token JSON like the Laravel EbayTokenRepository, refreshed and written back to the order source; create via inventory item + offer + publish - immediate delivery: adapters flagged `immediate` (eBay, Shopify, Shopware) are flushed right after queueing from the put / delist / relist / create routes; Amazon keeps the batched outbox - page: "Details" toggle (internal price, marketplace qty, listed-on date hidden by default), internal qty right of the Qty field, copy buttons hidden, thumbnail click → centred medium-size popup, card layout ≤ 768 px with the same inputs and actions - MarketplaceIcon: Amazon from public/assets/brand/amazon-icon.png on a white tile
BI shipping performance: exclude stock-blocked orders (status 'No stock')
Orders that are not on time are checked against the historic stock of their item lines in the order's warehouse at the end of the deadline day (m_storage minus later m_transaction movements, direct Postgres, server/utils/bi/stockAtDeadline.ts). At least one short line -> status 'nostock', excluded from on-time/SLA/lateness/lead-time rates; ?nostock=include keeps the SLA status and only flags the row. Page: checkbox, grey chart series, filter button, 'Missing stock' column/CSV, warning tag when PG is unavailable. Measured on prod: 0.1-0.9 s per request for the stock check.