Skip to content

1.11.1

βš™οΈ Patch 1.11.1 β€” Penner UI pagination, Otto band enforce, Google Ads invoices, PennerRenner Decider

πŸš€ Summary

  • Penner Management β€” Articles & Sales use server-side search/sort/filters with 100/page pagination (fixes β€œsort hides search hits”).
  • Otto monitor β€” Harder penner/renner band enforce: sale outside [min, max] unpauses/reactivates; adapt_price clamps sale/my price into the band first.
  • Invoices β€” Optional Google Ads multi-upload under Manual platform invoices (yellow when empty; included in ZIP when present; does not block Buchhaltung).
  • n8n PennerRenner β€” Decider no longer promotes sold-out Penners to Renner (stock=0 β†’ false ratio 1 β†’ +2% price hikes). Published on n8n.
  • Infra β€” Higher default memory for n8n + runners (compose).

✨ Details

Penner Management (omni + frontend)

Area Before After
Articles Client filter on a 200/10k page API search, stock_age_bucket, sort_*, skip/limit (≀200)
Sales Client filter on full payload Same pagination + search
Stock chips Counted from loaded page only stock_age_counts from API (search-scoped)
Sort chips Re-fetched a different page Sort only; search still finds the SKU

Otto Β· sale outside min/max

Area Behavior
Pre-monitor Reactivate when sale_price < min or > max (non-UVP)
Skip override Paused + Otto wave history + sale outside band β†’ still monitored/unpaused
adapt_price Clamp sale (and my_price above max) before competition logic
Same-run re-pause Reactivated SKUs passed into pause_items_if_needed

Invoices Β· Google Ads

Platform key Required Multi-upload Portal
google_ads optional yes Ads billing

Empty β†’ yellow / optional chip; accounting email still ready without it. Files under invoices/google_ads/{year}/{month}/.

n8n Β· PennerRenner Decider

Bug Fix
stock=0 + any sales β†’ (sales-stock)/(sales+stock)=1 β†’ renner β†’ +2% waves (e.g. B07H72MDCW on 19.08) Keep prior penner/renner when stock≀0; leave penner only if sales>50

Workflow: PennerRenner (published). False 2026-08-19 bumps need a one-off SQL restore from that day’s pricing_history snapshot (see ops notes).

Infra Β· n8n memory

Service Heap default mem_limit default
n8n 12β€―GB 16β€―g
runners 24β€―GB 28β€―g

πŸ“Œ Notes

  • Redeploy service-omni, service-multi-repricer, service-invoice, frontend.
  • Recreate n8n / n8n-runner containers if Portainer still overrides old mem env.
  • PennerRenner Decider is already published on n8n β€” no compose redeploy needed for that fix.
  • After false Renner day: preview/fix affected SKUs (restore bounds from pricing_history date 2026-08-19, set article_type=penner, status=update_needed), then re-export channels.

πŸ“š Docs

πŸ“ Files

  • frontend/src/pages/PennerManagement/Tabs/{ArticlesTab,SalesTab}.jsx
  • frontend/src/pages/PennerManagement/components/PennerTablePagination.jsx
  • backend/service_omni/app/api/v1/endpoints/penner_management.py
  • backend/service_omni/app/services/penner_management_service.py
  • backend/service_multi-repricer/app/services/article_status.py
  • backend/service_multi-repricer/app/services/otto/otto_service.py
  • backend/service_multi-repricer/app/api/v1/endpoints/otto_articles.py
  • backend/service_invoice/app/services/manual_platform_invoices.py
  • frontend/src/pages/Invoices/Tabs/SubTabs/DownloadSubTab.jsx
  • docker-compose.yml Β· docker-compose-portainer.yml
  • n8n workflow X4H4XzirBPXWry0W (Decider)
  • docs/docs/patchnotes/1.11/1.11.1.md β€” this file