Roll-off deliveries, swaps, weight tickets, and pickups all use dedicated cards on the driver's Job Detail screen. Everything on this page is optimized for a truck cab and a landfill scale house: one tap where possible, offline-safe photo capture, and no forms that lose data if you lose signal.
If you're the office-side reader, the billing model lives in the Roll-Off Swap Cycle Workflow; the dispatcher page lives in Roll-Off Rentals Page.
---
RJ-1: The Four Job Types You'll See
| Card | When it appears | What it captures |
|---|---|---|
| Roll-Off Delivery Card | Job type = delivery on a roll-off product | Confirm the unit dispatch reserved, or override; placement photo; GPS pin |
| Swap Completion Card | Job type = swap | Outgoing unit; incoming unit (or "same container returned"); disposition (yard vs shop) |
| Weight Ticket Card | Any job attached to a rental term | Gross/tare/net tons; ticket #; disposal site; ticket photo |
| Pickup / Return | Job type = pickup or return | Weight ticket only, no swap picker |
The cards live inside the Job Detail modal, tap a job on your Today list, scroll to the card labeled for its type.
---
RJ-2: Roll-Off Delivery Card
Dispatch reserves a specific container for your delivery, but the yard doesn't always hand you that exact one. This card handles both cases in one tap:
One-tap confirm: if you're taking the reserved unit, tap Confirm and go.
Override: if you're taking a different container of the same product type: tap Change unit, search by item code (like `#1019`) or scroll the list (only units of the same product type appear), tap the unit you're actually delivering, then tap Confirm.
Both paths let you take a placement photo (uploads immediately if online, queues to your device if offline) and drop the GPS pin, which happens automatically when you confirm; the placement pin gets linked to the specific container you delivered.
What happens after Confirm: the delivery completes. The `rental_terms` row for this term flips from `scheduled` to `active`. The unit id (`product_item_id`) is stamped onto the term so every subsequent swap/pickup on this term knows which physical container is on site.
---
RJ-3: Swap Completion Card
A swap is the driver taking the full container away and dropping an empty one at the same address. Card layout:
Outgoing unit: the container being pulled off site. The picker only shows units currently deployed at this customer.
Incoming unit: the empty going in. Same picker style, searchable by item code, only shows available units of matching product type.
"Same container returned" switch: the most common roll-off swap, dump the container, come back and drop the SAME one. Toggle the switch and both outgoing/incoming pickers collapse, the card knows no exchange happened, and inventory movement is a no-op.
Disposition of the pulled unit: Available (default), the pulled container is going back to the yard, ready for the next delivery. Or Maintenance, the container needs shop attention; it's routed to Workshop instead of back into rotation.
"No charge" switch: for warranty or damage-related swaps where the customer isn't billed. The inventory movement still happens; the term's charges stage at $0.
Weight ticket confirmation: if the rental term bills tonnage (has an overage rate) and no weight ticket has been saved for this job yet, tapping Complete pops a confirmation: "Complete swap without a weight ticket?" Cancel takes you to the Weight Ticket card; Continue completes the swap with no overage line and the office can add the weight later.
What happens after Complete: the swap completes. The inventory movement (outgoing off, incoming on) runs in one transaction. The term stays `active`, the container on site just changed identity.
---
RJ-4: Weight Ticket Card
Appears on every job attached to a rental term (delivery, swap, pickup). Landfills are dead zones, so the whole card is offline-first.
Two ways to enter the net (billable) weight: Gross + Tare (enter both, the Net field auto-fills with gross minus tare, matches how scale tickets are printed), or Net directly (some tickets print only the net; enter it in the Net field). The Net field is what bills, it can be edited even after gross/tare are set.
Other fields: Ticket # (the scale ticket number, for reconciliation with the disposal facility); Disposal site (dropdown of the org's configured disposal sites, see Disposal Sites; if the list is empty, you'll see "No disposal sites configured," the office needs to add them in Settings before you can select one); Ticket photo (Camera button, opens the phone camera directly).
Save Weight Ticket: Online, POSTs to the job's weight-ticket endpoint, which stores the weights, ticket #, photo URL, and disposal site AND re-runs the roll-off charge computation server-side (tonnage overage, day overage, disposal passthrough). Office invoicing picks up the numbers untouched. Offline, the whole request is queued in the offline outbox with the photo saved to IndexedDB. When you're back online, the app replays it with the real Storage URL for the photo.
If the job is already invoiced (unusual), the save succeeds but no re-pricing happens. A toast says "Weight ticket saved, charges unchanged" and the office can manually adjust the invoice if needed.
---
RJ-5: Pickup Jobs
Pickups use the Weight Ticket card only, there's no swap picker because nothing goes back on site. Tap Save Weight Ticket, then Complete Job.
When the pickup completes, the rental term flips to `completed` and: the rental base line re-tiers for the actual duration (if the customer picked up 15 days late or 5 days early, the tier math updates); the term goes on the Completed tab of the office's Roll-Off Rentals page; the Generate Final Invoice button becomes available on the term row.
If the customer's not ready and you have to leave without picking up, don't complete, mark the job as unable/rescheduled and dispatch will re-cut it.
---
RJ-6: Offline Behavior
Every card is offline-safe. Landfills and construction sites are notorious dead zones, this is a first-class scenario, not an edge case.
Watch for the "queued" indicator in the top-right of the app when working in a dead zone; it goes green once everything's synced.
---
RJ-7: Troubleshooting
"The Weight Ticket card isn't showing on my job."
The job isn't attached to a rental term. Weight tickets only appear on term jobs, a one-off delivery not tied to a rental term skips this card. Confirm with dispatch that the job was created via the roll-off flow.
"The disposal site dropdown is empty."
No disposal sites are configured for your org. Ask the office to add them: Settings → Disposal Sites → + Add. Once added they appear in the dropdown immediately (no refresh needed).
"The swap picker doesn't show any incoming units."
The picker only offers available units of the SAME product type as the outgoing container. If no 20-yard boxes are available in the yard, none show. Coordinate with dispatch on a different vehicle or box.
"I tapped Complete on the swap and got a 'no weight ticket' warning."
The rental term bills tonnage and no weight is saved yet. Two options: Cancel to open the Weight Ticket card first (recommended if you have the ticket), or Continue to complete the swap with no overage line. Office can add the weight later, the pull will re-price on the next recompute.
"My photo uploaded but the office says they can't see it."
Check that the app has processed the outbox, look for the sync chip in the top-right. If it's still red or amber, wait for connectivity to stabilize or force a sync from Settings.
"The gross/tare auto-fill isn't updating my Net."
The formula requires gross to be greater than or equal to tare and both to be numeric. Double-check the values, a typo blocks the calculation.
---
