Skip to content

Lots & the Lot Lifecycle

A Lot is the central object in SMART. Almost every transaction in the database — a deposit, a PO, a service request — is anchored to a Lot via ProjectID + BuildingID + UnitID.

At a glance

  • 29,386 lots in the test database across 775 projects.
  • Identified by the composite key (ProjectID, BuildingID, UnitID). There is no single int “LotID”.
  • The single-letter Lot.Status is the most-read column in the system — it’s updated by Contract operations (accept / ratify / close / cancel), never edited by hand.
  • A Lot’s lifecycle is roughly Land Acquisition → For Sale (s) → Sold (f/i) → Production (p) → Closed (c), with side branches for Models (v), R&D (w), and inventory (p).
  • The Lot table has ~98 columns; you usually only touch a dozen.
1Land Acquisition
Lot exists in LandAcq* tables.
2Lot Created
Becomes a Lot row, status z (Not Available).
3For Sale
Status flips to s. Marketing is live.
4Sold / Reserved
Status f (Sold) or i (Sold, Contingent). A Contract row exists.
5Accepted
Status m. Buyer signed; just waiting on ratification.
6Production Inventory
Status p. Build is authorized; schedule live.
7Closed
Status c. Money exchanged. Warranty clock starts.

A few statuses don’t fit neatly in that line: v (Model Home), w (R&D Home), a (Job Cost Job), b (Non‑Job). See Lot Statuses for the full list with codes.

The Lot table has roughly 98 columns. Most days you only touch the identity, status, plan, and a few date fields. Money columns and construction-loan columns matter only at specific stages of the lifecycle.

All 98 Lot columns, grouped by purpose
GroupColumns
IdentityProjectID, BuildingID, UnitID, Address, City, State, Zipcode, County
StatusStatus (1‑char), StatusAtStart, PendingStatus, Reserved, ReservedExpDate, LockedAfterClose, LockedAfterCloseDate
PlanPlansID, SchPlansID, SchOptionsID, PlanRatified, LimitPlanType, CADPlanID, PlansCADVersionSysID
DatesStartDate, OrigStartDate, SchComplete, SoldDate, CloseDate, PurchaseDate, PermitAppliedDate, PermitReceivedDate, DevelopedPadReady, ProcessThruDate
MoneyLotCost, LotPremium, LotValue, AppraisedValue, BalanceClosing, BalanceWIP, BalanceFinance, BalanceOnOrder, InvoiceTotal, VariancesRecorded, VariancesUnrecorded, TotalBudgetCurrent, TotalBudgetOriginal
Construction LoanConstructionLoanCommitment, ConstructionLoanBalance, ConstructionLenderID, ConstructionLoanCloseDate, ConstructionLoanPrefixID, ConstructionHLPRequestedDate, ConstructionHLPApprovedDate
LegalLegalLot, LegalBlock, LegalSection, LegalPhase, LegalBook, LegalPage, LegalDistrict, LegalLandLot, LegalMunicipality
Workflow flagsEstimateRan, ProcessEstimate, RecalcPO, ReversePlan, ErrorsExist, AllowNoDollarPOs

The single‑letter Status column is updated by SMART when significant events happen — almost always as a side effect of a contract operation, not a direct edit. The full set of triggers and the matching contract proc is below; you’ll find the same cascade documented from the contract side at Contracts.

Status transition triggers (with the proc that drives each one)
TriggerCode changeWhat else fires
Lot setup is completedz → sLot becomes visible in marketing screens
Contract status moves to Accepted (acc)s → f (or i if contingent)Lot is reserved on the schedule
Contract status moves to Ratified (rat)f → pSchedule is regenerated; estimate runs; POs generate
Closing happensp → cLockedAfterClose=1; Bills can post; warranty starts
Sale cancelsf → s/zSchedule cleared; deposits reversed
Conversion to a Modelany → vStandard sales rules disabled
AppWhere
SMARTProduction → Lot Inquiry · Sales → Contract → Lot tab
SMART 2.0production/, web-reports/
Builder PortalSchedule.aspx, WorkOrders.aspx, WorkApproval.aspx
Trade Portalquick-view.aspx, order.aspx
Home Owner PortalSchedule.aspx (one lot per buyer)
Active inventory by community
SELECT c.CommunityName, COUNT(*) AS LotsByStatus, l.Status
FROM dbo.Lot l
JOIN dbo.Project p ON p.ProjectID = l.ProjectID
JOIN dbo.Community c ON c.CommunityID = p.CommunityID
WHERE l.Status IN ('s','f','i','m','p')
GROUP BY c.CommunityName, l.Status
ORDER BY c.CommunityName, l.Status;