Skip to content

1.11.6

βš™οΈ Patch 1.11.6 β€” Otto special SKUs, Analysis all-time, SQLModel naive datetimes

πŸš€ Summary

  • Otto sync / product fetch β€” SKUs containing % (and DE decimals like 0,5%) no longer break Otto Market product lookups.
  • Analysis β€” Period selector gains All time (no date window on sales/returns/ads queries).
  • Otto monitor β€” OAuth token refresh works again after SQLModel’s timezone-aware datetime default.

✨ Details

Otto SKUs with % / ,

Area Behavior
Problem Path GET /v5/products/{sku} returns HTTP 400 when the SKU contains % (percent-encoding clash).
Fix Use GET /v5/products?sku=… with the SKU percent-encoded (% β†’ %25, , β†’ %2C).
Comma trap Do not append an empty &sku= for comma SKUs β€” that produced a trailing comma in Otto’s self-link and empty productVariations.
Fallback If still not found and the SKU contains ,, retry once with , β†’ . (e.g. 0,5% β†’ 0.5%).
Quantity Path quantity calls encode % the same way; other SKUs (e.g. SonyPlaystation5Pro(2)) keep the original path endpoints.

Analysis β€” All time

Area Behavior
UI Period β†’ All time on Analysis articles and the sales-stats dialog.
API days=0 means no from/to filter on order/retour/ad queries.
Custom Custom from/to still capped at 365 days.
Otto ads SPA ad rollups remain ~90 days; warning shown for All time / long windows.

SQLModel naive datetimes

Area Behavior
Failure UPDATE otto_credentials … Datetime values must have timezone information
Cause Naive Berlin get_berlin_time() vs SQLModel 0.0.45+ UTCDateTime default
Fix sa_type=DateTime(timezone=False) / shared naive type on Otto credentials, related detail timestamps, Plenty credentials

No Postgres migration β€” columns were already timestamp without time zone.

πŸ“Œ Notes

  • Redeploy service-multi-repricer and refresh the frontend.
  • If a % SKU still reports β€œProduct not found on Otto”, confirm the exact seller SKU in Otto Seller Hub.

πŸ“ Files

  • backend/service_multi-repricer/app/services/otto/otto_service.py
  • backend/service_multi-repricer/app/services/article_stats.py
  • backend/service_multi-repricer/app/api/v1/endpoints/article_stats.py
  • backend/service_multi-repricer/app/services/otto/otto_ads_daily.py
  • backend/service_multi-repricer/app/core/datetime_types.py
  • backend/service_multi-repricer/app/schemas/otto.py
  • backend/service_multi-repricer/app/schemas/repricer_articles.py
  • backend/service_multi-repricer/app/schemas/otto_pricing_history.py
  • backend/service_multi-repricer/app/schemas/plenty.py
  • backend/service_multi-repricer/app/tests/test_otto_naive_datetime.py
  • frontend/src/pages/Analysis/AnalysisArticles.jsx
  • frontend/src/pages/MultiRepricer/components/ArticleSalesStatsDialog.jsx
  • frontend/src/pages/MultiRepricer/hooks/useArticleSalesStats.js
  • docs/docs/patchnotes/1.11/1.11.6.md β€” this file