Workflow: Resource Planning
Modules involved: Resource Workload · Tasks · Projects · Timesheets (task timers — NOT the HR Timesheets module)
Used by: Project Manager · Team Lead · Management
Typical duration: Ongoing weekly/monthly planning
Overview
The Resource Workload module provides a consolidated view of the team's capacity and workload based on assigned tasks. Planning is done by assigning tasks with startdate, duedate, and Estimate hour (a custom field automatically injected into tasks).
Critical distinction: The Resource Workload module reads exclusively from hours logged via task timers (core CRM
tbltaskstimers). It does not read from the HR Timesheets module (tbltimesheets_timesheet,tblcheck_in_out, etc.) — that module is for HR time tracking (attendance, leave), not project hours.
Staff only — no equipment. There is no concept of non-human resources (rooms, machinery, vehicles).
Overloading is visual, not blocking. The system marks cells red when capacity hours are exceeded, but does not block assignment.
Flow diagram
[SETUP — admin, one time]
│
├── Global standard workload: 8h/day (default), working days (Mon–Fri default)
├── Per staff (optional): individual capacity per day of week
│ (e.g.: part-timer: Mon=4h, Tue=4h, Wed=0h, Thu=4h, Fri=4h)
└── Day-offs: company-wide blocked dates (different from HR leave!)
│
↓
[TASK PLANNING]
│
├── Task created/edited with:
│ ├── startdate (start date)
│ ├── duedate (deadline — required for correct spread)
│ ├── Assigned staff (tbltask_assigned)
│ └── Estimate hour (custom field tasks_estimate_hour) ← set manually by PM
│
├── System distributes estimated hours day by day:
│ spread = estimate_hour / working_days(start → due)
│ cap = staff_daily_capacity → surplus → next day
└── If duedate is missing: system uses datefinished or today
│
↓
[WORKLOAD VIEW]
│
├── Reports → Resource Workload
│
├── Workload tab (spreadsheet grid):
│ ├── Columns: Staff | Department | Role | [Date E/S per day in range]
│ ├── E = estimated hours (from Estimate hour + spread)
│ ├── S = actually logged hours (from task timers)
│ ├── RED cells = daily capacity exceeded
│ └── Hover on cell = list of tasks contributing to that day
│
├── Timeline tab (Frappe Gantt):
│ ├── Staff as rows, tasks as colored bars per relation type
│ ├── Drag bar = changes task startdate/duedate + recalculates Estimate hour
│ └── Click bar = opens standard task modal
│
├── Chart tab (Highcharts):
│ ├── Pie: Estimated hours — Normal vs Overload
│ ├── Pie: Spent hours — Normal vs Overload
│ └── Stacked column: hours by department
│
└── Kanban tab:
├── One column per staff member with their tasks
├── 10 tasks per page, pagination available
└── Overdue tasks marked as overdue
│
↓
[LOGGING ACTUAL HOURS]
│
├── Staff uses timer on task (Start Timer button from task)
│ → insert into tbltaskstimers: staff_id, task_id, start_time, end_time
└── Logged hours appear in column S (Spent) in the Workload grid
│
↓
[REBALANCING (if overload detected)]
│
├── PM sees red cells → identifies overloaded tasks (hover)
├── Adjust duedate: drag on Gantt OR manual duedate edit on task
└── Redistribute task: change assigned staff on task
[TEAM PLANNED ✓ · HOURS MONITORED ✓]
Step by step
1. Configure capacity (admin)
Where: /admin/settings → Staff → Workload
1a. Global settings
| Option | Default | Description |
|---|---|---|
standard_workload |
8 |
Working hours per day (fallback if staff has no individual setting) |
staff_workload_monday … sunday |
1 for Mon–Fri, 0 Sat–Sun |
Global working days |
1b. Individual capacity per staff (optional)
Where: Settings → Workload → Customize Standard Workload
Handsontable grid: each row = a staff member, each column = a day of the week. Enter hours per cell (e.g.: 4 for part-timer).
If no record exists in tblstandard_workload for a staff member, the global standard_workload value is used.
1c. Day-offs (company holidays)
Where: Settings → Workload → Manage Day-off → Add Day-off
| Field | Description |
|---|---|
reason |
Reason (e.g.: "Christmas", "Team building") |
date |
Blocked date |
Note: Day-offs in Resource Workload are separate from leave in the HR Timesheets module (
tblday_off). The HR Timesheets module does not affect the Resource Workload grid.
2. Create tasks with dates for planning
Where: any module that supports tasks (Projects, Clients, Leads, Tickets, etc.)
Essential fields for Resource Workload:
| Field | Required | Note |
|---|---|---|
startdate |
Yes | Task start date |
duedate |
Recommended | Without deadline, system uses today or datefinished |
Estimate hour |
Yes | Custom field injected by the module — entered manually by PM |
assigned (tbltask_assigned) |
Yes | Assigned staff (can be multiple) |
The Estimate hour field: is a custom field of type number with slug tasks_estimate_hour, automatically injected into all tasks upon module installation. It appears in the task form under the name "Estimate hour".
3. View workload
Where: /admin/reports/resource_workload (requires permission pw_rp_resource_workload → view)
3a. Workload tab
Available filters:
- Date range (default: last 7 days → today)
- Filter by individual staff, department, role, or project
Reading the grid:
- E (Estimate) = hours distributed from
Estimate hourper day - S (Spent) = hours actually logged via task timer per day
- Red = E or S exceeds that staff member's daily capacity
- Tooltip on hover = list of tasks contributing to that cell
3b. Timeline tab (Gantt)
Colored bars per task relation type:
- Blue = project task (
rel_type = 'project') - Green = client task (
rel_type = 'customer') - Orange = ticket task (
rel_type = 'ticket') - etc.
Drag & drop on bars: modifies startdate and duedate directly on the task → Estimate hour is automatically recalculated based on working days × daily capacity.
4. Log actual hours
Actual hours (column S) come from task timers, not from the HR Timesheets module:
Where: any task → Start Timer button (or Log Time manually)
| Action | Table populated |
|---|---|
| Start/Stop timer on task | tbltaskstimers — start_time, end_time, staff_id, task_id |
| Manual time log on task | tbltaskstimers — identical fields |
Hours from HR Timesheets (check-in/check-out, attendance sheets) do NOT appear in Resource Workload.
5. Identifying overloads and rebalancing
- Detection: red cells in the Workload grid or "Overload" slices in the Chart tab
- Identify culprit tasks: hover over the red cell → tooltip lists the tasks
- Rebalancing actions:
- Extend deadline: drag on Gantt or edit
duedateon task - Redistribute: change assigned staff on task
- Reduce estimate: edit the
Estimate hourfield on task
- Extend deadline: drag on Gantt or edit
- Verification: reload the grid to confirm cells are green
Required permissions
| Permission | Access |
|---|---|
pw_rp_resource_workload → view |
Access to the Resource Workload page (all 4 tabs) + modify workload settings + drag on Gantt |
Note: There are no separate granular view/edit/delete permissions for Resource Workload. A single
viewflag controls everything — including the ability to modify per-staff capacities and reschedule tasks via Gantt.
Gotchas
| Problem | Cause | Solution |
|---|---|---|
| Staff not appearing in grid | Not active or has no tasks in the selected range | Check active=1 on staff + extend the date range |
| Column S = 0 despite hours being logged | Hours are in HR Timesheets, not in task timers | Log hours via task timer (not via HR check-in) |
| Estimate hour missing from task | Custom field not filled in | Fill in the Estimate hour field on each task |
| Task without deadline does not appear correctly in grid | duedate missing → system uses today |
Always set duedate on planned tasks |
| Drag on Gantt does not save | Missing permission | Verify staff has pw_rp_resource_workload → view |
| HR leave does not block days in Workload | Modules are completely separate | Add days off manually in Workload → Day-offs |
Module references
- Tasks — tasks with Estimate hour and timers
- Projects — projects and project tasks
- Timesheets — HR time tracking (separate from Resource Workload)
- Reports — other performance reports