1738 lines
49 KiB
JavaScript
1738 lines
49 KiB
JavaScript
import { Key } from "@iconoir/vue";
|
|
|
|
class DataUtils {
|
|
// static buildClientData(clients) {
|
|
// const address = `${client["address"]["address_line_1"] || ""} ${client["address"]["address_line_2"] || ""} ${client["address"]["city"] || ""} ${client["address"]["state"] || ""}`.trim();
|
|
// const clientName = `${client["customer"]["customer_name"] || "N/A"} ${address}`;
|
|
// return clients.map((client) => [clientName, client.]
|
|
// }
|
|
|
|
static calculateStepProgress(steps) {
|
|
if (!steps || steps.length === 0) return "0/0";
|
|
const completedSteps = steps.filter((step) => step.status === "completed").length;
|
|
return `${completedSteps}/${steps.length}`;
|
|
}
|
|
|
|
static dummyClientData = [
|
|
{
|
|
id: 1,
|
|
fullName: "John Doe 123 Lane Dr Cityville, MN",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "in progress",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 2,
|
|
fullName: "Jane Smith 456 Oak St Townsville, CA",
|
|
appointmentScheduled: "in progress",
|
|
estimateSent: "not started",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 3,
|
|
fullName: "Mike Johnson 789 Pine Rd Villagetown, TX",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "completed",
|
|
paymentReceived: "in progress",
|
|
jobStatus: "in progress",
|
|
},
|
|
{
|
|
id: 4,
|
|
fullName: "Emily Davis 321 Maple Ave Hamlet, FL",
|
|
appointmentScheduled: "not started",
|
|
estimateSent: "not started",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 5,
|
|
fullName: "David Wilson 654 Cedar Blvd Borough, NY",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "completed",
|
|
paymentReceived: "completed",
|
|
jobStatus: "completed",
|
|
},
|
|
// create 30 more dummy entries
|
|
{
|
|
id: 6,
|
|
fullName: "Sarah Brown 987 Birch Ln Metropolis, IL",
|
|
appointmentScheduled: "in progress",
|
|
estimateSent: "not started",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 7,
|
|
fullName: "Chris Taylor 159 Spruce Ct Capital City, WA",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "completed",
|
|
paymentReceived: "in progress",
|
|
jobStatus: "in progress",
|
|
},
|
|
{
|
|
id: 8,
|
|
fullName: "Amanda Martinez 753 Willow Dr Smalltown, OH",
|
|
appointmentScheduled: "not started",
|
|
estimateSent: "not started",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 9,
|
|
fullName: "Joshua Anderson 852 Aspen Rd Bigcity, NJ",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "in progress",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 10,
|
|
fullName: "Olivia Thomas 147 Cypress St Uptown, GA",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "completed",
|
|
paymentReceived: "completed",
|
|
jobStatus: "completed",
|
|
},
|
|
{
|
|
id: 11,
|
|
fullName: "Daniel Jackson 369 Fir Ave Downtown, MI",
|
|
appointmentScheduled: "in progress",
|
|
estimateSent: "not started",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 12,
|
|
fullName: "Sophia White 258 Palm Blvd Riverside, AZ",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "completed",
|
|
paymentReceived: "in progress",
|
|
jobStatus: "in progress",
|
|
},
|
|
{
|
|
id: 13,
|
|
fullName: "Matthew Harris 951 Olive Ln Seaside, OR",
|
|
appointmentScheduled: "not started",
|
|
estimateSent: "not started",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 14,
|
|
fullName: "Isabella Clark 753 Magnolia Ct Hilltown, SC",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "in progress",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 15,
|
|
fullName: "Andrew Lewis 357 Dogwood Dr Lakeview, VT",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "completed",
|
|
paymentReceived: "completed",
|
|
jobStatus: "completed",
|
|
},
|
|
{
|
|
id: 16,
|
|
fullName: "Mia Robinson 159 Cherry St Forestville, KY",
|
|
appointmentScheduled: "in progress",
|
|
estimateSent: "not started",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
{
|
|
id: 17,
|
|
fullName: "Ethan Walker 456 Walnut Rd Meadowbrook, ND",
|
|
appointmentScheduled: "completed",
|
|
estimateSent: "completed",
|
|
paymentReceived: "in progress",
|
|
jobStatus: "in progress",
|
|
},
|
|
{
|
|
id: 18,
|
|
fullName: "Ava Hall 123 Poplar Ave Greenfield, MS",
|
|
appointmentScheduled: "not started",
|
|
estimateSent: "not started",
|
|
paymentReceived: "not started",
|
|
jobStatus: "not started",
|
|
},
|
|
];
|
|
|
|
static dummyJobData = [
|
|
{
|
|
jobId: "JOB001",
|
|
foreman: "Mike Thompson",
|
|
crew: ["Worker A", "Worker B"],
|
|
address: "123 Lane Dr, Cityville, MN",
|
|
customer: "John Doe",
|
|
overAllStatus: "in progress",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "completed" },
|
|
{ stepName: "Locate Utilities", status: "in progress" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB002",
|
|
foreman: null,
|
|
crew: [],
|
|
address: "456 Oak St, Townsville, CA",
|
|
customer: "Jane Smith",
|
|
overAllStatus: "not started",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "not started" },
|
|
{ stepName: "Materials Received", status: "not started" },
|
|
{ stepName: "Permits", status: "not started" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "not started" },
|
|
{ stepName: "Crew Assigned", status: "not started" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB003",
|
|
foreman: "Sarah Johnson",
|
|
crew: ["Worker C", "Worker D", "Worker E"],
|
|
address: "789 Pine Rd, Villagetown, TX",
|
|
customer: "Mike Johnson",
|
|
overAllStatus: "in progress",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "completed" },
|
|
{ stepName: "Locate Utilities", status: "completed" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "in progress" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB004",
|
|
foreman: null,
|
|
crew: [],
|
|
address: "321 Maple Ave, Hamlet, FL",
|
|
customer: "Emily Davis",
|
|
overAllStatus: "not started",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "not started" },
|
|
{ stepName: "Materials Received", status: "not started" },
|
|
{ stepName: "Permits", status: "not started" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "not started" },
|
|
{ stepName: "Crew Assigned", status: "not started" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB005",
|
|
foreman: "David Martinez",
|
|
crew: ["Worker F", "Worker G"],
|
|
address: "654 Cedar Blvd, Borough, NY",
|
|
customer: "David Wilson",
|
|
overAllStatus: "completed",
|
|
completionDate: "2024-10-15",
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "completed" },
|
|
{ stepName: "Locate Utilities", status: "completed" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "completed" },
|
|
{ stepName: "Job Completed", status: "completed" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB006",
|
|
foreman: null,
|
|
crew: [],
|
|
address: "987 Birch Ln, Metropolis, IL",
|
|
customer: "Sarah Brown",
|
|
overAllStatus: "not started",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "in progress" },
|
|
{ stepName: "Materials Received", status: "not started" },
|
|
{ stepName: "Permits", status: "not started" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "not started" },
|
|
{ stepName: "Crew Assigned", status: "not started" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB007",
|
|
foreman: "Chris Wilson",
|
|
crew: ["Worker H", "Worker I"],
|
|
address: "159 Spruce Ct, Capital City, WA",
|
|
customer: "Chris Taylor",
|
|
overAllStatus: "in progress",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "completed" },
|
|
{ stepName: "Locate Utilities", status: "completed" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "in progress" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB008",
|
|
foreman: null,
|
|
crew: [],
|
|
address: "753 Willow Dr, Smalltown, OH",
|
|
customer: "Amanda Martinez",
|
|
overAllStatus: "not started",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "not started" },
|
|
{ stepName: "Materials Received", status: "not started" },
|
|
{ stepName: "Permits", status: "not started" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "not started" },
|
|
{ stepName: "Crew Assigned", status: "not started" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB009",
|
|
foreman: "Lisa Anderson",
|
|
crew: ["Worker J"],
|
|
address: "852 Aspen Rd, Bigcity, NJ",
|
|
customer: "Joshua Anderson",
|
|
overAllStatus: "in progress",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "in progress" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB010",
|
|
foreman: "Robert Thomas",
|
|
crew: ["Worker K", "Worker L", "Worker M"],
|
|
address: "147 Cypress St, Uptown, GA",
|
|
customer: "Olivia Thomas",
|
|
overAllStatus: "completed",
|
|
completionDate: "2024-10-20",
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "completed" },
|
|
{ stepName: "Locate Utilities", status: "completed" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "completed" },
|
|
{ stepName: "Job Completed", status: "completed" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB011",
|
|
foreman: null,
|
|
crew: [],
|
|
address: "369 Fir Ave, Downtown, MI",
|
|
customer: "Daniel Jackson",
|
|
overAllStatus: "not started",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "in progress" },
|
|
{ stepName: "Materials Received", status: "not started" },
|
|
{ stepName: "Permits", status: "not started" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "not started" },
|
|
{ stepName: "Crew Assigned", status: "not started" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB012",
|
|
foreman: "Maria White",
|
|
crew: ["Worker N", "Worker O"],
|
|
address: "258 Palm Blvd, Riverside, AZ",
|
|
customer: "Sophia White",
|
|
overAllStatus: "in progress",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "completed" },
|
|
{ stepName: "Locate Utilities", status: "completed" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "in progress" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB013",
|
|
foreman: null,
|
|
crew: [],
|
|
address: "951 Olive Ln, Seaside, OR",
|
|
customer: "Matthew Harris",
|
|
overAllStatus: "not started",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "not started" },
|
|
{ stepName: "Materials Received", status: "not started" },
|
|
{ stepName: "Permits", status: "not started" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "not started" },
|
|
{ stepName: "Crew Assigned", status: "not started" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB014",
|
|
foreman: "James Clark",
|
|
crew: ["Worker P"],
|
|
address: "753 Magnolia Ct, Hilltown, SC",
|
|
customer: "Isabella Clark",
|
|
overAllStatus: "in progress",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "in progress" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB015",
|
|
foreman: "Patricia Lewis",
|
|
crew: ["Worker Q", "Worker R", "Worker S"],
|
|
address: "357 Dogwood Dr, Lakeview, VT",
|
|
customer: "Andrew Lewis",
|
|
overAllStatus: "completed",
|
|
completionDate: "2024-10-18",
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "completed" },
|
|
{ stepName: "Locate Utilities", status: "completed" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "completed" },
|
|
{ stepName: "Job Completed", status: "completed" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB016",
|
|
foreman: null,
|
|
crew: [],
|
|
address: "159 Cherry St, Forestville, KY",
|
|
customer: "Mia Robinson",
|
|
overAllStatus: "not started",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "in progress" },
|
|
{ stepName: "Materials Received", status: "not started" },
|
|
{ stepName: "Permits", status: "not started" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "not started" },
|
|
{ stepName: "Crew Assigned", status: "not started" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB017",
|
|
foreman: "Kevin Walker",
|
|
crew: ["Worker T", "Worker U"],
|
|
address: "456 Walnut Rd, Meadowbrook, ND",
|
|
customer: "Ethan Walker",
|
|
overAllStatus: "in progress",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "completed" },
|
|
{ stepName: "Materials Received", status: "completed" },
|
|
{ stepName: "Permits", status: "completed" },
|
|
{ stepName: "Locate Utilities", status: "completed" },
|
|
{ stepName: "Foreman Assigned", status: "completed" },
|
|
{ stepName: "Crew Assigned", status: "completed" },
|
|
{ stepName: "Job Started", status: "in progress" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
{
|
|
jobId: "JOB018",
|
|
foreman: null,
|
|
crew: [],
|
|
address: "123 Poplar Ave, Greenfield, MS",
|
|
customer: "Ava Hall",
|
|
overAllStatus: "not started",
|
|
completionDate: null,
|
|
steps: [
|
|
{ stepName: "Materials Ordered", status: "not started" },
|
|
{ stepName: "Materials Received", status: "not started" },
|
|
{ stepName: "Permits", status: "not started" },
|
|
{ stepName: "Locate Utilities", status: "not started" },
|
|
{ stepName: "Foreman Assigned", status: "not started" },
|
|
{ stepName: "Crew Assigned", status: "not started" },
|
|
{ stepName: "Job Started", status: "not started" },
|
|
{ stepName: "Job Completed", status: "not started" },
|
|
],
|
|
},
|
|
];
|
|
|
|
static dummyServiceData = [
|
|
// Scheduled services
|
|
{
|
|
id: "service_1",
|
|
title: "Sprinkler System Installation - John Doe",
|
|
customer: "John Doe",
|
|
address: "123 Lane Dr, Cityville, MN",
|
|
serviceType: "Sprinkler System Installation",
|
|
foreman: "Mike Thompson",
|
|
crew: ["Technician A", "Technician B"],
|
|
scheduledDate: "2025-10-25",
|
|
scheduledTime: "08:00",
|
|
duration: 480, // minutes (8 hours)
|
|
status: "scheduled",
|
|
priority: "high",
|
|
estimatedCost: 4500,
|
|
notes: "Residential front and back yard coverage, 12 zones",
|
|
},
|
|
{
|
|
id: "service_2",
|
|
title: "Sprinkler Winterization - Jane Smith",
|
|
customer: "Jane Smith",
|
|
address: "456 Oak St, Townsville, CA",
|
|
serviceType: "Sprinkler Winterization",
|
|
foreman: "Sarah Johnson",
|
|
crew: ["Technician C"],
|
|
scheduledDate: "2025-10-25",
|
|
scheduledTime: "14:00",
|
|
duration: 90, // minutes (1.5 hours)
|
|
status: "scheduled",
|
|
priority: "medium",
|
|
estimatedCost: 150,
|
|
notes: "Blow out all lines before first freeze",
|
|
},
|
|
{
|
|
id: "service_3",
|
|
title: "Drip Line Repair - Mike Johnson",
|
|
customer: "Mike Johnson",
|
|
address: "789 Pine Rd, Villagetown, TX",
|
|
serviceType: "Drip Line Repair",
|
|
foreman: "David Martinez",
|
|
crew: ["Technician D"],
|
|
scheduledDate: "2025-10-26",
|
|
scheduledTime: "09:00",
|
|
duration: 120, // minutes (2 hours)
|
|
status: "scheduled",
|
|
priority: "high",
|
|
estimatedCost: 280,
|
|
notes: "Multiple leaks in flower bed drip system",
|
|
},
|
|
{
|
|
id: "service_4",
|
|
title: "Controller Programming - Emily Davis",
|
|
customer: "Emily Davis",
|
|
address: "321 Maple Ave, Hamlet, FL",
|
|
serviceType: "Controller Programming",
|
|
foreman: "Chris Wilson",
|
|
crew: ["Technician E"],
|
|
scheduledDate: "2025-10-27",
|
|
scheduledTime: "10:00",
|
|
duration: 60, // minutes (1 hour)
|
|
status: "scheduled",
|
|
priority: "medium",
|
|
estimatedCost: 125,
|
|
notes: "Seasonal schedule update and zone testing",
|
|
},
|
|
{
|
|
id: "service_5",
|
|
title: "Spring Startup - David Wilson",
|
|
customer: "David Wilson",
|
|
address: "654 Cedar Blvd, Borough, NY",
|
|
serviceType: "Spring Startup",
|
|
foreman: "Lisa Anderson",
|
|
crew: ["Technician F"],
|
|
scheduledDate: "2025-10-28",
|
|
scheduledTime: "11:00",
|
|
duration: 75, // minutes (1.25 hours)
|
|
status: "scheduled",
|
|
priority: "low",
|
|
estimatedCost: 95,
|
|
notes: "Annual system startup and inspection",
|
|
},
|
|
{
|
|
id: "service_6",
|
|
title: "Zone Expansion - Sarah Brown",
|
|
customer: "Sarah Brown",
|
|
address: "987 Birch Ln, Metropolis, IL",
|
|
serviceType: "Zone Expansion",
|
|
foreman: "Robert Thomas",
|
|
crew: ["Technician G", "Technician H"],
|
|
scheduledDate: "2025-10-29",
|
|
scheduledTime: "08:30",
|
|
duration: 300, // minutes (5 hours)
|
|
status: "scheduled",
|
|
priority: "high",
|
|
estimatedCost: 1800,
|
|
notes: "Add 4 new zones to existing system for landscaped areas",
|
|
},
|
|
{
|
|
id: "service_13",
|
|
title: "Backflow Testing - Robert Green",
|
|
customer: "Robert Green",
|
|
address: "445 Elm St, Riverside, CA",
|
|
serviceType: "Backflow Testing",
|
|
foreman: "Mike Thompson",
|
|
crew: ["Technician I"],
|
|
scheduledDate: "2025-10-27",
|
|
scheduledTime: "14:30",
|
|
duration: 60, // minutes (1 hour)
|
|
status: "scheduled",
|
|
priority: "medium",
|
|
estimatedCost: 120,
|
|
notes: "Annual backflow preventer inspection",
|
|
},
|
|
{
|
|
id: "service_14",
|
|
title: "Smart Controller Install - Lisa Park",
|
|
customer: "Lisa Park",
|
|
address: "892 Maple Dr, Springfield, TX",
|
|
serviceType: "Smart Controller Install",
|
|
foreman: "Sarah Johnson",
|
|
crew: ["Technician J"],
|
|
scheduledDate: "2025-10-28",
|
|
scheduledTime: "09:30",
|
|
duration: 120, // minutes (2 hours)
|
|
status: "scheduled",
|
|
priority: "low",
|
|
estimatedCost: 450,
|
|
notes: "Upgrade to WiFi-enabled smart controller",
|
|
},
|
|
{
|
|
id: "service_15",
|
|
title: "Pump Station Repair - Mark Wilson",
|
|
customer: "Mark Wilson",
|
|
address: "123 Oak Ave, Laketown, FL",
|
|
serviceType: "Pump Station Repair",
|
|
foreman: "David Martinez",
|
|
crew: ["Technician K", "Technician L"],
|
|
scheduledDate: "2025-10-29",
|
|
scheduledTime: "13:00",
|
|
duration: 180, // minutes (3 hours)
|
|
status: "scheduled",
|
|
priority: "urgent",
|
|
estimatedCost: 680,
|
|
notes: "Pump not priming, possible impeller issue",
|
|
},
|
|
|
|
// Unscheduled services
|
|
{
|
|
id: "service_7",
|
|
title: "Emergency Leak Repair - Amanda Martinez",
|
|
customer: "Amanda Martinez",
|
|
address: "753 Willow Dr, Smalltown, OH",
|
|
serviceType: "Emergency Leak Repair",
|
|
foreman: null,
|
|
crew: [],
|
|
scheduledDate: null,
|
|
scheduledTime: null,
|
|
duration: 90, // minutes (1.5 hours)
|
|
status: "unscheduled",
|
|
priority: "urgent",
|
|
estimatedCost: 200,
|
|
notes: "Main line leak flooding driveway",
|
|
},
|
|
{
|
|
id: "service_8",
|
|
title: "Broken Sprinkler Head - Joshua Anderson",
|
|
customer: "Joshua Anderson",
|
|
address: "852 Aspen Rd, Bigcity, NJ",
|
|
serviceType: "Sprinkler Head Replacement",
|
|
foreman: null,
|
|
crew: [],
|
|
scheduledDate: null,
|
|
scheduledTime: null,
|
|
duration: 45, // minutes
|
|
status: "unscheduled",
|
|
priority: "medium",
|
|
estimatedCost: 75,
|
|
notes: "Multiple heads damaged by mower",
|
|
},
|
|
{
|
|
id: "service_9",
|
|
title: "System Inspection - Olivia Thomas",
|
|
customer: "Olivia Thomas",
|
|
address: "147 Cypress St, Uptown, GA",
|
|
serviceType: "System Inspection",
|
|
foreman: null,
|
|
crew: [],
|
|
scheduledDate: null,
|
|
scheduledTime: null,
|
|
duration: 60, // minutes (1 hour)
|
|
status: "unscheduled",
|
|
priority: "low",
|
|
estimatedCost: 85,
|
|
notes: "Annual maintenance check requested",
|
|
},
|
|
{
|
|
id: "service_10",
|
|
title: "New Installation Quote - Daniel Jackson",
|
|
customer: "Daniel Jackson",
|
|
address: "369 Fir Ave, Downtown, MI",
|
|
serviceType: "Installation Quote",
|
|
foreman: null,
|
|
crew: [],
|
|
scheduledDate: null,
|
|
scheduledTime: null,
|
|
duration: 45, // minutes
|
|
status: "unscheduled",
|
|
priority: "medium",
|
|
estimatedCost: 0,
|
|
notes: "Estimate for new construction sprinkler system",
|
|
},
|
|
{
|
|
id: "service_11",
|
|
title: "Valve Replacement - Sophia White",
|
|
customer: "Sophia White",
|
|
address: "258 Palm Blvd, Riverside, AZ",
|
|
serviceType: "Valve Replacement",
|
|
foreman: null,
|
|
crew: [],
|
|
scheduledDate: null,
|
|
scheduledTime: null,
|
|
duration: 120, // minutes (2 hours)
|
|
status: "unscheduled",
|
|
priority: "medium",
|
|
estimatedCost: 350,
|
|
notes: "Zone 3 valve not closing properly",
|
|
},
|
|
{
|
|
id: "service_12",
|
|
title: "Controller Repair - Matthew Harris",
|
|
customer: "Matthew Harris",
|
|
address: "951 Olive Ln, Seaside, OR",
|
|
serviceType: "Controller Repair",
|
|
foreman: null,
|
|
crew: [],
|
|
scheduledDate: null,
|
|
scheduledTime: null,
|
|
duration: 90, // minutes (1.5 hours)
|
|
status: "unscheduled",
|
|
priority: "urgent",
|
|
estimatedCost: 250,
|
|
notes: "Controller display not working, possible storm damage",
|
|
},
|
|
];
|
|
|
|
static dummyRouteData = [
|
|
{
|
|
routeId: "TECH-001",
|
|
routeName: "North Valley Tech Route",
|
|
routeType: "Tech Route",
|
|
technician: "Mike Thompson",
|
|
date: "2025-10-25",
|
|
status: "in progress",
|
|
totalStops: 6,
|
|
completedStops: 2,
|
|
estimatedDuration: "8 hours",
|
|
startTime: "07:00",
|
|
vehicleId: "TECH-101",
|
|
totalMileage: 52.3,
|
|
stops: [
|
|
{
|
|
stopId: 1,
|
|
customer: "John Doe",
|
|
address: "123 Lane Dr, Cityville, MN",
|
|
serviceType: "Complete Sprinkler System Install",
|
|
estimatedTime: "07:30",
|
|
duration: 240,
|
|
status: "completed",
|
|
coordinates: { lat: 44.9778, lng: -93.265 },
|
|
},
|
|
{
|
|
stopId: 2,
|
|
customer: "Sarah Johnson",
|
|
address: "456 Oak St, Northfield, MN",
|
|
serviceType: "Zone Expansion Install",
|
|
estimatedTime: "11:45",
|
|
duration: 180,
|
|
status: "completed",
|
|
coordinates: { lat: 44.4583, lng: -93.1614 },
|
|
},
|
|
{
|
|
stopId: 3,
|
|
customer: "Mike Wilson",
|
|
address: "789 Pine Rd, Faribault, MN",
|
|
serviceType: "Drip System Installation",
|
|
estimatedTime: "15:00",
|
|
duration: 120,
|
|
status: "in progress",
|
|
coordinates: { lat: 44.295, lng: -93.2688 },
|
|
},
|
|
{
|
|
stopId: 4,
|
|
customer: "Emily Davis",
|
|
address: "321 Maple Ave, Owatonna, MN",
|
|
serviceType: "Smart Controller Install",
|
|
estimatedTime: "17:30",
|
|
duration: 90,
|
|
status: "not started",
|
|
coordinates: { lat: 44.0839, lng: -93.2261 },
|
|
},
|
|
{
|
|
stopId: 5,
|
|
customer: "David Brown",
|
|
address: "654 Cedar Blvd, Austin, MN",
|
|
serviceType: "Backflow Preventer Install",
|
|
estimatedTime: "19:15",
|
|
duration: 75,
|
|
status: "not started",
|
|
coordinates: { lat: 43.6667, lng: -92.9746 },
|
|
},
|
|
{
|
|
stopId: 6,
|
|
customer: "Lisa Garcia",
|
|
address: "987 Elm St, Albert Lea, MN",
|
|
serviceType: "Pump Station Installation",
|
|
estimatedTime: "20:45",
|
|
duration: 150,
|
|
status: "not started",
|
|
coordinates: { lat: 43.6481, lng: -93.3687 },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
routeId: "MAT-002",
|
|
routeName: "South Metro Materials Route",
|
|
routeType: "Materials Route",
|
|
technician: "Sarah Johnson",
|
|
date: "2025-10-25",
|
|
status: "completed",
|
|
totalStops: 5,
|
|
completedStops: 5,
|
|
estimatedDuration: "4 hours",
|
|
startTime: "06:00",
|
|
vehicleId: "MAT-102",
|
|
totalMileage: 42.1,
|
|
stops: [
|
|
{
|
|
stopId: 1,
|
|
customer: "Jennifer White - Job #2245",
|
|
address: "555 Main St, Burnsville, MN",
|
|
serviceType: "Deliver Pipes & Fittings",
|
|
estimatedTime: "06:30",
|
|
duration: 30,
|
|
status: "completed",
|
|
coordinates: { lat: 44.7677, lng: -93.2777 },
|
|
},
|
|
{
|
|
stopId: 2,
|
|
customer: "Mark Anderson - Job #2248",
|
|
address: "777 First Ave, Eagan, MN",
|
|
serviceType: "Deliver Sprinkler Heads & Valves",
|
|
estimatedTime: "07:15",
|
|
duration: 25,
|
|
status: "completed",
|
|
coordinates: { lat: 44.8041, lng: -93.1668 },
|
|
},
|
|
{
|
|
stopId: 3,
|
|
customer: "Carol Thompson - Job #2250",
|
|
address: "999 Second St, Apple Valley, MN",
|
|
serviceType: "Deliver Controller & Wire",
|
|
estimatedTime: "08:00",
|
|
duration: 20,
|
|
status: "completed",
|
|
coordinates: { lat: 44.7319, lng: -93.2177 },
|
|
},
|
|
{
|
|
stopId: 4,
|
|
customer: "Steven Clark - Job #2253",
|
|
address: "111 Third Ave, Rosemount, MN",
|
|
serviceType: "Deliver Backflow Preventer",
|
|
estimatedTime: "08:45",
|
|
duration: 25,
|
|
status: "completed",
|
|
coordinates: { lat: 44.7391, lng: -93.0658 },
|
|
},
|
|
{
|
|
stopId: 5,
|
|
customer: "Nancy Rodriguez - Job #2256",
|
|
address: "222 Fourth St, Lakeville, MN",
|
|
serviceType: "Deliver Pump & Pressure Tank",
|
|
estimatedTime: "09:30",
|
|
duration: 35,
|
|
status: "completed",
|
|
coordinates: { lat: 44.6497, lng: -93.2427 },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
routeId: "WAR-003",
|
|
routeName: "West Metro Warranty Route",
|
|
routeType: "Warranty Route",
|
|
technician: "David Martinez",
|
|
date: "2025-10-26",
|
|
status: "not started",
|
|
totalStops: 6,
|
|
completedStops: 0,
|
|
estimatedDuration: "5.5 hours",
|
|
startTime: "08:00",
|
|
vehicleId: "SRV-103",
|
|
totalMileage: 48.7,
|
|
stops: [
|
|
{
|
|
stopId: 1,
|
|
customer: "Rebecca Johnson - Warranty #W-445",
|
|
address: "444 West St, Minnetonka, MN",
|
|
serviceType: "Warranty: Valve Not Closing",
|
|
estimatedTime: "08:30",
|
|
duration: 60,
|
|
status: "not started",
|
|
coordinates: { lat: 44.9211, lng: -93.4687 },
|
|
},
|
|
{
|
|
stopId: 2,
|
|
customer: "Kevin Brown - Warranty #W-448",
|
|
address: "666 Lake Rd, Wayzata, MN",
|
|
serviceType: "Warranty: Controller Malfunction",
|
|
estimatedTime: "10:00",
|
|
duration: 75,
|
|
status: "not started",
|
|
coordinates: { lat: 44.9744, lng: -93.5066 },
|
|
},
|
|
{
|
|
stopId: 3,
|
|
customer: "Michelle Davis - Warranty #W-451",
|
|
address: "888 Shore Dr, Orono, MN",
|
|
serviceType: "Warranty: Sprinkler Head Broken",
|
|
estimatedTime: "11:30",
|
|
duration: 45,
|
|
status: "not started",
|
|
coordinates: { lat: 45.0541, lng: -93.6091 },
|
|
},
|
|
{
|
|
stopId: 4,
|
|
customer: "Daniel Wilson - Warranty #W-453",
|
|
address: "101 Bay Ln, Mound, MN",
|
|
serviceType: "Warranty: Pipe Leak Repair",
|
|
estimatedTime: "12:30",
|
|
duration: 90,
|
|
status: "not started",
|
|
coordinates: { lat: 44.9364, lng: -93.6719 },
|
|
},
|
|
{
|
|
stopId: 5,
|
|
customer: "Laura Smith - Warranty #W-456",
|
|
address: "202 Hill St, Chanhassen, MN",
|
|
serviceType: "Warranty: Low Water Pressure",
|
|
estimatedTime: "14:15",
|
|
duration: 60,
|
|
status: "not started",
|
|
coordinates: { lat: 44.8619, lng: -93.5272 },
|
|
},
|
|
{
|
|
stopId: 6,
|
|
customer: "James Lee - Warranty #W-458",
|
|
address: "303 Valley Rd, Chaska, MN",
|
|
serviceType: "Warranty: Zone Not Working",
|
|
estimatedTime: "15:30",
|
|
duration: 75,
|
|
status: "not started",
|
|
coordinates: { lat: 44.7886, lng: -93.6022 },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
routeId: "SOD-004",
|
|
routeName: "East Metro Sod Route",
|
|
routeType: "Sod Route",
|
|
technician: "Chris Wilson",
|
|
date: "2025-10-26",
|
|
status: "in progress",
|
|
totalStops: 4,
|
|
completedStops: 1,
|
|
estimatedDuration: "6 hours",
|
|
startTime: "07:30",
|
|
vehicleId: "SOD-104",
|
|
totalMileage: 35.8,
|
|
stops: [
|
|
{
|
|
stopId: 1,
|
|
customer: "Thomas Anderson - Job #2301",
|
|
address: "505 East St, Woodbury, MN",
|
|
serviceType: "Install 2,500 sq ft Sod",
|
|
estimatedTime: "08:00",
|
|
duration: 120,
|
|
status: "completed",
|
|
coordinates: { lat: 44.9237, lng: -92.9594 },
|
|
},
|
|
{
|
|
stopId: 2,
|
|
customer: "Patricia Miller - Job #2305",
|
|
address: "707 North Ave, Oakdale, MN",
|
|
serviceType: "Install 1,800 sq ft Sod",
|
|
estimatedTime: "10:30",
|
|
duration: 90,
|
|
status: "in progress",
|
|
coordinates: { lat: 44.9633, lng: -92.9652 },
|
|
},
|
|
{
|
|
stopId: 3,
|
|
customer: "Michael Taylor - Job #2308",
|
|
address: "909 South Blvd, Maplewood, MN",
|
|
serviceType: "Install 3,200 sq ft Sod",
|
|
estimatedTime: "12:15",
|
|
duration: 150,
|
|
status: "not started",
|
|
coordinates: { lat: 44.953, lng: -92.9952 },
|
|
},
|
|
{
|
|
stopId: 4,
|
|
customer: "Lisa Roberts - Job #2312",
|
|
address: "121 Center St, North St. Paul, MN",
|
|
serviceType: "Install 1,200 sq ft Sod",
|
|
estimatedTime: "15:00",
|
|
duration: 75,
|
|
status: "not started",
|
|
coordinates: { lat: 45.0119, lng: -93.0074 },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
routeId: "MACH-005",
|
|
routeName: "Northwest Machine Route",
|
|
routeType: "Machine Route",
|
|
technician: "Lisa Anderson",
|
|
date: "2025-10-27",
|
|
status: "not started",
|
|
totalStops: 3,
|
|
completedStops: 0,
|
|
estimatedDuration: "5 hours",
|
|
startTime: "07:00",
|
|
vehicleId: "MACH-105",
|
|
totalMileage: 45.2,
|
|
stops: [
|
|
{
|
|
stopId: 1,
|
|
customer: "Ashley White - Job #2320",
|
|
address: "141 Northwest Dr, Plymouth, MN",
|
|
serviceType: "Deliver Trenching Machine",
|
|
estimatedTime: "07:30",
|
|
duration: 90,
|
|
status: "not started",
|
|
coordinates: { lat: 45.0105, lng: -93.4555 },
|
|
},
|
|
{
|
|
stopId: 2,
|
|
customer: "Brian Johnson - Job #2325",
|
|
address: "151 Maple St, Maple Grove, MN",
|
|
serviceType: "Deliver Boring Machine",
|
|
estimatedTime: "09:15",
|
|
duration: 75,
|
|
status: "not started",
|
|
coordinates: { lat: 45.0724, lng: -93.4557 },
|
|
},
|
|
{
|
|
stopId: 3,
|
|
customer: "Christina Davis - Job #2328",
|
|
address: "161 Oak Ave, Osseo, MN",
|
|
serviceType: "Deliver Compactor & Tools",
|
|
estimatedTime: "10:45",
|
|
duration: 60,
|
|
status: "not started",
|
|
coordinates: { lat: 45.1188, lng: -93.4025 },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
routeId: "TRK-006",
|
|
routeName: "Regional Truck Route",
|
|
routeType: "Truck Route",
|
|
technician: "Mark Thompson",
|
|
date: "2025-10-27",
|
|
status: "not started",
|
|
totalStops: 4,
|
|
completedStops: 0,
|
|
estimatedDuration: "6 hours",
|
|
startTime: "06:30",
|
|
vehicleId: "TRUCK-106",
|
|
totalMileage: 78.5,
|
|
stops: [
|
|
{
|
|
stopId: 1,
|
|
customer: "Metro Landscaping - Pickup #445",
|
|
address: "2250 Highway 55, Plymouth, MN",
|
|
serviceType: "Equipment Pickup",
|
|
estimatedTime: "07:00",
|
|
duration: 30,
|
|
status: "not started",
|
|
coordinates: { lat: 45.0153, lng: -93.4233 },
|
|
},
|
|
{
|
|
stopId: 2,
|
|
customer: "Irrigation Supply Co - Order #889",
|
|
address: "1875 Industrial Blvd, Maple Grove, MN",
|
|
serviceType: "Material Pickup",
|
|
estimatedTime: "08:00",
|
|
duration: 45,
|
|
status: "not started",
|
|
coordinates: { lat: 45.0845, lng: -93.4321 },
|
|
},
|
|
{
|
|
stopId: 3,
|
|
customer: "Johnson Properties - Delivery",
|
|
address: "3456 Elm Street, Brooklyn Park, MN",
|
|
serviceType: "Equipment Drop-off",
|
|
estimatedTime: "09:15",
|
|
duration: 60,
|
|
status: "not started",
|
|
coordinates: { lat: 45.0941, lng: -93.3563 },
|
|
},
|
|
{
|
|
stopId: 4,
|
|
customer: "Storage Facility - Return",
|
|
address: "5200 Bass Lake Rd, Crystal, MN",
|
|
serviceType: "Equipment Return",
|
|
estimatedTime: "11:00",
|
|
duration: 45,
|
|
status: "not started",
|
|
coordinates: { lat: 45.0341, lng: -93.3678 },
|
|
},
|
|
],
|
|
},
|
|
];
|
|
|
|
static dummyWarrantyData = [
|
|
{
|
|
id: 1,
|
|
warrantyId: "W-001",
|
|
customer: "John Doe",
|
|
address: "123 Lane Dr, Cityville, MN",
|
|
originalJobId: "JOB001",
|
|
issueDescription: "Sprinkler head not rotating properly",
|
|
dateReported: "2024-10-20",
|
|
priority: "medium",
|
|
status: "open",
|
|
assignedTechnician: "Mike Johnson",
|
|
estimatedCompletionDate: "2024-10-25",
|
|
warrantyType: "Parts & Labor",
|
|
systemType: "Residential Irrigation",
|
|
},
|
|
{
|
|
id: 2,
|
|
warrantyId: "W-002",
|
|
customer: "Jane Smith",
|
|
address: "456 Oak St, Townsville, CA",
|
|
originalJobId: "JOB002",
|
|
issueDescription: "Controller not responding to schedule",
|
|
dateReported: "2024-10-18",
|
|
priority: "high",
|
|
status: "in progress",
|
|
assignedTechnician: "Sarah Johnson",
|
|
estimatedCompletionDate: "2024-10-23",
|
|
warrantyType: "Parts Only",
|
|
systemType: "Commercial Irrigation",
|
|
},
|
|
{
|
|
id: 3,
|
|
warrantyId: "W-003",
|
|
customer: "Mike Johnson",
|
|
address: "789 Pine Rd, Villagetown, TX",
|
|
originalJobId: "JOB003",
|
|
issueDescription: "Multiple zones not activating",
|
|
dateReported: "2024-10-15",
|
|
priority: "high",
|
|
status: "completed",
|
|
assignedTechnician: "David Martinez",
|
|
estimatedCompletionDate: "2024-10-20",
|
|
warrantyType: "Labor Only",
|
|
systemType: "Residential Irrigation",
|
|
},
|
|
{
|
|
id: 4,
|
|
warrantyId: "W-004",
|
|
customer: "Emily Davis",
|
|
address: "321 Maple Ave, Hamlet, FL",
|
|
originalJobId: "JOB004",
|
|
issueDescription: "Low water pressure in all zones",
|
|
dateReported: "2024-10-22",
|
|
priority: "medium",
|
|
status: "open",
|
|
assignedTechnician: null,
|
|
estimatedCompletionDate: "2024-10-28",
|
|
warrantyType: "Parts & Labor",
|
|
systemType: "Residential Irrigation",
|
|
},
|
|
{
|
|
id: 5,
|
|
warrantyId: "W-005",
|
|
customer: "David Wilson",
|
|
address: "654 Cedar Blvd, Borough, NY",
|
|
originalJobId: "JOB005",
|
|
issueDescription: "Valve stuck in open position",
|
|
dateReported: "2024-10-19",
|
|
priority: "high",
|
|
status: "in progress",
|
|
assignedTechnician: "Chris Wilson",
|
|
estimatedCompletionDate: "2024-10-24",
|
|
warrantyType: "Parts & Labor",
|
|
systemType: "Commercial Irrigation",
|
|
},
|
|
{
|
|
id: 6,
|
|
warrantyId: "W-006",
|
|
customer: "Sarah Brown",
|
|
address: "987 Birch Ln, Metropolis, IL",
|
|
originalJobId: "JOB006",
|
|
issueDescription: "Broken sprinkler head causing water waste",
|
|
dateReported: "2024-10-21",
|
|
priority: "low",
|
|
status: "open",
|
|
assignedTechnician: null,
|
|
estimatedCompletionDate: "2024-10-30",
|
|
warrantyType: "Parts Only",
|
|
systemType: "Residential Irrigation",
|
|
},
|
|
{
|
|
id: 7,
|
|
warrantyId: "W-007",
|
|
customer: "Chris Taylor",
|
|
address: "159 Spruce Ct, Capital City, WA",
|
|
originalJobId: "JOB007",
|
|
issueDescription: "Timer programming lost after power outage",
|
|
dateReported: "2024-10-17",
|
|
priority: "medium",
|
|
status: "completed",
|
|
assignedTechnician: "Mike Johnson",
|
|
estimatedCompletionDate: "2024-10-22",
|
|
warrantyType: "Labor Only",
|
|
systemType: "Commercial Irrigation",
|
|
},
|
|
{
|
|
id: 8,
|
|
warrantyId: "W-008",
|
|
customer: "Amanda Martinez",
|
|
address: "753 Willow Dr, Smalltown, OH",
|
|
originalJobId: "JOB008",
|
|
issueDescription: "Pipe leak causing flooding in lawn",
|
|
dateReported: "2024-10-16",
|
|
priority: "high",
|
|
status: "in progress",
|
|
assignedTechnician: "Sarah Johnson",
|
|
estimatedCompletionDate: "2024-10-23",
|
|
warrantyType: "Parts & Labor",
|
|
systemType: "Residential Irrigation",
|
|
},
|
|
{
|
|
id: 9,
|
|
warrantyId: "W-009",
|
|
customer: "Joshua Anderson",
|
|
address: "852 Aspen Rd, Bigcity, NJ",
|
|
originalJobId: "JOB009",
|
|
issueDescription: "Sprinkler coverage uneven after installation",
|
|
dateReported: "2024-10-14",
|
|
priority: "low",
|
|
status: "open",
|
|
assignedTechnician: "David Martinez",
|
|
estimatedCompletionDate: "2024-10-29",
|
|
warrantyType: "Labor Only",
|
|
systemType: "Residential Irrigation",
|
|
},
|
|
{
|
|
id: 10,
|
|
warrantyId: "W-010",
|
|
customer: "Olivia Thomas",
|
|
address: "147 Cypress St, Uptown, GA",
|
|
originalJobId: "JOB010",
|
|
issueDescription: "Rain sensor not functioning properly",
|
|
dateReported: "2024-10-13",
|
|
priority: "medium",
|
|
status: "completed",
|
|
assignedTechnician: "Chris Wilson",
|
|
estimatedCompletionDate: "2024-10-18",
|
|
warrantyType: "Parts Only",
|
|
systemType: "Commercial Irrigation",
|
|
},
|
|
];
|
|
|
|
static dummyTimesheetData = [
|
|
// Current week entries (Oct 25-31, 2025)
|
|
{
|
|
id: 1,
|
|
timesheetId: "TS-2025-001",
|
|
employee: "Mike Thompson",
|
|
employeeId: "EMP001",
|
|
date: "2025-10-25",
|
|
weekOf: "2025-10-21",
|
|
jobId: "JOB001",
|
|
customer: "John Doe",
|
|
address: "123 Lane Dr, Cityville, MN",
|
|
taskDescription: "Sprinkler System Installation - Zone 1-4",
|
|
clockIn: "07:30",
|
|
clockOut: "17:00",
|
|
breakTime: 30, // minutes
|
|
regularHours: 9.0,
|
|
overtimeHours: 0.5,
|
|
totalHours: 9.5,
|
|
status: "submitted",
|
|
approved: false,
|
|
approvedBy: null,
|
|
approvedDate: null,
|
|
hourlyRate: 28.5,
|
|
overtimeRate: 42.75,
|
|
totalPay: 292.88,
|
|
notes: "Completed main line installation and zone 1-4 heads",
|
|
equipment: ["Trencher", "Compactor", "Hand tools"],
|
|
mileage: 45,
|
|
materials: ["PVC Pipe - 200ft", "Sprinkler Heads - 15", "Valves - 4"],
|
|
},
|
|
{
|
|
id: 2,
|
|
timesheetId: "TS-2025-002",
|
|
employee: "Sarah Johnson",
|
|
employeeId: "EMP002",
|
|
date: "2025-10-25",
|
|
weekOf: "2025-10-21",
|
|
jobId: "JOB007",
|
|
customer: "Chris Taylor",
|
|
address: "159 Spruce Ct, Capital City, WA",
|
|
taskDescription: "Zone Expansion Install",
|
|
clockIn: "08:00",
|
|
clockOut: "16:30",
|
|
breakTime: 30,
|
|
regularHours: 8.0,
|
|
overtimeHours: 0,
|
|
totalHours: 8.0,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Lisa Anderson",
|
|
approvedDate: "2025-10-26",
|
|
hourlyRate: 26.0,
|
|
overtimeRate: 39.0,
|
|
totalPay: 208.0,
|
|
notes: "Added 3 new zones, tested all systems",
|
|
equipment: ["Boring machine", "Hand tools"],
|
|
mileage: 32,
|
|
materials: [
|
|
"Irrigation tubing - 150ft",
|
|
"Sprinkler Heads - 8",
|
|
"Control wire - 300ft",
|
|
],
|
|
},
|
|
{
|
|
id: 3,
|
|
timesheetId: "TS-2025-003",
|
|
employee: "David Martinez",
|
|
employeeId: "EMP003",
|
|
date: "2025-10-25",
|
|
weekOf: "2025-10-21",
|
|
jobId: "JOB012",
|
|
customer: "Sophia White",
|
|
address: "258 Palm Blvd, Riverside, AZ",
|
|
taskDescription: "Drip System Repair & Maintenance",
|
|
clockIn: "07:00",
|
|
clockOut: "15:30",
|
|
breakTime: 30,
|
|
regularHours: 8.0,
|
|
overtimeHours: 0,
|
|
totalHours: 8.0,
|
|
status: "draft",
|
|
approved: false,
|
|
approvedBy: null,
|
|
approvedDate: null,
|
|
hourlyRate: 24.5,
|
|
overtimeRate: 36.75,
|
|
totalPay: 196.0,
|
|
notes: "Repaired multiple leaks in drip lines, replaced emitters",
|
|
equipment: ["Hand tools", "Pressure gauge"],
|
|
mileage: 28,
|
|
materials: ["Drip tubing - 50ft", "Emitters - 25", "Fittings - misc"],
|
|
},
|
|
{
|
|
id: 4,
|
|
timesheetId: "TS-2025-004",
|
|
employee: "Chris Wilson",
|
|
employeeId: "EMP004",
|
|
date: "2025-10-24",
|
|
weekOf: "2025-10-21",
|
|
jobId: "JOB003",
|
|
customer: "Mike Johnson",
|
|
address: "789 Pine Rd, Villagetown, TX",
|
|
taskDescription: "Controller Programming & System Testing",
|
|
clockIn: "09:00",
|
|
clockOut: "17:30",
|
|
breakTime: 60,
|
|
regularHours: 7.5,
|
|
overtimeHours: 0,
|
|
totalHours: 7.5,
|
|
status: "submitted",
|
|
approved: false,
|
|
approvedBy: null,
|
|
approvedDate: null,
|
|
hourlyRate: 30.0,
|
|
overtimeRate: 45.0,
|
|
totalPay: 225.0,
|
|
notes: "Programmed new smart controller, tested all 8 zones",
|
|
equipment: ["Laptop", "Multimeter", "Hand tools"],
|
|
mileage: 42,
|
|
materials: ["Smart Controller - 1", "Wire nuts - 10"],
|
|
},
|
|
{
|
|
id: 5,
|
|
timesheetId: "TS-2025-005",
|
|
employee: "Lisa Anderson",
|
|
employeeId: "EMP005",
|
|
date: "2025-10-24",
|
|
weekOf: "2025-10-21",
|
|
jobId: "JOB017",
|
|
customer: "Ethan Walker",
|
|
address: "456 Walnut Rd, Meadowbrook, ND",
|
|
taskDescription: "Backflow Prevention Installation",
|
|
clockIn: "08:30",
|
|
clockOut: "16:00",
|
|
breakTime: 30,
|
|
regularHours: 7.0,
|
|
overtimeHours: 0,
|
|
totalHours: 7.0,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Mike Thompson",
|
|
approvedDate: "2025-10-25",
|
|
hourlyRate: 27.5,
|
|
overtimeRate: 41.25,
|
|
totalPay: 192.5,
|
|
notes: "Installed backflow preventer, pressure testing completed",
|
|
equipment: ["Pipe cutter", "Threading machine", "Pressure tester"],
|
|
mileage: 38,
|
|
materials: ["Backflow Preventer - 1", "Copper fittings - misc", "Solder"],
|
|
},
|
|
{
|
|
id: 6,
|
|
timesheetId: "TS-2025-006",
|
|
employee: "Mike Thompson",
|
|
employeeId: "EMP001",
|
|
date: "2025-10-23",
|
|
weekOf: "2025-10-21",
|
|
jobId: "JOB015",
|
|
customer: "Andrew Lewis",
|
|
address: "357 Dogwood Dr, Lakeview, VT",
|
|
taskDescription: "System Winterization",
|
|
clockIn: "07:30",
|
|
clockOut: "15:00",
|
|
breakTime: 30,
|
|
regularHours: 7.0,
|
|
overtimeHours: 0,
|
|
totalHours: 7.0,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Lisa Anderson",
|
|
approvedDate: "2025-10-24",
|
|
hourlyRate: 28.5,
|
|
overtimeRate: 42.75,
|
|
totalPay: 199.5,
|
|
notes: "Winterized entire system, drained all lines and components",
|
|
equipment: ["Air compressor", "Hand tools"],
|
|
mileage: 55,
|
|
materials: ["Compressed air", "Antifreeze - 2 gallons"],
|
|
},
|
|
// Previous week entries (Oct 14-20, 2025)
|
|
{
|
|
id: 7,
|
|
timesheetId: "TS-2025-007",
|
|
employee: "Sarah Johnson",
|
|
employeeId: "EMP002",
|
|
date: "2025-10-20",
|
|
weekOf: "2025-10-14",
|
|
jobId: "JOB010",
|
|
customer: "Olivia Thomas",
|
|
address: "147 Cypress St, Uptown, GA",
|
|
taskDescription: "Emergency Repair - Main Line Leak",
|
|
clockIn: "07:00",
|
|
clockOut: "18:30",
|
|
breakTime: 30,
|
|
regularHours: 8.0,
|
|
overtimeHours: 3.0,
|
|
totalHours: 11.0,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Mike Thompson",
|
|
approvedDate: "2025-10-21",
|
|
hourlyRate: 26.0,
|
|
overtimeRate: 39.0,
|
|
totalPay: 325.0,
|
|
notes: "Emergency call - repaired major main line break",
|
|
equipment: ["Excavator", "Pipe cutter", "Hand tools"],
|
|
mileage: 67,
|
|
materials: ["PVC Pipe - 20ft", "Couplings - 4", "Pipe cement"],
|
|
},
|
|
{
|
|
id: 8,
|
|
timesheetId: "TS-2025-008",
|
|
employee: "David Martinez",
|
|
employeeId: "EMP003",
|
|
date: "2025-10-19",
|
|
weekOf: "2025-10-14",
|
|
jobId: "JOB005",
|
|
customer: "David Wilson",
|
|
address: "654 Cedar Blvd, Borough, NY",
|
|
taskDescription: "Final System Testing & Cleanup",
|
|
clockIn: "08:00",
|
|
clockOut: "16:30",
|
|
breakTime: 30,
|
|
regularHours: 8.0,
|
|
overtimeHours: 0,
|
|
totalHours: 8.0,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Lisa Anderson",
|
|
approvedDate: "2025-10-20",
|
|
hourlyRate: 24.5,
|
|
overtimeRate: 36.75,
|
|
totalPay: 196.0,
|
|
notes: "Final system testing, site cleanup, customer walkthrough",
|
|
equipment: ["Hand tools", "Cleanup supplies"],
|
|
mileage: 25,
|
|
materials: ["Grass seed - 5 lbs", "Topsoil - 2 bags"],
|
|
},
|
|
{
|
|
id: 9,
|
|
timesheetId: "TS-2025-009",
|
|
employee: "Chris Wilson",
|
|
employeeId: "EMP004",
|
|
date: "2025-10-18",
|
|
weekOf: "2025-10-14",
|
|
jobId: "JOB009",
|
|
customer: "Joshua Anderson",
|
|
address: "852 Aspen Rd, Bigcity, NJ",
|
|
taskDescription: "Valve Replacement & Zone Testing",
|
|
clockIn: "08:30",
|
|
clockOut: "17:00",
|
|
breakTime: 30,
|
|
regularHours: 8.0,
|
|
overtimeHours: 0,
|
|
totalHours: 8.0,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Mike Thompson",
|
|
approvedDate: "2025-10-19",
|
|
hourlyRate: 30.0,
|
|
overtimeRate: 45.0,
|
|
totalPay: 240.0,
|
|
notes: "Replaced faulty zone 3 valve, tested all zones for proper operation",
|
|
equipment: ["Trenching shovel", "Hand tools", "Multimeter"],
|
|
mileage: 48,
|
|
materials: ["Zone Valve - 1", "Wire nuts - 5", "Electrical tape"],
|
|
},
|
|
{
|
|
id: 10,
|
|
timesheetId: "TS-2025-010",
|
|
employee: "Lisa Anderson",
|
|
employeeId: "EMP005",
|
|
date: "2025-10-17",
|
|
weekOf: "2025-10-14",
|
|
jobId: "JOB014",
|
|
customer: "Isabella Clark",
|
|
address: "753 Magnolia Ct, Hilltown, SC",
|
|
taskDescription: "Sprinkler Head Adjustments & Coverage Testing",
|
|
clockIn: "09:00",
|
|
clockOut: "16:30",
|
|
breakTime: 30,
|
|
regularHours: 7.0,
|
|
overtimeHours: 0,
|
|
totalHours: 7.0,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Sarah Johnson",
|
|
approvedDate: "2025-10-18",
|
|
hourlyRate: 27.5,
|
|
overtimeRate: 41.25,
|
|
totalPay: 192.5,
|
|
notes: "Adjusted all sprinkler heads for optimal coverage, marked areas needing attention",
|
|
equipment: ["Hand tools", "Measuring tape", "Spray paint"],
|
|
mileage: 33,
|
|
materials: ["Sprinkler Head Adjustment Tools", "Marking flags - 20"],
|
|
},
|
|
// Older entries for reporting
|
|
{
|
|
id: 11,
|
|
timesheetId: "TS-2025-011",
|
|
employee: "Mike Thompson",
|
|
employeeId: "EMP001",
|
|
date: "2025-10-16",
|
|
weekOf: "2025-10-14",
|
|
jobId: "JOB006",
|
|
customer: "Sarah Brown",
|
|
address: "987 Birch Ln, Metropolis, IL",
|
|
taskDescription: "Site Survey & Design Planning",
|
|
clockIn: "08:00",
|
|
clockOut: "15:30",
|
|
breakTime: 30,
|
|
regularHours: 7.0,
|
|
overtimeHours: 0,
|
|
totalHours: 7.0,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Lisa Anderson",
|
|
approvedDate: "2025-10-17",
|
|
hourlyRate: 28.5,
|
|
overtimeRate: 42.75,
|
|
totalPay: 199.5,
|
|
notes: "Completed site survey, created design plan for 4-zone expansion",
|
|
equipment: ["Measuring wheel", "Stake flags", "Camera"],
|
|
mileage: 40,
|
|
materials: ["Survey stakes - 50", "Flagging tape - 1 roll"],
|
|
},
|
|
{
|
|
id: 12,
|
|
timesheetId: "TS-2025-012",
|
|
employee: "Sarah Johnson",
|
|
employeeId: "EMP002",
|
|
date: "2025-10-15",
|
|
weekOf: "2025-10-14",
|
|
jobId: "MAINT-001",
|
|
customer: "Multiple Properties",
|
|
address: "Various - See route sheet",
|
|
taskDescription: "Routine Maintenance Route - North Valley",
|
|
clockIn: "07:00",
|
|
clockOut: "16:00",
|
|
breakTime: 30,
|
|
regularHours: 8.5,
|
|
overtimeHours: 0,
|
|
totalHours: 8.5,
|
|
status: "approved",
|
|
approved: true,
|
|
approvedBy: "Mike Thompson",
|
|
approvedDate: "2025-10-16",
|
|
hourlyRate: 26.0,
|
|
overtimeRate: 39.0,
|
|
totalPay: 221.0,
|
|
notes: "Completed maintenance on 8 properties - routine checks and minor adjustments",
|
|
equipment: ["Service truck", "Hand tools", "Pressure gauge"],
|
|
mileage: 85,
|
|
materials: ["Sprinkler heads - 3", "Nozzles - 5", "Wire nuts - 10"],
|
|
},
|
|
];
|
|
|
|
static US_STATES = [
|
|
"AL",
|
|
"AK",
|
|
"AZ",
|
|
"AR",
|
|
"CA",
|
|
"CO",
|
|
"CT",
|
|
"DE",
|
|
"FL",
|
|
"GA",
|
|
"HI",
|
|
"ID",
|
|
"IL",
|
|
"IN",
|
|
"IA",
|
|
"KS",
|
|
"KY",
|
|
"LA",
|
|
"ME",
|
|
"MD",
|
|
"MA",
|
|
"MI",
|
|
"MN",
|
|
"MS",
|
|
"MO",
|
|
"MT",
|
|
"NE",
|
|
"NV",
|
|
"NH",
|
|
"NJ",
|
|
"NM",
|
|
"NY",
|
|
"NC",
|
|
"ND",
|
|
"OH",
|
|
"OK",
|
|
"OR",
|
|
"PA",
|
|
"RI",
|
|
"SC",
|
|
"SD",
|
|
"TN",
|
|
"TX",
|
|
"UT",
|
|
"VT",
|
|
"VA",
|
|
"WA",
|
|
"WV",
|
|
"WI",
|
|
"WY",
|
|
];
|
|
|
|
static toSnakeCaseObject(obj) {
|
|
const newObj = Object.entries(obj).reduce((acc, [key, value]) => {
|
|
const snakeKey = key.replace(/[A-Z]/g, (match) => "_" + match.toLowerCase());
|
|
if (Array.isArray(value)) {
|
|
value = value.map((item) => {
|
|
return Object.prototype.toString.call(item) === "[object Object]"
|
|
? this.toSnakeCaseObject(item)
|
|
: item;
|
|
});
|
|
} else if (Object.prototype.toString.call(value) === "[object Object]") {
|
|
value = this.toSnakeCaseObject(value);
|
|
}
|
|
acc[snakeKey] = value;
|
|
return acc;
|
|
}, {});
|
|
console.log("DEBUG: toSnakeCaseObject -> newObj", newObj);
|
|
return newObj;
|
|
}
|
|
|
|
static toCamelCaseObject(obj) {
|
|
const newObj = Object.entries(obj).reduce((acc, [key, value]) => {
|
|
const camelKey = key.replace(/_([a-z])/g, (match, p1) => p1.toUpperCase());
|
|
// check if value is an array
|
|
if (Array.isArray(value)) {
|
|
value = value.map((item) => {
|
|
return Object.prototype.toString.call(item) === "[object Object]"
|
|
? this.toCamelCaseObject(item)
|
|
: item;
|
|
});
|
|
} else if (Object.prototype.toString.call(value) === "[object Object]") {
|
|
value = this.toCamelCaseObject(value);
|
|
}
|
|
acc[camelKey] = value;
|
|
return acc;
|
|
}, {});
|
|
console.log("DEBUG: toCamelCaseObject -> newObj", newObj);
|
|
return newObj;
|
|
}
|
|
}
|
|
|
|
export default DataUtils;
|