Here’s exactly how the T&M Override (Time & Material Override) works in the Ganarpro Cleaning Calculator 2025 code.
💡 Concept
T&M (Time & Material) lets you bill by man-hour instead of square footage or unit rates.
When you turn on the override, the calculator ignores all normal pricing models (Market-Win, Lean, Profit-Heavy) and instead bases the total on hours × hourly bill rate — plus any enabled add-ons (like windows or pressure wash).
⚙️ How It Works in Code
Inside the main calculation block (calc = useMemo(...)):
- Labor hours are already computed from the project’s size, productivity, and phases.
const laborHours = roughHrs + finalHrs + fluffHrs; - T&M settings come from:
const [manHour, setManHour] = useState({ enabled: false, bill_rate_per_hour: 65, apply_to_selected: false, override: false, manual_hours: 0 }); - When T&M is enabled, the calculator checks if the user turned on the “Use manual hours” override:
const tmHours = (manHour.enabled && manHour.override && isFinite(manHour.manual_hours)) ? Math.max(0, manHour.manual_hours) : laborHours;- If override = true, it uses the user-entered manual hours.
- If override = false, it uses the automatically computed labor hours.
- Then it computes a Man-Hour Total:
const manHourTotal = (tmHours * manHour.bill_rate_per_hour) + pressureCost + flooringCost + unitsBathsCost + unitsMixCost + windowCost;That means even under T&M, all add-ons still count. - If the user checks “Use Man-Hour total as Selected Bid”, this replaces the standard bid:
if (manHour.enabled && manHour.apply_to_selected) { selectedBid = manHourTotal; }
🧮 Example
Say your standard Lean price is $14,000
- You enable T&M
- Set bill rate = $65/hr
- Override = ON
- Manual hours = 180
Then:
T&M Total = 180 × $65 = $11,700
(+ any window, pressure, or flooring costs)
If “Use Man-Hour total as Selected Bid” is checked, the Selected Bid field will now show $11,700 instead of the $14,000 Lean price.
✅ Summary
| Setting | Effect |
|---|---|
| T&M Enabled | Activates hourly pricing mode |
| Manual Hours Override | Lets you replace calculated hours with your own |
| Apply to Selected Bid | Makes T&M total override all standard pricing models |
Would you like me to explain how to combine T&M with recurring janitorial mode (since those two can also interact under certain flags)?