public without sharing class MaintenanceRequestTriggerHandler { /** * Handles before insert logic for Maintenance Request records * Automatically assigns workers based on request type and updates status to Assigned */ public static void handleBeforeInsert(List newRequests) { // Map to store request type to worker type mappings Map requestTypeToWorkerType = new Map{ 'Plumbing' => 'Plumbing', 'Electrical' => 'Electrical', 'HVAC' => 'HVAC (Heating & Cooling)', 'Appliance' => 'Appliance Repair', 'Carpentry' => 'General Carpentry', 'Landscaping' => 'Landscaping / Grounds', 'Cleaning' => 'Janitorial / Cleaning', 'Pest' => 'Pest Control' }; // Collect unique worker types needed Set workerTypesNeeded = new Set(); for (Maintenance_Request__c request : newRequests) { if (request.Type__c != null && requestTypeToWorkerType.containsKey(request.Type__c)) { workerTypesNeeded.add(requestTypeToWorkerType.get(request.Type__c)); } } // Query for available workers by type Map> workersByType = new Map>(); if (!workerTypesNeeded.isEmpty()) { for (Maintenance_Worker__c worker : [ SELECT Id, Name, Type__c, Rating__c FROM Maintenance_Worker__c WHERE Type__c IN :workerTypesNeeded AND IsActive__c = true ORDER BY Rating__c DESC NULLS LAST, Name ASC ]) { if (!workersByType.containsKey(worker.Type__c)) { workersByType.put(worker.Type__c, new List()); } workersByType.get(worker.Type__c).add(worker); } } // Assign workers to requests for (Maintenance_Request__c request : newRequests) { // Only process requests with 'New' status (or null, since 'New' is the default) if ((request.Status__c == 'New' || request.Status__c == null) && request.Type__c != null && requestTypeToWorkerType.containsKey(request.Type__c)) { String workerType = requestTypeToWorkerType.get(request.Type__c); // Check if we have available workers for this type if (workersByType.containsKey(workerType) && !workersByType.get(workerType).isEmpty()) { // Assign the first available worker (highest rated) Maintenance_Worker__c assignedWorker = workersByType.get(workerType).get(0); request.Assigned_Worker__c = assignedWorker.Id; request.Status__c = 'Assigned'; // Set scheduled date to 3 days from now request.Scheduled__c = DateTime.now().addDays(3); // Rotate worker to end of list for round-robin assignment workersByType.get(workerType).remove(0); workersByType.get(workerType).add(assignedWorker); } } } } }