Fieldforce Management

Overview

Fieldforce Management is a multi-tenant SaaS module built on the existing organization infrastructure. It enables organizations to dispatch tasks to field teams, track execution, log completion proof (notes, photos, signatures), and verify quality — with AI powering the workflow.
The module serves three primary use cases: Service (repair/installation), Sales (territory visits), and Logistics/Delivery (routing and proof of delivery).

System Architecture

The architecture relies on a shared Go backend and two frontend surfaces:
  • Panel (Desktop): Built with SolidStart for full table views, bulk actions, and side-by-side management. Uses offset pagination and assumes always-online connectivity.
  • Mobile Web: Built with Astro + Qwik for touch-friendly interfaces, quick status updates, and offline capabilities. Uses cursor-based infinite scroll.

Data Model

The core entities revolve around Tasks and Activities. All data is scoped by org_id to enforce multi-tenancy.
EntityDescription
ff_tasksCore task data (title, due_date, status, location). Uses a junction table ff_task_assignments for assignees.
ff_activitiesLogs of actions performed by field teams (notes, photos, signatures).
ff_attachmentsS3 presigned URLs linked to activities, with AI scoring flags.
ff_task_embeddingspgvector embeddings for semantic search capabilities.
ff_audit_logsWrite-only audit trail sharing the global audit_log table.

Key Architectural Decisions (ADRs)

Roles & Access Control

Fieldforce inherits the existing org permissions system. No new roles were created; instead, existing roles receive fieldforce-specific scopes:
  • Admin/Owner: Full visibility and management.
  • Manager: View all org tasks, assign, and approve.
  • Supervisor: View and manage tasks for their own team members.
  • Field Team: View own tasks, update status, and log activities.
Supervisor scope is resolved dynamically by reading the supervisor’s team_ids from the shared member table and querying all members sharing at least one team ID (ADR-0017). This ensures there is no replication of team membership into a Go-owned table, maintaining the bounded context.

Implementation Modules

Detailed implementation specs can be found in the respective platform documentation: