# 0024. The quote request is a sidebar, not a cart

- **Status:** Accepted
- **Date:** 2026-08-08

## Context

Asking for a quote meant building a session list: add a unit, add another, go to `proposal-request/index`,
fill in a form, submit. The client's own reading of the funnel was that the cart step costs more visitors
than the multi-unit case is worth — almost every request was for one unit anyway — and that the sibling
Molino site's contact sidebar converts better.

The list itself is described by [ADR 0016](0016-session-backed-comparison-and-offer-lists.md), which also
covers the comparison list. Only the offer half is in question here.

## Decision

A quote request is made from a **contact sidebar** available on every page: a floating button that loads
`contact/sidebar` on first click and shows four sections — contact details, quote request, callback,
message. Submitting the quote section creates a `ProposalRequest` with **exactly one** `ProposalRequestItem`
plus the selected add-on services.

Anything with a `.-sidebar-<section>` class opens it, so the storage cards, the product page and the
header/footer menu items all lead to the same form.

The cart-like flow is **parked, not deleted**. Its URL rules are gone and `ProposalRequestController`
throws a 404 from `beforeAction()`; the controller, the service, the view and the Encore entry stay in the
repository.

## Alternatives

- **Delete the cart outright.** Rejected: the client asked to keep the option of bringing it back, and the
  session list is also the only multi-unit path that exists.
- **Leave the routes and only hide the UI.** Rejected after measuring: the URL manager falls back to plain
  route parsing when no rule matches, so `/proposal-request/add?id=…` kept writing the session list.
- **A modal instead of a sidebar.** Rejected for consistency with Molino, where the sidebar already carries
  four sections and the pattern is proven.

## Consequences

- **Every new quote request has one item.** The offer document, the rental conversion and the admin screens
  were written for a list and still work, but nothing produces multi-item requests any more.
- The visitor never leaves the page they were reading, and the same form serves the whole site.
- `Offer` now has two sources of items — `storageId` when the sidebar sets it, the session list otherwise —
  which is what keeps the parked page working if it is ever revived.
- Reading `ProposalRequestController` without noticing `beforeAction()` gives a false picture of what is
  reachable.
- ADR 0016 still holds for the comparison list; its offer half is superseded by this record.
