diff --git a/force-app/main/default/classes/SummitEventsReadShared.cls b/force-app/main/default/classes/SummitEventsReadShared.cls index 4f2c7083..4f4166eb 100644 --- a/force-app/main/default/classes/SummitEventsReadShared.cls +++ b/force-app/main/default/classes/SummitEventsReadShared.cls @@ -227,7 +227,8 @@ public without sharing class SummitEventsReadShared { return new Map([ SELECT Id, Name, Title__c, Description__c, Appointment_Type__c, Appointment_Category__c, Appointment_Limits__c, Chosen_State__c, Registrant_Input__c, Custom_Picklist__c, Sort_Order__c, Auto_Confirm_Appointment__c, Auto_add_building__c, Auto_Add_Time__c, Do_Not_Show_Time__c, - Date_Available_Start__c, Date_Available_End__c, Day_of_Week_Availability__c, Required_Appointment__c, Appointment_Type_Status__c + Date_Available_Start__c, Date_Available_End__c, Day_of_Week_Availability__c, Required_Appointment__c, Appointment_Type_Status__c, + Enforce_Registrations_Limit__c, Appointment_Registrations_Limit__c FROM Summit_Events_Appointment_Type__c WHERE Summit_Events__c = :eventId AND (Restrict_To_Instance_Title__r.Instance_Title__c = :instanceTitle OR Restrict_To_Instance_Title__r.Instance_Title__c = NULL) diff --git a/force-app/main/default/classes/SummitEventsRegisterAppointmentCtlr.cls b/force-app/main/default/classes/SummitEventsRegisterAppointmentCtlr.cls index 93751646..0de4fdc4 100644 --- a/force-app/main/default/classes/SummitEventsRegisterAppointmentCtlr.cls +++ b/force-app/main/default/classes/SummitEventsRegisterAppointmentCtlr.cls @@ -58,6 +58,8 @@ public with sharing class SummitEventsRegisterAppointmentCtlr { //Build available appointments appointments = SummitEventsREadShared.getAppointmentTypesByEventId(eventInformation.eventId, evtInstance.Instance_Title__c, evtInstance.Instance_Start_Date__c, evtInstance.Instance_End_Date__c, dayOfWeek); + removeAppointmentsWithExceedingRegistrationLimit(appointments, evtInstance); + formattedNavDate = SummitEventsShared.navBreadcrumbBuilder(evtInstance); //Check if the user gets to select any appointments or they are all auto added @@ -224,6 +226,33 @@ public with sharing class SummitEventsRegisterAppointmentCtlr { return pageFlow.get('Previous'); } + private static void removeAppointmentsWithExceedingRegistrationLimit(Map appointments, Summit_Events_Instance__c evtInstance){ + AggregateResult[] eventAppointmentCounts = [ + SELECT Count(Id) aCount, Event_Appointment_Type__c + FROM Summit_Events_Appointments__c + WHERE Event_Appointment_Type__r.Enforce_Registrations_Limit__c = TRUE + AND Event_Registration__r.Event_Instance__c =: evtInstance.Id + GROUP BY Event_Appointment_Type__c + ]; + + Map appointmentTypeIdMapToCount = new Map(); + for (AggregateResult ar : eventAppointmentCounts) { + appointmentTypeIdMapToCount.put((Id) ar.get('Event_Appointment_Type__c'), (Integer) ar.get('aCount')); + } + + List unavailableAppointments = new List(); + for(Summit_Events_Appointment_Type__c apt : appointments.values()){ + if(apt.Enforce_Registrations_Limit__c && appointmentTypeIdMapToCount.containsKey(apt.Id)){ + if(appointmentTypeIdMapToCount.get(apt.Id) >= apt.Appointment_Registrations_Limit__c){ + unavailableAppointments.add(apt.Id); + } + } + } + for(Id unavailableAppointmentId : unavailableAppointments){ + appointments.remove(unavailableAppointmentId); + } + } + /** * Summit Events is a multi-step, guest user, registration solution so CRUD work needs to be done on records where guest record ownership is lost between steps. * The security aspects of guest record updating is achieved by: diff --git a/force-app/main/default/layouts/Summit_Events_Appointment_Type__c-Summit Events Appointment Default Layout.layout-meta.xml b/force-app/main/default/layouts/Summit_Events_Appointment_Type__c-Summit Events Appointment Default Layout.layout-meta.xml index eec601e8..63c717fa 100644 --- a/force-app/main/default/layouts/Summit_Events_Appointment_Type__c-Summit Events Appointment Default Layout.layout-meta.xml +++ b/force-app/main/default/layouts/Summit_Events_Appointment_Type__c-Summit Events Appointment Default Layout.layout-meta.xml @@ -19,6 +19,14 @@ Required Title__c + + Edit + Appointment_Registrations_Limit__c + + + Edit + Enforce_Registrations_Limit__c + diff --git a/force-app/main/default/objects/Summit_Events_Appointment_Type__c/fields/Appointment_Registrations_Limit__c.field-meta.xml b/force-app/main/default/objects/Summit_Events_Appointment_Type__c/fields/Appointment_Registrations_Limit__c.field-meta.xml new file mode 100644 index 00000000..4d6f5649 --- /dev/null +++ b/force-app/main/default/objects/Summit_Events_Appointment_Type__c/fields/Appointment_Registrations_Limit__c.field-meta.xml @@ -0,0 +1,13 @@ + + + Appointment_Registrations_Limit__c + 9999 + false + + 18 + false + 0 + false + Number + false + \ No newline at end of file diff --git a/force-app/main/default/objects/Summit_Events_Appointment_Type__c/fields/Enforce_Registrations_Limit__c.field-meta.xml b/force-app/main/default/objects/Summit_Events_Appointment_Type__c/fields/Enforce_Registrations_Limit__c.field-meta.xml new file mode 100644 index 00000000..65045409 --- /dev/null +++ b/force-app/main/default/objects/Summit_Events_Appointment_Type__c/fields/Enforce_Registrations_Limit__c.field-meta.xml @@ -0,0 +1,8 @@ + + + Enforce_Registrations_Limit__c + false + + false + Checkbox + diff --git a/force-app/main/default/permissionsets/Summit_Events_Admin.permissionset-meta.xml b/force-app/main/default/permissionsets/Summit_Events_Admin.permissionset-meta.xml index 2780d161..5bcc6245 100644 --- a/force-app/main/default/permissionsets/Summit_Events_Admin.permissionset-meta.xml +++ b/force-app/main/default/permissionsets/Summit_Events_Admin.permissionset-meta.xml @@ -87,6 +87,11 @@ Summit_Events_Appointment_Type__c.Appointment_Limits__c true + + true + Summit_Events_Appointment_Type__c.Appointment_Registrations_Limit__c + true + true Summit_Events_Appointment_Type__c.Appointment_Type__c @@ -142,6 +147,11 @@ Summit_Events_Appointment_Type__c.Do_Not_Show_Time__c true + + true + Summit_Events_Appointment_Type__c.Enforce_Registrations_Limit__c + true + true Summit_Events_Appointment_Type__c.Registrant_Input__c diff --git a/force-app/main/default/permissionsets/Summit_Events_Registrant.permissionset-meta.xml b/force-app/main/default/permissionsets/Summit_Events_Registrant.permissionset-meta.xml index 141e344d..a923f970 100644 --- a/force-app/main/default/permissionsets/Summit_Events_Registrant.permissionset-meta.xml +++ b/force-app/main/default/permissionsets/Summit_Events_Registrant.permissionset-meta.xml @@ -105,6 +105,16 @@ Summit_Events_Appointment_Type__c.Required_Appointment__c true + + false + Summit_Events_Appointment_Type__c.Enforce_Registrations_Limit__c + true + + + false + Summit_Events_Appointment_Type__c.Appointment_Registrations_Limit__c + true + false Summit_Events_Appointment_Type__c.Restrict_To_Instance_Title__c diff --git a/force-app/test/default/classes/SummitEventsRegisterAppointment_TEST.cls b/force-app/test/default/classes/SummitEventsRegisterAppointment_TEST.cls index 50b0343b..dc27d2cf 100644 --- a/force-app/test/default/classes/SummitEventsRegisterAppointment_TEST.cls +++ b/force-app/test/default/classes/SummitEventsRegisterAppointment_TEST.cls @@ -11,6 +11,10 @@ private class SummitEventsRegisterAppointment_TEST { List seaTestInstances = SummitEventsTestSharedDataFactory.createTestEvent(); Summit_Events_Registration__c seaTestRegistration = SummitEventsTestSharedDataFactory.createEventRegistration(seaTestInstances[1], 'TestFirst', 'TestLast', 'test@valleyhill.net', '55418', '1971-03-22', '2012', null); List testAppointmentTypes = SummitEventsTestSharedDataFactory.createAppointmentTypes(seaTestInstances[1].Event__c); + Summit_Events_Appointment_Type__c limitedAppointType = testAppointmentTypes[0]; + limitedAppointType.Appointment_Registrations_Limit__c = 1; + limitedAppointType.Enforce_Registrations_Limit__c = true; + update limitedAppointType; User testUser = SummitEventsTestSharedDataFactory.userToRunWith('Standard User', 'Summit_Events_Registrant'); @@ -70,6 +74,7 @@ private class SummitEventsRegisterAppointment_TEST { //run constructor again to simulate page load after save seaTestRegistration.UG_Event_Appointments__r.add(new Summit_Events_Appointments__c(Client_Created_Appointment__c = true)); optionsCtrl = new SummitEventsRegisterAppointmentCtlr(); + System.assertEquals(optionsCtrl.appointments.size(), 4); Test.stopTest(); } }