Skip to main content

Job Management Entity - Arborist Job with Assessment Workflow

Description

This entity demonstrates a job management system with a linear workflow for service-based businesses. The Job entity from an arborist CRM system shows how to structure entities for project/job tracking with assessment, quoting, scheduling, and completion phases. It includes relationships to client sites, nested assessments and tasks, various job types, and calculated fields for quotes and estimates. The workflow supports both forward progression and the ability to move backwards for revisions.

Use Case

Used in an arborist business management system to track tree work jobs from initial request through assessment, quoting, client approval, scheduling, execution, and completion. Each job can have multiple assessments and tasks, with time and price calculations for different equipment types (tree work, stump grinding, EWP, loading).

Key Features

  • Job type classification (Arborist Report, Tree work, Stump Grinding, etc.)
  • Priority levels for urgent response (1 hour to 14 days)
  • Related client site with customer instructions
  • Nested grid relationships for assessments and tasks
  • Calculated quote and estimate hours for different work types
  • Bi-directional workflow allowing backward movement for corrections
  • Auto-generated job numbers with indexing

JSON Definition

{
"head": {
"name": "Job",
"key": "job",
"pluralisedName": "Jobs",
"allowComments": true,
"allowTasks": false,
"isActive": true
},
"fields": [
{
"label": "Number",
"key": "number",
"validateRules": {},
"index": true,
"behaviourOptions": {
"readOnly": true
},
"typeOptions": {},
"type": "TextField"
},
{
"label": "Type",
"key": "type",
"placeholder": "Job Type",
"validateRules": {
"required": true
},
"behaviourOptions": {},
"typeOptions": {
"values": [
"Arborist Comment",
"Arborist Consultation",
"Arborist Report",
"Fee Proposal",
"Inspect",
"Root Barrier",
"Stump Grinding",
"Tree work"
]
},
"type": "OptionSet"
},
{
"label": "Priority",
"key": "priority",
"placeholder": "Select priority",
"validateRules": {},
"behaviourOptions": {},
"typeOptions": {
"values": [
"I - 1 Hours",
"U - 4 Hours",
"P - 24 Hours",
"P - 7 days",
"N - 14 Days"
]
},
"type": "OptionSet"
},
{
"label": "Client site",
"key": "client_site_id",
"validateRules": {
"required": true
},
"behaviourOptions": {},
"relationshipOptions": {
"ref": "client_site"
},
"typeOptions": {
"label": "detailed_name"
},
"type": "SingleDropDown"
},
{
"label": "Customer instructions",
"key": "customer_instructions",
"validateRules": {},
"behaviourOptions": {},
"type": "HTMLField"
},
{
"label": "Assessments",
"key": "assessments",
"validateRules": {},
"behaviourOptions": {},
"relationshipOptions": {
"ref": "job_assessment"
},
"typeOptions": {
"relationshipField": "job_id"
},
"type": "Grid"
},
{
"label": "TW quote (hrs)",
"key": "tw_quote_hrs",
"validateRules": {},
"behaviourOptions": {
"readOnly": true
},
"typeOptions": {
"precision": 2
},
"type": "NumericField"
},
{
"label": "Total quote price",
"key": "total_quote_price",
"validateRules": {},
"behaviourOptions": {},
"type": "NumericField",
"typeOptions": {
"precision": 2
}
},
{
"label": "Job tasks",
"key": "job_tasks",
"description": "List of tasks for the job",
"validateRules": {},
"behaviourOptions": {},
"relationshipOptions": {
"ref": "job_task"
},
"typeOptions": {
"relationshipField": "job_id"
},
"type": "Grid"
}
],
"hooks": [],
"workflowDefinition": {
"actions": [
{
"key": "assess",
"name": "Assess",
"from": {
"step": ["new"]
},
"default": true,
"to": {
"step": "assessment_completed"
}
},
{
"key": "finalise_quote",
"name": "Finalise quote",
"from": {
"step": ["assessment_completed"]
},
"default": true,
"to": {
"step": "quote_completed"
}
},
{
"key": "send_quote",
"name": "Send quote",
"from": {
"step": ["quote_completed"]
},
"default": true,
"to": {
"step": "waiting_client_approval"
}
},
{
"key": "approve_job",
"name": "Approve job",
"from": {
"step": ["waiting_client_approval"]
},
"default": true,
"to": {
"step": "ready_for_scheduling"
}
},
{
"key": "schedule_job",
"name": "Schedule job",
"from": {
"step": ["ready_for_scheduling"]
},
"default": true,
"to": {
"step": "in_progress"
}
},
{
"key": "complete_job",
"name": "Complete job on site",
"from": {
"step": ["in_progress"]
},
"default": true,
"to": {
"step": "job_completed"
}
},
{
"key": "archive",
"name": "Archive job",
"from": {
"step": ["job_completed"]
},
"default": true,
"to": {
"outcome": 1
}
},
{
"key": "cancel",
"name": "Cancel job",
"from": {
"step": ["ALL"]
},
"to": {
"outcome": 2
}
},
{
"key": "require_reassessment",
"name": "Require reassessment",
"from": {
"step": [
"assessment_completed",
"waiting_client_approval",
"ready_for_scheduling"
]
},
"default": true,
"to": {
"step": "new"
}
},
{
"key": "back_to_ready_for_scheduling",
"name": "Back to Ready for Scheduling",
"from": {
"step": ["in_progress", "job_completed"]
},
"default": true,
"to": {
"step": "ready_for_scheduling"
}
}
],
"steps": [
{
"key": "new",
"name": "New",
"order": 1,
"color": "yellow"
},
{
"key": "assessment_completed",
"name": "Assessment completed",
"order": 2,
"color": "blue"
},
{
"key": "quote_completed",
"name": "Quote completed",
"color": "blue",
"order": 3
},
{
"key": "waiting_client_approval",
"name": "Waiting client approval",
"order": 4,
"color": "grey"
},
{
"key": "ready_for_scheduling",
"name": "Ready for scheduling",
"order": 5,
"color": "orange"
},
{
"key": "in_progress",
"name": "In progress",
"order": 6,
"color": "orange"
},
{
"key": "job_completed",
"name": "Job completed",
"order": 7,
"color": "grey"
}
],
"outcome": {
"success": {
"label": "Invoiced"
},
"failure": {
"label": "Cancelled"
}
}
}
}

Notes

  • The workflow supports backward navigation for corrections at multiple stages
  • The "ALL" keyword in the cancel action allows cancellation from any state
  • Read-only fields are used for system-calculated values
  • HTMLField type allows rich text customer instructions
  • Multiple Grid fields establish master-detail relationships
  • Precision settings on numeric fields ensure accurate financial calculations
  • The job number field is auto-generated and indexed for performance