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)
- Match article EAN/GTIN against CSV → type + cost from cost mappings
- Else weight floor match on package mappings (optional
min_weight)
- 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
- 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/L → L1), 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).
- Redeploy service-multi-repricer (installs
paramiko), service-omni, and the frontend.
- Configure one cost row per package type you use (especially L1/L2/L3/L5).
- 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).
- Run a base repricer sync once to verify assignment.
📚 Docs