Quote: shelf S + new shelf prices, optional cut-off time, return rate, sortable requirements
- Storage: new Fachbodenregal S (30×60×40 cm, 3,50 €); M now 4,50 €, L 6,50 € (list prices + floors). Saved pre-S quotes still on the old list prices (3,50 / 5,50) are lifted to the new ones; negotiated prices stay. S quantity in quote + contract modals, forecast and storage summaries. - Note under the storage table: one SKU per storage location. - Optional cut-off time (default off / 14:00): meta-card row + Hinweise sentence; persisted in offer_conditions.quote.cutoff. - Annahmen: shows the return rate; "Onboarding & Setupkosten" without "(IT-Support)". - Customer requirements sortable (drag handle + up/down arrows). - Quote modal: form area fills the space between header and footer via a flex chain instead of a fixed calc() height, so the bottom (Freitexte) is no longer clipped.
Telephony: read PBX cdr.calldate as Europe/Berlin wall time (calls showed 2 h late)
FreePBX/MariaDB (time_zone = SYSTEM = CEST) stores calldate as local wall time; the mysql2 pool read it with timezone 'Z', shifting every call on the dashboard "Letzte Anrufe" card and in the call-recordings list by the Berlin offset. DATETIME/TIMESTAMP columns are now converted via typeCast from Berlin wall time to the real instant (DST-safe; overridable via runtimeConfig.pbxCdr.timezone).
Dashboard/tickets: make the leads column and ticket detail usable on mobile
The dashboard's right column (latest leads, non-working-days calendar, returns, missing products) and the ticket detail's reference column were <aside> elements. public/css/styles.css styles every bare `aside` as the app sidebar and, at <=991px, turns it into a fixed off-canvas drawer (translateX(-100%)), so both columns vanished on phones. They are plain <div>s now.
Dashboard ticket clicks on screens <=1024px open the full-page ticket route directly instead of bouncing through the split-view list, and MyTicketDetail gets a phone layout: stacked toolbar with full-width action buttons, "Weitere Aktionen" as a bottom sheet, viewport-sized chat bubbles, 16px composer font (no iOS focus zoom) and wrapping composer actions.