Property Projects — Contractor & Property-Services Module with Estimates, E-Signatures, and Photo Capture
Manage 8 contractor verticals (roofing, siding, windows, gutters, HVAC, solar, remodeling, other) on top of the canonical CRM customer record. Mobile photo upload with EXIF GPS, line-item estimates with auto-totaling, in-canvas e-signature capture, cron-driven customer reminders, and a project activity audit log.
8 contractor verticals · Customer-FK · Mobile photo capture · Line-item estimates · Canvas e-signature · Cron reminders
Built for multi-trade contractors on a customer-first platform — eight verticals (roofing, siding, windows, gutters, HVAC, solar, remodeling, other), photo upload with location coordinates, line-item estimates, e-signature capture, customer reminders, and a complete activity audit trail.
What's in the box
8 contractor verticals
Roofing, siding, windows, gutters, HVAC, solar, remodeling, other. One schema, distinct icons, multi-trade-friendly. Sub-type field for specialization (e.g. metal vs asphalt roofing).
Customer-FK architecture
Every project references the canonical customers.id. No parallel customer entity. Project rollups appear on the customer timeline. Lead-to-project conversion preserves notes and custom fields.
Photo capture with EXIF GPS
Mobile camera input. Server extracts GPS coordinates from EXIF when present — geo-tagged photos for inspections, claims, and progress documentation.
Line-item estimates
Per-line type (material / labor / equipment / permit / other), quantity, unit, unit price. Server-authoritative subtotal + tax + discount → total. Per-tenant per-year sequential numbering (EST-2026-0001).
Canvas e-signature
Vanilla-JS canvas pad, retina-scaled. Mouse + touch events for desktop and tablet field use. Captures signer name, email, IP, timestamp. Flips estimate to accepted on save.
Customer reminders cron
Six reminder types (follow-up, appointment, payment due, warranty expiring, annual checkup, custom). */15 * * * * cron sends via PHPMailer with mail() fallback. Permanent failures get cancelled cleanly so the queue never loops.
Project activity audit log
Every status change, document upload, signature, reminder, and assignment writes a row in project_activity_log with the user, timestamp, and JSON payload. Audit-ready for insurance claims and disputes.
Tenant isolation + soft delete
Every query is automatically scoped to your account. Soft deletes on projects, photos, and reminders give you a 30-day undelete window via the standard trash UI.
Setup steps
- Activate the module. RubiMine → Property Projects → Activate.
- Apply the schema migration. A system administrator visits the migration page and clicks Apply schema. Safe to re-run anytime.
- Verify state. Open the state viewer — every active tenant should appear in the rollup. Check reminder health (pending / sent today / failed today).
- Wire the cron. Add
*/15 * * * * php /home/rubiprof/public_html/cron/customer-reminders.phpto crontab. The cron is tenant-agnostic — runs across all tenants in one batch. - Open a customer + create a project. CRM → customer profile → Projects tab → New Project. Pick a vertical, name it, set status, optionally add an estimated amount + dates.
- Build the estimate. Project detail → Manage Estimates → New Estimate. Add line items, set tax + discount, save as draft.
- Send the estimate. On the estimate row click Mark Sent. The estimate is now in front of the customer.
- Capture the signature. When the customer accepts, click Sign. They draw on the canvas (or you draw with their consent) — saved with their name, email, IP, and timestamp. Estimate flips to accepted automatically.
- Set follow-ups. From the project detail, set reminders for warranty checkups, annual maintenance, payment due dates, etc. The cron emails them on schedule.
FAQ
What's Property Projects for?
Contractor and property-services project management on top of the canonical CRM customer record. Eight verticals share one schema. Replaces the older Roofing Inspection module — same use case, expanded to 8 verticals, customer-first architecture.
Do projects need a CRM customer?
Yes. Every project links to a customer in your CRM. Create the customer first if they aren't there yet.
What verticals are supported?
Roofing, siding, windows, gutters, HVAC, solar, remodeling, and other. Each has its own icon and color but they share one schema, so multi-trade contractors run on one system.
How do estimates work?
Estimate header + N line items. Each line: type (material/labor/equipment/permit/other), description, qty, unit, unit price. Subtotal × tax − discount = total, computed server-side. Status flow: draft → sent → viewed → accepted (or declined / expired). Per-tenant per-year sequential numbering.
How does e-signature capture work?
Vanilla-JS canvas pad — works on mouse, touch, tablet, phone. Retina-scaled. Captured as PNG data URL, validated server-side (size + format), stored on the estimate row with signer name, email, IP, and timestamp. Signing flips status to accepted.
How do customer reminders work?
Six reminder types (follow_up, appointment, payment_due, warranty_expiring, annual_checkup, custom). The */15 cron pulls up to 100 due reminders, sends via PHPMailer (with PHP mail() fallback), flips status to sent on success or cancelled on permanent failure so the queue never loops.
Can I capture photos in the field?
Yes. Mobile camera input via the photo upload form. Server extracts EXIF GPS when present — geo-tagged photos for inspections, claims, and progress documentation.
What's in the project activity log?
Every meaningful action — created, status_changed, document_added, note_added, contract_signed, reminder_set, email_sent, etc. — writes a row with user, timestamp, and JSON payload. Audit-ready.
Is your data private to your team?
Yes. Every query is automatically scoped to your account. Cross-account access returns empty.
Can I delete projects?
Soft delete only. deleted_at timestamps hide records from queries; the trash UI at /tenant-admin/trash.php handles undelete within the 30-day window. Permission: admins/managers (role_id ≤ 3) or the project creator.
Resources
- Migration page (system admin)
- State viewer (system admin)
- RubiMine — activate the module
- Open the CRM → customer profile → Projects tab
Last updated: 2026-04-27.