{
  "title": "Post-construction cleaning quote calculator field specification",
  "version": "1.0",
  "currency_representation": "Three-letter label; no conversion",
  "fields": [
    {
      "name": "area_unit",
      "type": "enum",
      "allowed": [
        "ft2",
        "m2"
      ],
      "required": true,
      "purpose": "Unit for measured area and productivity."
    },
    {
      "name": "base_hours_mode",
      "type": "enum",
      "allowed": [
        "area_productivity",
        "manual_override"
      ],
      "required": true
    },
    {
      "name": "area",
      "type": "finite number",
      "required_if": "base_hours_mode=area_productivity",
      "exclusive_minimum": 0
    },
    {
      "name": "productivity_area_per_labor_hour",
      "type": "finite number",
      "required_if": "base_hours_mode=area_productivity",
      "exclusive_minimum": 0
    },
    {
      "name": "manual_base_labor_hours",
      "type": "finite number",
      "required_if": "base_hours_mode=manual_override",
      "minimum": 0
    },
    {
      "name": "additional_task_hours",
      "type": "finite number",
      "required": true,
      "minimum": 0
    },
    {
      "name": "crew_count",
      "type": "integer",
      "required": true,
      "minimum": 1,
      "maximum": 100
    },
    {
      "name": "loaded_labor_rate",
      "type": "finite number",
      "required": true,
      "minimum": 0,
      "purpose": "Do not add user-specified burden again."
    },
    {
      "name": "supplies",
      "type": "finite number",
      "required": true,
      "minimum": 0
    },
    {
      "name": "equipment",
      "type": "finite number",
      "required": true,
      "minimum": 0
    },
    {
      "name": "disposal",
      "type": "finite number",
      "required": true,
      "minimum": 0
    },
    {
      "name": "overhead",
      "type": "finite number",
      "required": true,
      "minimum": 0
    },
    {
      "name": "margin_percent",
      "type": "finite number",
      "required": true,
      "minimum": 0,
      "exclusive_maximum": 100
    },
    {
      "name": "currency",
      "type": "string",
      "required": true,
      "pattern": "^[A-Z]{3}$"
    }
  ],
  "formula": {
    "base_labor_hours": "manual override or area / user productivity",
    "total_labor_hours": "base labor-hours + additional task hours",
    "labor_cost": "total labor-hours * loaded labor rate",
    "listed_cost": "labor cost + supplies + equipment + disposal + overhead",
    "quote": "listed cost / (1 - margin as decimal)",
    "crew_elapsed_hours": "total labor-hours / crew count"
  },
  "validation": [
    "Only require area productivity in area mode.",
    "Manual base hours replace area/productivity hours; additional task hours are still added.",
    "Loaded labor rate contains user-specified burden.",
    "Do not insert default productivity, debris multipliers, regional prices, tax, or cost values.",
    "Exports are itemized CSV and quote PDF."
  ]
}
