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.
- Gå til Felt og relasjoner fra objektbehandlingsinnstillingene for Tjenesteressurser.
- Klikk på Ny.
- Velg Avmerkingsboks, og klikk deretter på Neste.
- Skriv OvertimeEnabled i Feltetikett-feltet, og klikk deretter på Neste.
- Konfigurer feltnivåsikkerhet og gi tilgang til de nødvendige profilene, og klikk deretter på Neste.
- Lagre endringene.
- Skriv inn Planleggingspolicyer i Hurtigsøk-feltet i Oppsett, og velg deretter Planleggingspolicyer.
- Velg Bruk tjenesteområdemedlemmets skiftplanleggingspolicy, og fjern deretter merket for Bruk tjenesteområdets åpningstider til planleggingspolicy for skift.
- Gå til Utløsere fra innstillingene for objektbehandling for skift.
- Klikk på Ny.
-
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 '); } } } } - Lagre endringene.
