Skip to content

1.8.20

⚙️ Patch 1.8.20 — Package mappings CSV, SFTP & L1–L5 types

🚀 Summary

  • Package types are now XS, S, M, L1, L2, L3, L5, XL (no generic L; each type has its own cost).
  • CSV upload under Base Articles → Package Mappings (columns Artikelname, GTIN, Name, Wert; tab or comma). File is stored as uploaded_files/package_mappings.csv on the shared File Manager volume.
  • SFTP connection sub-tab: host, port, user, password (Fernet-encrypted), directory path; test connection + require exactly one CSV in that folder.
  • Base repricer refreshes the CSV from the active SFTP credential (if configured), then assigns packages by GTIN from CSV first, else weight-based fallback.
  • Package changes now mark channel details as update_needed (except OOS) and force a min/max recalculation before export; UVP article bounds remain fixed during recalculation.
  • Otto UVP: monitoring is allowed (sale price within UVP min/max); recalculation never rewrites those min/max bounds, including after buy-price changes.
  • Qogita Discord targets-met: ping once when catalog hits target; re-ping only if catalog price drops below the last alerted price (no duplicate same-price pings).
  • Analysis page: sidebar entry with Metabase dashboard embed and a lean, period-based article KPI table with sales-stat details.
  • Otto SPA ads: daily SKU/date costs and ordered units are retained for period-accurate sales statistics; Sync Ads supports custom date ranges and automatically splits ranges into 90-day reports.

✨ Details

CSV Wert → package type

Wert example Package type Notes
BOX-XS-3/4 XS Trailing number ignored
BOX-S-* S Trailing number ignored
BOX-M-* M Trailing number ignored
BOX-L-1 L1 Number matters
BOX-L-2 L2 Number matters
BOX-L-3 L3 Number matters
BOX-L-5 L5 Number matters
BOX-XL-* XL Trailing number ignored
NO-BOX (none) Clears package_type / cost

Assignment order (base sync / assign_packages)

  1. Match article EAN/GTIN against CSV → type + cost from cost mappings
  2. Else weight floor match on package mappings (optional min_weight)
  3. Else default S

UI (Package Mappings sub-tabs)

Sub-tab Purpose
Cost mappings CRUD for type → cost; optional minimum-weight fallback threshold
CSV upload Upload / download / status
SFTP connection Persist credentials, test, manual refresh

🔧 Deploy

  1. Apply SQL:
-- docker/postgres/updates/package_mappings_csv_sftp_xl.sql
-- docker/postgres/updates/qogita_last_targets_met_alert_price.sql
-- docker/postgres/updates/qogita_last_targets_met_alert_price.sql
-- docker/postgres/updates/otto_ad_daily.sql

Migrates legacy *-Paket / L → new types (L-Paket/LL1), makes min_weight nullable, creates package_mapping_sftp_credentials. Qogita SQL adds last_targets_met_alert_price (backfills currently-met rows so existing alerts are not re-sent).

  1. Redeploy service-multi-repricer (installs paramiko), service-omni, and the frontend.
  2. Configure one cost row per package type you use (especially L1/L2/L3/L5).
  3. Upload CSV and/or save an active SFTP credential with the remote directory that holds the single CSV (e.g. /srv/data/jtl-package-export).
  4. Run a base repricer sync once to verify assignment.

📚 Docs