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.shand 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.pybackend/service_tickets/app/tests/test_plenty_reply_payload.pybackend/service_invoice/app/services/gmail.pybackend/service_invoice/app/services/failed_invoice_uploads.pybackend/service_invoice/app/api/v1/endpoints/download.pybackend/service_invoice/app/tests/services/test_failed_invoice_uploads.pyfrontend/src/services/api/invoice/download.jsfrontend/src/pages/Invoices/Tabs/SubTabs/DownloadSubTab.jsxdocker/invoice/entrypoint.shdocker-compose.ymldocker-compose-portainer.ymlhetzner-deployment/docker-compose.https.ymlscripts/filebrowser-enable-write.shdocs/docs/infrastructure/file_manager.mddocs/docs/services/service_invoice/endpoints/download.mddocs/docs/patchnotes/1.10/1.10.5.md— this file