Contract Statuses
Each contract has a 3-letter status (for example qte for Quoted, rat for Ratified). That status drives what you can do next in SMART and SMART 2.0.
At a glance
- 8 codes total:
qteQuoted,lrLot Reserved,lcLot Reservation Cleared,accAccepted,ratRatified,sivSold Inventory,cloClosed,canCancelled. - The big one is
ratRatified — it locks the plan to the lot, generates the schedule, queues POs, and starts BC postings. sivis auto-only — it’s how an inventory contract steps aside when a buyer ratifies on the same lot.canmeans different things on a buyer’s contract vs. an inventory contract — buyer cancel preserves the build and creates a new auto inventory contract; inventory cancel zeros everything out.
The full cheat sheet
Section titled “The full cheat sheet”| Code | Name | Lot.Status while here | Plan locked? | Schedule built? | POs out? | BC posting? |
|---|---|---|---|---|---|---|
| qte | Quoted | s For Sale |
no | no | no | no |
| lr | Lot Reserved | s + Reserved=1 |
no | no | no | no |
| lc | Lot Reservation Cleared | back to s |
no | no | no | no |
| acc | Accepted | m Accepted (sale)p/v/w (inventory) |
no — chosen options live on lot but plan not yet locked | no | no | no (today) |
| rat | Ratified | f Sold (or i Sold-Contingent if any open contingency); inventory unchanged |
yes — Lot.PlansID set, planratified=1 |
yes — Estimate runs next batch; LotSelectionActivity rows generated | yes — TransmissionPOGenerate rows queue |
yes — TransmissionContractRatify, TransmissionDeposit rows queue |
| siv | Sold Inventory | unchanged (the sale contract owns the lot) | was already locked from the original ratify | was already built | was already out | continues |
| clo | Closed | c Closed |
locked, immutable | frozen | frozen | TransmissionContractPostClosing + commission posting |
| can | Cancelled | sale → p Production Inventory; inv → z Not Available |
buyer cancel: kept (auto inv contract takes over). Inv cancel: PlansID=NULL |
buyer cancel: kept. Inv cancel: deleted | buyer cancel: kept. Inv cancel: deleted | TransmissionContractCancel (sale only) |
Transition map
Section titled “Transition map” ┌──────────────────────┐ │ │ qte ──► lr ──► lc ──► qte │ │ │ │ │ │ └─► acc ◄┘ ▼ │ │ [siv] ◄── ratify takeover │ ├─► (back to qte = unaccept) ▲ │ │ │ │ ▼ │ │ rat ──► clo │ │ │ ▲ │ │ │ └── unclose (CSR script) │ │ │ │ │ └─► can ──► (inventory contract auto-created at rat) ──────┘ ▲ └── uncancel (CSR script) ──► back to qte/acc/ratWhat each transition triggers
Section titled “What each transition triggers”The cheat sheet above tells you what state things are in. The table below tells you which proc moves you between states and what audit code lands in ContractTransLog. For full step-by-step internals see Contracts.
All transitions with driver proc and audit code
| Transition | Driver proc | Lot effect | Audit code |
|---|---|---|---|
qte → acc (sale) | spProcessContractAccept | Lot → m Accepted | S01 |
qte → acc (inventory) | spProcessContractAccept | Lot → p/v/w per AvailabilityType | F06 |
acc → qte | spProcessContractAccept (reverse) | Lot back to s (or stays p if plan locked) | S06 / F07 |
acc → rat (sale, no contingency) | spProcessContractRatify | Lot → f Sold; PlansID locked; ProcessEstimate=1 | S02 |
acc → rat (sale, contingency) | spProcessContractRatify | Lot → i Sold-Contingent; rest same | S02 |
acc → rat (inventory, initial) | spProcessContractRatify | Lot ProdRatifiedDate set; PendingStatus=‘pstart’; ProcessEstimate=1 | F01 |
rat → siv | spProcessContractRatify (sister) | none | F11 “Inventory Sold” |
rat → clo | spProcessContractClose | Lot → c Closed; CloseDate set | S09 |
rat → can (sale) | spProcessContractCancel | Lot → p; auto inventory contract created at rat | S05 |
rat → can (inventory) | spProcessContractCancel | Lot → z; PlansID=NULL; estimate deleted | F02 |
clo → rat | Unclose a contract.sql (CSR) | Lot back to f; CloseDate=NULL | manual |
When a contract status surprises you
Section titled “When a contract status surprises you”A contract’s status can lag behind reality if a Process row got stuck or a WorkLotProcess row didn’t clean up. The two queries below tell you whether you’re looking at a stuck batch or a real status mismatch.
Find stuck batch processes (Process Monitor query)
SELECT TOP 50 ProcessSysID, ProcessName, Status, ErrorDesc, ProcessStart, ProcessEndFROM dbo.ProcessWHERE Status <> 'Completed'ORDER BY ProcessStart DESC;Visible in SMART → Administration → Process Monitor.
Find lock rows that block further status changes on a lot
SELECT * FROM dbo.WorkLotProcessWHERE ProjectID=@p AND BuildingID=@b AND UnitID=@u;Delete those rows (with approval) and retry the operation.