1.9.1
âď¸ Patch 1.9.1 â Analysis 1:1 bundles & fast qty sort; Sentry triage¶
đ Summary¶
- Analysis: 1:1 bundle aliases are detected correctly, rolled into the live parent SKU, and shown as chips in the table and sales-stats dialog; sales/return qty sort uses a fast SQL path.
- Qogita (
LAGE-DASHBOARD-57,9,58): production was missinglast_targets_met_alert_price; omni now applies the column + backfill on startup (create_allcannot alter existing tables). - Plenty Sheets (
LAGE-DASHBOARD-5A,59):@retry_on_429was ineffective because 429s were wrapped asHTTPException(400)before retry; metadata / values / updates now re-raise 429 for exponential backoff. - Multi-repricer (
LAGE-DASHBOARD-56): enablepool_pre_ping+pool_recycleto recover stale Postgres connections.
⨠Improvements¶
Analysis â 1:1 bundles & qty sort¶
| Area | Behavior |
|---|---|
| Detection | Live parent lists historical SKUs in child_skus; each alias with bundle_packages exactly [{sku: parent, quantity: 1}] is a 1:1 link (qty ⼠2 ignored). |
| KPI rollup | Alias sales / returns / profit / ads merge into the parent for the selected period. |
| Table | Parent row shows chips for all linked SKUs (one_to_one_linked_skus); rolled-up qty/profit columns. |
| Sales stats dialog | Same linked-SKU chips; KPIs include alias sales for the chosen window. |
| Fast sort | Sorting/filtering by sales_qty or retour_qty ranks via SQL aggregates (+ 1:1 rollup), then fee-aware stats only for the current page. |
| API | GET /articles/analytics and sales-stats responses expose is_one_to_one_bundle, one_to_one_linked_skus, one_to_one_component_sku. |
Example: RitualsJingGeschenkSetM2025 with children âŚM2024 / âŚ2023M that package back to M2025 qty 1 â both aliases appear on the M2025 row and their sales count toward its KPIs.
Sentry triage run â 23.07.2026¶
| Issue | Root cause | Fix |
|---|---|---|
| LAGE-DASHBOARD-57 | Watchlist cron selected missing column | Startup ensure_qogita_watchlist_columns |
| LAGE-DASHBOARD-9 | Same column on Qogita webhook | Same |
| LAGE-DASHBOARD-58 | Same column on Keepa price cron | Same |
| LAGE-DASHBOARD-5A | Sheets append â metadata 429 wrapped | Re-raise 429 + retry decorator |
| LAGE-DASHBOARD-59 | Sheets ensure headers â metadata 429 | Same |
| LAGE-DASHBOARD-56 | Stale DB connection on articles list | pool_pre_ping / pool_recycle |
đ§ Deploy¶
- Redeploy service-multi-repricer + frontend (Analysis 1:1 + fast qty sort; DB pool).
- Redeploy service-omni (schema patch runs on startup; optional manual SQL still OK:
docker/postgres/updates/qogita_last_targets_met_alert_price.sql). - Redeploy service-plenty.
- Confirm Qogita watchlist / Keepa crons stop erroring; Sheets bulk updates survive brief quota spikes.
â Verify¶
- Analysis: open a 1:1 parent (e.g. Jing Geschenkset M2025) â chips for linked aliases; sales qty includes alias sales; sort by Sales qty / Return qty is responsive.
- Sales stats dialog on that SKU â same linked chips + rolled-up KPIs.
pytest backend/service_multi-repricer/app/tests/test_article_stats.py- Omni logs:
Added qogita_watchlist_items.last_targets_met_alert_price(or skip if already present). pytest backend/service_omni/app/tests/test_schema_patches.pyPYTHONPATH=app;<repo>/backend pytest backend/service_plenty/app/tests/test_sheets_retry.py
â ď¸ Notes¶
- Analysis table uses a 10-minute localStorage cache â hit Refresh after deploy to see 1:1 chips.
- Manual SQL from 1.8.20 remains valid and idempotent with the Qogita startup patch.
Files touched¶
service-multi-repricer
app/services/article_stats.pyâ 1:1 resolve/rollup, fast qty SQL sortapp/api/v1/endpoints/article_stats.pyâ analytics + sales-stats linked-SKU fieldsapp/core/database.pyâpool_pre_ping/pool_recycleapp/tests/test_article_stats.py
frontend
src/pages/Analysis/AnalysisArticles.jsxâ 1:1 chips in tablesrc/pages/MultiRepricer/components/ArticleSalesStatsDialog.jsxâ linked SKUs in dialog
service-omni
app/core/schema_patches.pyapp/main.pyapp/tests/test_schema_patches.py
service-plenty
app/services/sheets.pyapp/tests/test_sheets_retry.py
docs
docs/docs/patchnotes/1.9/1.9.1.md