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¶
- Nav → Penner/Renner Management → Renner Articles lists renner SKUs; sort by Increases / Last Increase works.
- Chart icon on a renner row shows Preiserhöhungen wording and price timeline.
- Base Articles → penner/renner chip row → Reset Penner/Renner → type and pricing history cleared; channel min/max rules on; prices recalculated.
- Penner Articles tab still shows Reduction Waves / Last Reduction.
- Invoices → Gmail Mappings → Test (e.g. Shebelin / Shein with download-as-invoice) → tick download → receive a valid PDF; server log shows ephemeral delete.
- 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.jsxfrontend/src/layouts/DashboardLayout/index.jsxfrontend/src/services/api/omni/pennermanagement.jsfrontend/src/services/api/multi/repricer.js—resetPennerRennerfrontend/src/pages/MultiRepricer/Tabs/BaseArticles/BaseArticles.jsxfrontend/src/pages/Invoices/Tabs/SubTabs/GmailMappingsSubTab.jsx— test download checkboxfrontend/src/services/api/invoice/gmail.js—download_invoice/ blob responsebackend/service_omni/app/api/v1/endpoints/penner_management.pybackend/service_omni/app/services/penner_management_service.py—get_wave_articlesbackend/service_multi-repricer/app/api/v1/endpoints/repricer_articles.py—reset_penner_rennerbackend/service_invoice/app/api/v1/endpoints/gmail.py— ephemeral test downloadbackend/service_invoice/app/services/gmail.py— Parfumzentrum special case; email→PDF for download-as-invoicebackend/service_invoice/app/tests/test_parfumzentrum_special_case.pybackend/service_invoice/app/main.py— CORS exposeContent-Disposition/X-Invoice-Filenamedocs/docs/patchnotes/1.11/1.11.17.md— this file