diff --git a/fusion_claims/models/technician_task.py b/fusion_claims/models/technician_task.py
index 3cc8f5b..e885548 100644
--- a/fusion_claims/models/technician_task.py
+++ b/fusion_claims/models/technician_task.py
@@ -169,7 +169,6 @@ class FusionTechnicianTask(models.Model):
# ------------------------------------------------------------------
scheduled_date = fields.Date(
string='Scheduled Date',
- required=True,
tracking=True,
default=fields.Date.context_today,
index=True,
@@ -265,6 +264,7 @@ class FusionTechnicianTask(models.Model):
# STATUS
# ------------------------------------------------------------------
status = fields.Selection([
+ ('pending', 'Pending'),
('scheduled', 'Scheduled'),
('en_route', 'En Route'),
('in_progress', 'In Progress'),
@@ -851,6 +851,7 @@ class FusionTechnicianTask(models.Model):
@api.depends('status')
def _compute_color(self):
color_map = {
+ 'pending': 5, # purple
'scheduled': 0, # grey
'en_route': 4, # blue
'in_progress': 2, # orange
@@ -2126,7 +2127,7 @@ class FusionTechnicianTask(models.Model):
'time_start', 'time_start_display', 'time_end_display',
'status', 'scheduled_date', 'travel_time_minutes',
'x_fc_sync_client_name', 'x_fc_is_shadow', 'x_fc_sync_source'],
- order='scheduled_date asc, time_start asc',
+ order='scheduled_date asc NULLS LAST, time_start asc',
limit=500,
)
locations = self.env['fusion.technician.location'].get_latest_locations()
diff --git a/fusion_claims/static/src/js/fusion_task_map_view.js b/fusion_claims/static/src/js/fusion_task_map_view.js
index c131766..8ee5923 100644
--- a/fusion_claims/static/src/js/fusion_task_map_view.js
+++ b/fusion_claims/static/src/js/fusion_task_map_view.js
@@ -26,6 +26,7 @@ import {
// ── Constants ───────────────────────────────────────────────────────
const STATUS_COLORS = {
+ pending: "#f59e0b",
scheduled: "#3b82f6",
en_route: "#f59e0b",
in_progress: "#8b5cf6",
@@ -34,6 +35,7 @@ const STATUS_COLORS = {
rescheduled: "#f97316",
};
const STATUS_LABELS = {
+ pending: "Pending",
scheduled: "Scheduled",
en_route: "En Route",
in_progress: "In Progress",
@@ -42,6 +44,7 @@ const STATUS_LABELS = {
rescheduled: "Rescheduled",
};
const STATUS_ICONS = {
+ pending: "fa-hourglass-half",
scheduled: "fa-clock-o",
en_route: "fa-truck",
in_progress: "fa-wrench",
@@ -51,12 +54,14 @@ const STATUS_ICONS = {
};
// Date group keys
+const GROUP_PENDING = "pending";
const GROUP_YESTERDAY = "yesterday";
const GROUP_TODAY = "today";
const GROUP_TOMORROW = "tomorrow";
const GROUP_THIS_WEEK = "this_week";
const GROUP_LATER = "later";
const GROUP_LABELS = {
+ [GROUP_PENDING]: "Pending",
[GROUP_YESTERDAY]: "Yesterday",
[GROUP_TODAY]: "Today",
[GROUP_TOMORROW]: "Tomorrow",
@@ -66,6 +71,7 @@ const GROUP_LABELS = {
// Pin colours by day group
const DAY_COLORS = {
+ [GROUP_PENDING]: "#f59e0b", // Amber
[GROUP_YESTERDAY]: "#9ca3af", // Gray
[GROUP_TODAY]: "#ef4444", // Red
[GROUP_TOMORROW]: "#3b82f6", // Blue
@@ -73,6 +79,7 @@ const DAY_COLORS = {
[GROUP_LATER]: "#a855f7", // Purple
};
const DAY_ICONS = {
+ [GROUP_PENDING]: "fa-hourglass-half",
[GROUP_YESTERDAY]: "fa-history",
[GROUP_TODAY]: "fa-exclamation-circle",
[GROUP_TOMORROW]: "fa-arrow-right",
@@ -137,9 +144,14 @@ function floatToTime12(flt) {
return `${h12}:${String(m).padStart(2, "0")} ${ampm}`;
}
-/** Classify a "YYYY-MM-DD" string into one of our group keys */
+/** Classify a task into one of our group keys based on status and date */
+function classifyTask(task) {
+ if (task.status === "pending") return GROUP_PENDING;
+ return classifyDate(task.scheduled_date);
+}
+
function classifyDate(dateStr) {
- if (!dateStr) return GROUP_LATER;
+ if (!dateStr) return GROUP_PENDING;
const now = new Date();
const todayStr = localDateStr(now);
@@ -151,7 +163,6 @@ function classifyDate(dateStr) {
tmr.setDate(tmr.getDate() + 1);
const tomorrowStr = localDateStr(tmr);
- // End of this week (Sunday)
const endOfWeek = new Date(now);
endOfWeek.setDate(endOfWeek.getDate() + (7 - endOfWeek.getDay()));
const endOfWeekStr = localDateStr(endOfWeek);
@@ -160,7 +171,7 @@ function classifyDate(dateStr) {
if (dateStr === todayStr) return GROUP_TODAY;
if (dateStr === tomorrowStr) return GROUP_TOMORROW;
if (dateStr <= endOfWeekStr && dateStr > tomorrowStr) return GROUP_THIS_WEEK;
- if (dateStr < yesterdayStr) return GROUP_YESTERDAY; // older lumped with yesterday
+ if (dateStr < yesterdayStr) return GROUP_YESTERDAY;
return GROUP_LATER;
}
@@ -180,7 +191,7 @@ function groupTasks(tasksData, localInstanceId) {
});
const groups = {};
- const order = [GROUP_YESTERDAY, GROUP_TODAY, GROUP_TOMORROW, GROUP_THIS_WEEK, GROUP_LATER];
+ const order = [GROUP_PENDING, GROUP_YESTERDAY, GROUP_TODAY, GROUP_TOMORROW, GROUP_THIS_WEEK, GROUP_LATER];
for (const key of order) {
groups[key] = {
key,
@@ -195,7 +206,7 @@ function groupTasks(tasksData, localInstanceId) {
let globalIdx = 0;
for (const task of sorted) {
globalIdx++;
- const g = classifyDate(task.scheduled_date);
+ const g = classifyTask(task);
task._scheduleNum = globalIdx;
task._group = g;
task._dayColor = DAY_COLORS[g] || "#6b7280"; // Pin colour by day
diff --git a/fusion_claims/static/src/xml/fusion_task_map_view.xml b/fusion_claims/static/src/xml/fusion_task_map_view.xml
index 8c28297..a420046 100644
--- a/fusion_claims/static/src/xml/fusion_task_map_view.xml
+++ b/fusion_claims/static/src/xml/fusion_task_map_view.xml
@@ -165,6 +165,7 @@
Pins:
+ Pending
Today
Tomorrow
This Week
diff --git a/fusion_claims/views/technician_task_views.xml b/fusion_claims/views/technician_task_views.xml
index 69aabc4..47036ad 100644
--- a/fusion_claims/views/technician_task_views.xml
+++ b/fusion_claims/views/technician_task_views.xml
@@ -49,6 +49,7 @@
domain="[('scheduled_date', '>=', (context_today() - datetime.timedelta(days=context_today().weekday())).strftime('%Y-%m-%d')),
('scheduled_date', '<=', (context_today() + datetime.timedelta(days=6-context_today().weekday())).strftime('%Y-%m-%d'))]"/>
+
@@ -105,7 +106,7 @@
class="btn-secondary o_fc_calculate_travel" icon="fa-car"
invisible="x_fc_is_shadow"/>
+ statusbar_visible="pending,scheduled,en_route,in_progress,completed"/>
@@ -447,6 +448,15 @@
{'search_default_filter_my_tasks': 1, 'search_default_filter_active': 1}
+
+
+ Pending Tasks
+ fusion.technician.task
+ list,kanban,form
+
+ {'search_default_filter_pending': 1}
+
+
@@ -478,6 +488,12 @@
action="action_technician_tasks"
sequence="20"/>
+
+