Skip to content

1.11.17

⚙️ Patch 1.11.17 — Penner/Renner Management + Invoice Gmail test downloads & Parfumzentrum

🚀 Summary

Renames Penner Management to Penner/Renner Management, adds a Renner Articles tab, and lets Base Articles reset penner/renner. On invoices: Gmail mapping Test can optionally download the invoice file (ephemeral), download as invoice renders the email to PDF, and Parfumzentrum has a special-case PDF download from the order link in the mail.

✨ Details

Area Behavior
Nav / page Penner/Renner Management; tabs: Sales · Penner Articles · Renner Articles
Renner Articles Same analytics as Penner (article_type=renner + pricing_history); chart insights for increase waves
Omni API GET /penner/articles, /insights, /sales accept article_type=penner\|renner; sort key last_reduction_date
Renner labels Columns: Increase Waves, Last Increase, Prices (Base → Current); sort chips default to Increases
Chart dialog Renner: Preiserhöhungen / Erhöhung N / Basis (Penner keeps reduction wording)
Base reset POST /articles/{sku}/reset-penner-renner — wipe article_type + pricing_history, set use_min_max_rules=true on Shopify/FBM/Kaufland/Otto/FBA, recalc all channels with force_min_max=True
Base UI Restart icon on penner/renner rows (confirm) → reset + reload
Gmail test download Mapping Test dialog: Also download invoice file → GET /gmail/test/{order_place}?download_invoice=true runs special-case / download-as-invoice / attachment path, returns the file, then deletes it on the server
Download as invoice Email body → PDF (Playwright; .eml only if conversion fails); applies to production download and test download
Parfumzentrum Special case: extract order link from mail → /pdf/?cf=… → PDF; mapping Ihre Bestellung NUMBER wurde versendet

📌 Notes

  • Redeploy service-omni, service-multi-repricer, service-invoice, and frontend.
  • Reset is for leaving wave mode deliberately; n8n may re-tag the SKU later.
  • API field names (reduction_waves, last_reduction_date) are unchanged; only Renner UI copy differs.
  • Test downloads are ephemeral (not kept under invoices/). Use the active Google credential that owns the mailbox for the mapping under test.

✅ Verify

  1. Nav → Penner/Renner Management → Renner Articles lists renner SKUs; sort by Increases / Last Increase works.
  2. Chart icon on a renner row shows Preiserhöhungen wording and price timeline.
  3. Base Articles → penner/renner chip row → Reset Penner/Renner → type and pricing history cleared; channel min/max rules on; prices recalculated.
  4. Penner Articles tab still shows Reduction Waves / Last Reduction.
  5. Invoices → Gmail Mappings → Test (e.g. Shebelin / Shein with download-as-invoice) → tick download → receive a valid PDF; server log shows ephemeral delete.
  6. Parfumzentrum mapping → Test with a shipped-order number + download → valid PDF from parfum-zentrum.de/.../pdf/?cf=….

📁 Files

  • frontend/src/pages/PennerManagement/ — index.jsx, Tabs/ArticlesTab.jsx, components/ArticleInsightsDialog.jsx
  • frontend/src/layouts/DashboardLayout/index.jsx
  • frontend/src/services/api/omni/pennermanagement.js
  • frontend/src/services/api/multi/repricer.js — resetPennerRenner
  • frontend/src/pages/MultiRepricer/Tabs/BaseArticles/BaseArticles.jsx
  • frontend/src/pages/Invoices/Tabs/SubTabs/GmailMappingsSubTab.jsx — test download checkbox
  • frontend/src/services/api/invoice/gmail.js — download_invoice / blob response
  • backend/service_omni/app/api/v1/endpoints/penner_management.py
  • backend/service_omni/app/services/penner_management_service.py — get_wave_articles
  • backend/service_multi-repricer/app/api/v1/endpoints/repricer_articles.py — reset_penner_renner
  • backend/service_invoice/app/api/v1/endpoints/gmail.py — ephemeral test download
  • backend/service_invoice/app/services/gmail.py — Parfumzentrum special case; email→PDF for download-as-invoice
  • backend/service_invoice/app/tests/test_parfumzentrum_special_case.py
  • backend/service_invoice/app/main.py — CORS expose Content-Disposition / X-Invoice-Filename
  • docs/docs/patchnotes/1.11/1.11.17.md — this file