# Cash Sale → Register Shift Posting Foundation v32

## Contract

A captured POS payment can be posted to an open register shift only when:

- `payments.payments.method_type = cash`
- `payments.payments.status = captured`

The Payment domain field is `method_type`; v32.2 aligns the cash integration explicitly
with the v19 Payments schema contract.

## Posting effects

One successful posting atomically produces:

1. immutable `cash.movements` entry
2. immutable `cash.shift_entries` entry with `sale_cash`
3. increase in shift expected cash
4. `cash.sale_payment_postings` record

`cash.sale_payment_postings` has a unique `(tenant_id, payment_id)` contract, so one
captured cash payment can affect a shift only once.

## API

POST /api/v1/cash/sale-payments/{paymentId}/post-to-shift

Payload:
- register_id

## Foundation boundary

v32 remains explicit posting.

Automatic payment-capture integration belongs to the next cross-domain orchestration step,
preferably through a public application contract / transactional outbox rather than a
hidden Eloquent hook.
