Loading
Behandle avtaler med Salesforce Scheduler
Begrense arbeidstimer selektivt

Begrense arbeidstimer selektivt

Hvis du aktiverer policyen Bruk tjenesteområdets åpningstider sammen med skiftplanlegging, bruker Salesforce Scheduler overlappingen mellom skift og tjenesteområdets åpningstider til å bestemme tilgjengeligheten av alle tjenesteressurser. Hvis du vil begrense arbeidstider til tjenesteområdets åpningstider, men bare for noen få tjenesteressurser, bruker du utløsere.

Nødvendige utgaver

Tilgjengelig i Lightning Experience.
Tilgjengelig i Enterprise og Unlimited Edition

Opprett først et tilpasset boolsk felt, OvertimeEnabled, for å angi ressursene som kan arbeide utenfor tjenesteområdets åpningstider. Deretter endrer du planleggingspolicyer slik at bare skift for tjenesteområdemedlemmer brukes til å bestemme tilgjengeligheten av tjenesteressurser for avtaler. Opprett deretter en Apex-utløser for Skift-objektet som kjører før et skift opprettes og oppdateres. Utløseren validerer skifttidene og sørger for at skifttidene er innenfor tjenesteområdets åpningstider for ressurser der OvertimeEnabled-feltet er usann.

  1. Gå til Felt og relasjoner fra objektbehandlingsinnstillingene for Tjenesteressurser.
  2. Klikk på Ny.
  3. Velg Avmerkingsboks, og klikk deretter på Neste.
  4. Skriv OvertimeEnabled i Feltetikett-feltet, og klikk deretter på Neste.
  5. Konfigurer feltnivåsikkerhet og gi tilgang til de nødvendige profilene, og klikk deretter på Neste.
  6. Lagre endringene.
  7. Skriv inn Planleggingspolicyer i Hurtigsøk-feltet i Oppsett, og velg deretter Planleggingspolicyer.
  8. Velg Bruk tjenesteområdemedlemmets skiftplanleggingspolicy, og fjern deretter merket for Bruk tjenesteområdets åpningstider til planleggingspolicy for skift.
  9. Gå til Utløsere fra innstillingene for objektbehandling for skift.
  10. Klikk på Ny.
  11. Erstatt standardkoden med denne koden.
    trigger ShiftValidation on Shift (before insert, before update) {
        List<Shift> shifts = Trigger.new;
    
        Set<String> sr = new Set<String>();
        for(Shift shift: shifts) {
            sr.add(shift.ServiceResourceId);
        }
        
        List<ServiceResource> extendedSr = [SELECT Id FROM ServiceResource WHERE  OvertimeEnabled__c = False AND Id IN :sr];
        
        Set<String> srIds = new Set<String>();
        for(ServiceResource sr1: extendedSr) {
            srIds.add(sr1.Id);
        }
        
        Set<Shift> confirmedShifts = new Set<Shift>();
        Set<String> territoryIds = new Set<String>();
        //We will only run this validation for Shifts with Status Category = "Confirmed" AND Service Resource can work extended hours
        for(Shift shift: shifts) {
            if(shift.StatusCategory == 'Confirmed' && srIds.contains(shift.ServiceResourceId)) {
                confirmedShifts.add(shift);
                territoryIds.add(shift.ServiceTerritoryId);
            }
        }
    
        if(confirmedShifts.size() > 0) {
            //Get all Service Territory IDs along with their OperatingHourId
            ServiceTerritory[] territoryIdsWithOperatingHours = [SELECT Id, OperatingHoursId FROM ServiceTerritory WHERE Id IN :territoryIds];
    
            Set<String> operatingHourIds = new Set<String>();
            for(ServiceTerritory st: territoryIdsWithOperatingHours) {
                //Service Territory may not have Operating Hour defined
                if(st.OperatingHoursId != null) {
                    operatingHourIds.add(st.OperatingHoursId);
                }
            }
    
            //Get Timeslot information for all Operating Hours got in previous step. We disregard all STM level concurrent timeslots (Shifts with MaxAppointments set to 1)
            TimeSlot[] timeSlots = [SELECT Id, DayOfWeek, StartTime, EndTime, OperatingHoursId FROM TimeSlot WHERE MaxAppointments = 1 AND OperatingHoursId IN :operatingHourIds];
    
            //Complex data structure to store Working hours for all Service territories. We will store empty inner map in case Service Territory does not have Operating Hour defined
            Map<String, Map<String, TimeSlot>> serviceTerritoryWithTimeSlotsPerDay = new Map<String, Map<String, TimeSlot>>();
    
            for(ServiceTerritory territory: territoryIdsWithOperatingHours) {
                Map<String, TimeSlot> timeSlotsPerDay = new Map<String, TimeSlot>();
    
                for(TimeSlot timeSlot: timeSlots) {
                    if(timeslot.OperatingHoursId == territory.OperatingHoursId) {
                        timeSlotsPerDay.put(TimeSlot.DayOfWeek.substring(0,3), TimeSlot);
                    }
                }
                serviceTerritoryWithTimeSlotsPerDay.put(territory.Id, timeSlotsPerDay);
            }
    
            //Main validation logic for all confirmed shifts
            for(Shift s: confirmedShifts) {
                String dayOfShiftStart = ((Datetime) s.StartTime).format('E').substring(0,3);
                String dayOfShiftEnd = ((Datetime) s.EndTime).format('E').substring(0,3);
    
                Map<String, TimeSlot> slots = serviceTerritoryWithTimeSlotsPerDay.get(s.ServiceTerritoryId);
    
                if(dayOfShiftStart != dayOfShiftEnd) {
                    s.addError('Shift should be within Service Territory\'s Operating hours ');
                } else if(slots.get(dayOfShiftStart) == null || slots.get(dayOfShiftEnd) == null) {
                    s.addError('Operating Hours for Service Territory not set up correctly');
                }else if(s.StartTime.time() < slots.get(dayOfShiftStart).StartTime || s.EndTime.time() > slots.get(dayOfShiftEnd).EndTime) {
                    s.addError('Shift should be within Service Territory\'s Operating hours ');
                }
            }
        }
    }
    
  12. Lagre endringene.
 
Laster
Salesforce Help | Article