Skip to content

1.10.5

⚙️ Patch 1.10.5 — Otto ticket replies, Zalando off, File Manager write, failed invoice uploads

🚀 Summary

Service tickets · Otto replies now include the latest inbound Otto email HTML after the new reply text when posting to Plenty POST /rest/messages. Otto requires that the original email content is not deleted or overwritten; without the quoted inbound body, replies fail to process correctly. Non-Otto marketplaces stay draft-only.

Service invoice · Zalando no longer routes through the Playwright login/download special case. Zalando invoices with is_special_case fall through to standard attachment download (same as unknown special-case handlers). Playwright helpers remain in the codebase for a later re-enable.

File Manager can create / move / rename / delete under invoices, reports, and eval: compose runs file-manager as root (aligned with Portainer), and service-invoice entrypoint recursively grants group write + setgid on those volumes. Helper script enables Filebrowser admin create/delete permissions when the UI still returns Forbidden.

Failed invoice uploads — Download Management has a section above Manual platform invoices to upload single files or a folder into invoices/{year}/{month}/. Filenames are recorded in that month’s eval JSON as submitted_subsequently (duplicate names skipped). Google Sheets is not updated. Re-running the download preserves this list in the eval file.

✨ Details

Area Behavior
Tickets · Otto detect Recipient / target / history email contains otto.market
Tickets · Otto message HTML New reply paragraphs + latest inbound email body + hidden Conversation ID
Tickets · history source Conversation history already loaded in create_reply_message
Tickets · skip Shop outbounds (from.type == user) and older inbounds
Tickets · fallback No inbound HTML → draft-only + warning log
Tickets · non-Otto Unchanged draft-only HTML wrapper
Invoice · Zalando case "zalando" removed from _handle_special_case → standard attachments
File Manager · container user: "0:0" on local + Hetzner compose (same as Portainer)
File Manager · volumes Entrypoint recursive root:1000 + dirs 2775 + files g+rw on invoices/reports/eval
File Manager · app perms scripts/filebrowser-enable-write.sh grants admin create/rename/modify/delete
Invoice · failed uploads Store in Shopping-Table folder; eval submitted_subsequently; no Sheets writes

📌 Notes

  • Redeploy service_tickets, service_invoice, and recreate file-manager.
  • Otto: send a reply on an existing Otto conversation and confirm Plenty accepts the payload (history from the latest inbound notification is present in message).
  • Zalando: if DB settings still have is_special_case=True, expect a “No special case handler” warning and standard Gmail attachment handling until settings are updated.
  • File Manager still Forbidden after recreate? Run bash scripts/filebrowser-enable-write.sh and clear any Deny rules under Settings → Rules. See File Manager.
  • Failed uploads: select ZIP year/month → Failed invoices → Upload file(s) or folder.

📁 Files

  • backend/service_tickets/app/services/plenty/plenty_manager.py
  • backend/service_tickets/app/tests/test_plenty_reply_payload.py
  • backend/service_invoice/app/services/gmail.py
  • backend/service_invoice/app/services/failed_invoice_uploads.py
  • backend/service_invoice/app/api/v1/endpoints/download.py
  • backend/service_invoice/app/tests/services/test_failed_invoice_uploads.py
  • frontend/src/services/api/invoice/download.js
  • frontend/src/pages/Invoices/Tabs/SubTabs/DownloadSubTab.jsx
  • docker/invoice/entrypoint.sh
  • docker-compose.yml
  • docker-compose-portainer.yml
  • hetzner-deployment/docker-compose.https.yml
  • scripts/filebrowser-enable-write.sh
  • docs/docs/infrastructure/file_manager.md
  • docs/docs/services/service_invoice/endpoints/download.md
  • docs/docs/patchnotes/1.10/1.10.5.md — this file