public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            ServiceParent parent = null;

            foreach (ServiceParent parentObj in m_ABData.ServiceParent.Values)
            {
                if (parentObj.Id == m_ABData.ServiceToSchedule.ParentRecordId)
                {
                    parent = parentObj;
                    break;
                }
            }

            if (parent == null)
            {
                throw new Exception("Service parent was not retrieved properly");
            }

            //TODO: make generic for all types of parent
            string visitingHoursCalId = parent.VisitingHours__c;

            if (visitingHoursCalId == null)
            {
                return(String.Empty);
            }

            string query = "Select id,TimeZone, " +
                           "(Select DayOfWeek, Type, StartTime, EndTime From TimeSlots order by DayOfWeek, StartTime) " +
                           $"From OperatingHours where id = '{visitingHoursCalId}' limit 1]";

            return(formatQueryString(query));
        }
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            string query;
            string serviceIdStr = formatIdList(new List <string>()
            {
                i_Request.ServiceID
            });

            if (m_TimeDependencies == null)
            {
                query = "SELECT Id, Root_Service_Appointment__c, Dependency__c, Same_Resource__c, Service_Appointment_1__c, " +
                        "Service_Appointment_2__c FROM Time_Dependency__c " +
                        $"WHERE Service_Appointment_1__c = '{i_Request.ServiceID}' OR Service_Appointment_2__c = '{i_Request.ServiceID}'";
            }
            else if (m_TimeDependencies.Any())
            {
                query =
                    "SELECT Id, Root_Service_Appointment__c, Dependency__c, Same_Resource__c, Service_Appointment_1__c, " +
                    $"Service_Appointment_2__c FROM Time_Dependency__c WHERE Root_Service_Appointment__c IN ({serviceIdStr})";
            }
            else
            {
                return(null);
            }

            return(formatQueryString(query));
        }
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            i_ABData.VisitingHours = deserializedQuery.records;
        }
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            //TODO: WO priority and WOLI priority fields need to be queried. Field names are in the Logic settings
            string query = $"select id, MinimumCrewSize, scheduling_priority__c {addRequiredFiledsByRulesAndObjectives()} from WorkOrder where Id = '{m_ABData.ServiceToSchedule.ParentRecordId}'";

            query = formatQueryString(query);
            return(query);
        }
Exemple #5
0
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            //TODO: add support for long responses that has to be pulled with identifier
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            i_ABData.ObjectivesByDevName = parseAdditionalData(deserializedQuery.records);
        }
Exemple #6
0
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            string objectivesQuery = "SELECT Service_Goal__r.Ignore_Home_Base_Coordinates__c,Service_Goal__r.Resource_Priority_Field__c,"
                                     + "Service_Goal__r.Prioritize_Resource__c,Service_Goal__r.Object_Group_Field__c, Service_Goal__r.Resource_Group_Field__c," +
                                     "Weight__c, Service_Goal__r.RecordType.DeveloperName, Service_Goal__r.ID, Service_Goal__r.Name  FROM Scheduling_Policy_Goal__c " +
                                     $"WHERE Scheduling_Policy__c = '{i_Request.PolicyId}' " +
                                     "AND (NOT Service_Goal__r.RecordType.DeveloperName = 'Objective_Custom_Logic') order by Weight__c DESC";

            return(formatQueryString(objectivesQuery));
        }
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            string rulesQuery =
                "SELECT Maximum_Travel_From_Home__c,Maximum_Travel_From_Home_Type__c,Id,Enable_Overtime__c,Name,Object_Group_Field__c, Resource_Property__c" +
                ",Resource_Group_Field__c, RecordType.DeveloperName ,Start_of_Day__c,Break_Start__c,Break_Duration__c,Is_Fixed_Gap__c,Minimum_Gap__c," +
                $" {addRRequiredRuleFields()} FROM Work_Rule__c " +
                $"WHERE Id in (SELECT Work_Rule__c FROM Scheduling_Policy_Work_Rule__c WHERE Scheduling_Policy__c = '{i_Request.PolicyId}')";

            return(formatQueryString(rulesQuery));
        }
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            foreach (PermissionSetAssignment record in deserializedQuery.records)
            {
                m_RelatedRecordIds.Remove(record.AssigneeId);
            }

            i_ABData.UnLicensedUsers = m_RelatedRecordIds;
        }
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            string serviceIdStr = formatIdList(m_MSTServiceIds.ToList());
            string query        = "SELECT Id,Related_Service__c,Same_Day__c,Same_Resource__c,Time_Dependency__c," +
                                  "AppointmentNumber,SchedStartTime, SchedEndTime,ServiceTerritory.OperatingHours.TimeZone, " +
                                  "ServiceTerritoryId, Duration, ParentRecordId, (SELECT AssignedResourceNumber" +
                                  ",ServiceResourceId,EstimatedTravelTimeFrom__c,EstimatedTravelTime,EstimatedTravelDistanceFrom__c," +
                                  " EstimatedTravelDistanceTo__c FROM ServiceResources ORDER BY CreatedDate ASC) " +
                                  $"FROM ServiceAppointment WHERE Id in ({serviceIdStr})";

            return(formatQueryString(query));
        }
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            ServiceAppointment service      = m_ABData.ServiceToSchedule;
            DateTime           minDate      = service.EarliestStartTime.Value.AddDays(-7);
            DateTime           maxDate      = service.DueDate.Value.AddDays(7);
            string             resourcesIds = formatIdList(m_ABData.STMResourcesIDs.ToList());
            string             query        = "select Id, name, IsActive, IsCapacityBased, Efficiency__c, Travel_Speed__c, " +
                                              "RelatedRecordId, ResourceType, ServiceCrewId, (select ServiceResourceId," +
                                              "StartDate,EndDate,ServiceCrewId from ServiceCrewMembers " +
                                              $"where ((StartDate <= {formatDate(maxDate)}) AND (EndDate = null OR EndDate >= {formatDate(minDate)}))) {addRequiredFields(minDate, maxDate)}" +
                                              $" from ServiceResource Where IsActive = true And Id in ({resourcesIds})";

            return(formatQueryString(query));
        }
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            if (m_TimeDependencies == null)
            {
                m_TimeDependencies = new List <Time_Dependency__c>(deserializedQuery.records);
                m_Roots            = new HashSet <string>();
                foreach (Time_Dependency__c dependency in m_TimeDependencies)
                {
                    m_Roots.Add(dependency.Root_Service_Appointment__c);
                }
            }
            else
            {
                if (i_ABData.TimeDependeciesByRootId == null)
                {
                    i_ABData.TimeDependeciesByRootId = new Dictionary <string, List <Time_Dependency__c> >();
                }

                foreach (Time_Dependency__c dependency in deserializedQuery.records)
                {
                    if (!m_TimeDependencies.Contains(dependency))
                    {
                        m_TimeDependencies.Add(dependency);
                    }
                }

                foreach (IGrouping <string, Time_Dependency__c> timeDependencies in m_TimeDependencies.GroupBy(dependency => dependency.Root_Service_Appointment__c))
                {
                    if (!i_ABData.TimeDependeciesByRootId.ContainsKey(timeDependencies.Key))
                    {
                        i_ABData.TimeDependeciesByRootId[timeDependencies.Key] = new List <Time_Dependency__c>();
                    }

                    foreach (Time_Dependency__c dependency in timeDependencies)
                    {
                        i_ABData.TimeDependeciesByRootId[timeDependencies.Key].Add(dependency);
                    }
                }
            }
        }
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            m_RelatedRecordIds = new HashSet <string>();
            foreach (string resourceId in m_ABData.STMResourcesIDs)
            {
                if (m_ABData.CandidatesById.ContainsKey(resourceId))
                {
                    m_RelatedRecordIds.Add(m_ABData.CandidatesById[resourceId].UserId);
                }
            }


            string query = $"Select AssigneeId From PermissionSetAssignment Where AssigneeId in ({formatIdList(m_RelatedRecordIds.ToList())}) " +
                           "and PermissionSet.IsOwnedByProfile = false and" +
                           " PermissionSet.PermissionsFieldServiceScheduling = true";

            return(formatQueryString(query));
        }
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            //TODO: add support for long responses that has to be pulled with identifier
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            parseAdditionalData(deserializedQuery.records);

            i_ABData.RulesByDevName = new Dictionary <string, List <Work_Rule__c> >();
            foreach (Work_Rule__c workRule in deserializedQuery.records)
            {
                if (!i_ABData.RulesByDevName.ContainsKey(workRule.DeveloperName))
                {
                    i_ABData.RulesByDevName[workRule.DeveloperName] = new List <Work_Rule__c>();
                }

                i_ABData.RulesByDevName[workRule.DeveloperName].Add(workRule);
            }
        }
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            string serviceIdStr = formatIdList(new List <string>()
            {
                i_Request.ServiceID
            });
            string query = "SELECT id,status,related_service__c,same_day__c,same_resource__c,time_dependency__c,appointmentnumber"
                           + ",duedate,earlieststarttime,schedstarttime,schedendtime,duration,durationtype,latitude,longitude," +
                           "internalslrgeolocation__latitude__s,internalslrgeolocation__longitude__s,serviceterritoryid," +
                           "schedule_over_lower_priority_appointment__c,use_async_logic__c,mdt_operational_time__c,ismultiday__c" +
                           ",parentrecordid, parentrecordtype,serviceterritory.operatinghours.timezone," +
                           "(SELECT estimated_travel_time_to_source__c," +
                           "estimated_travel_time_from_source__c,assignedresourcenumber,serviceresourceid,estimatedtraveltimefrom__c," +
                           "estimatedtraveltime,estimatedtraveldistancefrom__c,estimatedtraveldistanceto__c,serviceresource.servicecrewid," +
                           "serviceresource.resourcetype,serviceresource.iscapacitybased" +
                           " FROM serviceresources ORDER BY serviceresource.resourcetype desc nulls last, createddate asc nulls last)" +
                           ",(SELECT id FROM service_appointments__r),mds_calculated_length__c {0}" +
                           $" FROM ServiceAppointment WHERE id in ({serviceIdStr})";

            /*
             * query =
             * "select id,status,related_service__c,same_day__c,same_resource__c,time_dependency__c,appointmentnumber,duedate" +
             * ",earlieststarttime,schedstarttime,schedendtime,duration,durationtype,latitude,longitude," +
             * "internalslrgeolocation__latitude__s,internalslrgeolocation__longitude__s,serviceterritoryid," +
             * "schedule_over_lower_priority_appointment__c,use_async_logic__c,mdt_operational_time__c," +
             * "ismultiday__c,parentrecordid,serviceterritory.operatinghours.timezone," +
             * "(select estimated_travel_time_to_source__c,estimated_travel_time_from_source__c,assignedresourcenumber," +
             * "serviceresourceid,estimatedtraveltimefrom__c,estimatedtraveltime,estimatedtraveldistancefrom__c," +
             * "estimatedtraveldistanceto__c,serviceresource.servicecrewid,serviceresource.resourcetype,serviceresource.iscapacitybased " +
             * "from serviceresources order by serviceresource.resourcetype desc nulls last, createddate asc nulls last)" +
             * ",(select id from service_appointments__r),arrivalwindowstarttime,arrivalwindowendtime," +
             * $"mds_calculated_length__c from ServiceAppointment where id in ({serviceIdStr})";
             */

            string requiredRuleFields = addRRequiredRuleFields(query);

            query = string.Format(query, requiredRuleFields);
            return(formatQueryString(query));
        }
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            //TODO: implement this generic for WOLI and Account parents also
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            foreach (ServiceParent parent in deserializedQuery.records)
            {
                if (parent.SkillRequirements == null)
                {
                    parent.SkillRequirements = new List <SkillRequirement>();
                }

                foreach (SkillRequirement skillReq in parent.skillRequirementsCollection.records)
                {
                    parent.SkillRequirements.Add(skillReq);
                }
            }

            i_ABData.ServiceParent = deserializedQuery.records.ToDictionary(parent => parent.Id);
        }
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            ServiceAppointmentUtils serviceUtils = new ServiceAppointmentUtils(i_ABData);
            Dictionary <string, ServiceAppointment> deserializedServices = serviceUtils.parseAdditionalData(deserializedQuery.records);

            foreach (KeyValuePair <string, List <Time_Dependency__c> > dependencyTreeByRoot in i_ABData.TimeDependeciesByRootId)
            {
                foreach (Time_Dependency__c dependency in dependencyTreeByRoot.Value)
                {
                    if (!i_ABData.ServicesById.ContainsKey(dependency.Service_Appointment_1__c))
                    {
                        i_ABData.ServicesById[dependency.Service_Appointment_1__c] = deserializedServices[dependency.Service_Appointment_1__c];
                    }

                    dependency.Service_Appointment_1__r = deserializedServices[dependency.Service_Appointment_1__c];

                    if (!i_ABData.ServicesById.ContainsKey(dependency.Service_Appointment_2__c))
                    {
                        i_ABData.ServicesById[dependency.Service_Appointment_2__c] = deserializedServices[dependency.Service_Appointment_2__c];
                    }

                    dependency.Service_Appointment_2__r = deserializedServices[dependency.Service_Appointment_2__c];

                    if (dependency.Service_Appointment_1__c == dependency.Root_Service_Appointment__c)
                    {
                        dependency.Root_Service_Appointment__r = deserializedServices[dependency.Service_Appointment_1__c];
                    }

                    if (dependency.Service_Appointment_2__c == dependency.Root_Service_Appointment__c)
                    {
                        dependency.Root_Service_Appointment__r = deserializedServices[dependency.Service_Appointment_2__c];
                    }
                }
            }
        }
Exemple #17
0
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            foreach (ServiceTerritoryMember stm in deserializedQuery.records)
            {
                if (stm.m_JSONAdditionalData.TryGetValue("ServiceResource", out var resourceToken))
                {
                    stm.ServiceResource = resourceToken.ToObject <ServiceResource>();
                }
            }

            if (m_TerritoryMembers == null)
            {
                m_TerritoryMembers = new List <ServiceTerritoryMember>();
            }

            m_TerritoryMembers.AddRange(deserializedQuery.records);
            i_ABData.TerritoryMembers = m_TerritoryMembers;
            i_ABData.STMResourcesIDs  = m_ABData.STMResourcesIDs;
        }
 //TODO: add try catch around every implementation of this method
 public abstract void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                  AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false);
Exemple #19
0
        public override string getQuery(AppointmentBookingRequest i_Request = null,
                                        AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default)
        {
            m_Request = i_Request;

            if (doAdditionalMembersQuery)
            {
                return(getAdditionalMembersQuery());
            }

            string queryStr = "SELECT ServiceResource.Id, ServiceResource.ResourceType, ServiceResource.ServiceCrewId, ServiceResource.Travel_Speed__c" +
                              ",ServiceResource.IsCapacityBased,ServiceResource.IsActive,ServiceResource.Name," +
                              "ServiceTerritory.Address,ServiceTerritory.Internal_SLR_Geolocation__c,ServiceTerritory.Longitude" +
                              ",ServiceTerritory.Latitude,Id,ServiceResourceId,ServiceTerritory.OperatingHours.TimeZone" +
                              ",ServiceTerritory.Internal_SLR_Geolocation__Latitude__s,ServiceTerritory.Internal_SLR_Geolocation__Longitude__s" +
                              ",OperatingHoursId,OperatingHours.TimeZone,EffectiveEndDate,EffectiveStartDate,Latitude,Longitude," +
                              "Internal_SLR_HomeAddress_Geolocation__Latitude__s,Internal_SLR_HomeAddress_Geolocation__Longitude__s" +
                              ",Internal_SLR_HomeAddress_Geolocation__c,TerritoryType,ServiceTerritoryId,Address";

            m_AdditionalMembersQuery = "Select ServiceResource.Id, ServiceResource.IsActive,ServiceResource.Name,ServiceTerritory.Internal_SLR_Geolocation__c," +
                                       "ServiceTerritory.Longitude,ServiceTerritory.Latitude,Id,ServiceResourceId," +
                                       "ServiceTerritory.OperatingHours.TimeZone,ServiceTerritory.Internal_SLR_Geolocation__Latitude__s," +
                                       "ServiceTerritory.Internal_SLR_Geolocation__Longitude__s,OperatingHoursId,OperatingHours.TimeZone," +
                                       "EffectiveEndDate,EffectiveStartDate,Latitude,Longitude,Internal_SLR_HomeAddress_Geolocation__Latitude__s," +
                                       "Internal_SLR_HomeAddress_Geolocation__Longitude__s,Internal_SLR_HomeAddress_Geolocation__c," +
                                       "TerritoryType,ServiceTerritoryId ";

            HashSet <String>   relevanceFields            = new HashSet <String>();
            ServiceAppointment service                    = m_ABData.ServiceToSchedule;
            string             notPartOfRelevenceGroupStr = "(";
            bool   atLeastOneLocationRuleIsActive         = false;
            bool   travelRuleIsActive = false;
            double?travelDistance     = null;
            double?latestUpdatedTravelDistance;
            bool   addedOneOfTheRulesToTheQuery = false;
            bool   serviceHasGeo = service.Latitude != null && service.Longitude != null;
            List <Work_Rule__c> enhancedRules = new List <Work_Rule__c>();
            List <Work_Rule__c> rulesListFileteredBySARelevance = new List <Work_Rule__c>();
            string territoryId = m_ABData.ServiceToSchedule.ServiceTerritory.Id;

            rulesListFileteredBySARelevance = initiateRulesWithRelvanceGroupList(m_ABData.RulesByDevName, service);

            foreach (Work_Rule__c rule in rulesListFileteredBySARelevance)
            {
                string resGroupFieldValue = rule.Resource_Group_Field__c;
                if (rule.DeveloperName.Equals("Match_Location_Service") || rule.DeveloperName.Equals("Field_Working_Locations"))
                {
                    atLeastOneLocationRuleIsActive = true;
                }

                if (serviceHasGeo && rule.DeveloperName.Equals("Max_Travel_From_Home_To_Service") && rule.Maximum_Travel_From_Home_Type__c.Equals("Distance") && rule.Maximum_Travel_From_Home__c != null)
                {
                    travelRuleIsActive          = true;
                    latestUpdatedTravelDistance = (i_Request.TravelUnit == eTravelUnit.Miles.ToString()) ? (rule.Maximum_Travel_From_Home__c * MILE_TO_KM_RATIO) : rule.Maximum_Travel_From_Home__c;
                    if (travelDistance == null || travelDistance < latestUpdatedTravelDistance)
                    {
                        travelDistance = latestUpdatedTravelDistance;
                        travelDistance++;
                    }
                }

                if (!string.IsNullOrEmpty(resGroupFieldValue))
                {
                    relevanceFields.Add(resGroupFieldValue.ToLower());

                    if (rule.DeveloperName.Equals("Match_Location_Service") || rule.DeveloperName.Equals("Field_Working_Locations") || (rule.DeveloperName.Equals("Max_Travel_From_Home_To_Service") && rule.Maximum_Travel_From_Home_Type__c.Equals("Distance")))
                    {
                        if (notPartOfRelevenceGroupStr != "(")
                        {
                            notPartOfRelevenceGroupStr += " AND ";
                        }
                        notPartOfRelevenceGroupStr += resGroupFieldValue.ToLower() + " = false";
                    }
                }

                if (rule.DeveloperName.Equals("Enhanced_Match_Service"))
                {
                    enhancedRules.Add(rule);
                }
            }

            if (notPartOfRelevenceGroupStr != "(")
            {
                notPartOfRelevenceGroupStr += $" AND TerritoryType != \'S\' AND ServiceTerritoryId = {territoryId} )";
            }
            else
            {
                notPartOfRelevenceGroupStr += ")";
            }

            foreach (KeyValuePair <string, List <Service_Goal__c> > objByDevName in m_ABData.ObjectivesByDevName)
            {
                foreach (Service_Goal__c obj in objByDevName.Value)
                {
                    String objGroupFieldValue = obj.Resource_Group_Field__c;

                    if (!string.IsNullOrEmpty(objGroupFieldValue))
                    {
                        relevanceFields.Add(objGroupFieldValue.ToLower());
                    }
                }
            }

            if (relevanceFields.Any())
            {
                foreach (String field in relevanceFields)
                {
                    queryStr += "," + field;
                    m_AdditionalMembersQuery += "," + field;
                }
            }

            calculateHorizonByMaxDaysSearchSlot(service, m_DateTimeNow, i_Request.SearchSlotsMaxDays, out m_Start, out m_Finish);

            notPartOfRelevenceGroupStr = notPartOfRelevenceGroupStr != "()" ? " OR " + notPartOfRelevenceGroupStr : string.Empty;

            queryStr += " FROM ServiceTerritoryMember WHERE ";

            if (atLeastOneLocationRuleIsActive && territoryId != null)
            {
                addedOneOfTheRulesToTheQuery = true;

                if (travelRuleIsActive)
                {
                    queryStr += $"(( ServiceTerritoryId = '{territoryId}' And ";
                }
                else
                {
                    queryStr += $"( ServiceTerritoryId = '{territoryId}' ";
                }
            }

            if (travelRuleIsActive)
            {
                if (!addedOneOfTheRulesToTheQuery)
                {
                    queryStr += "(";
                }

                queryStr += $" (TerritoryType = \'S\' Or ( Latitude <> null And Latitude <> 0 And Longitude <> null And Longitude <> 0 And (DISTANCE(Address, GEOLOCATION(' + {service.Latitude} + ',' + {service.Longitude} + '),\'km\') < ' + travelDistance + ') ) OR ";
                queryStr += $" ( ServiceTerritory.Latitude <> null And ServiceTerritory.Latitude <> 0 And ServiceTerritory.Longitude <> null And ServiceTerritory.Longitude <> 0 And (DISTANCE(ServiceTerritory.Address, GEOLOCATION(' + {service.Latitude} + ',' + {service.Longitude} + '),\'km\') < ' + travelDistance + ') ))";

                if (addedOneOfTheRulesToTheQuery)
                {
                    queryStr += ')';
                }

                addedOneOfTheRulesToTheQuery = true;
            }

            if (addedOneOfTheRulesToTheQuery)
            {
                queryStr += notPartOfRelevenceGroupStr + ") AND ";
            }

            queryStr += $"( NOT ((EffectiveStartDate <> NULL AND EffectiveStartDate > {formatDate(m_Finish)}) OR " +
                        $"(EffectiveEndDate <> NULL AND EffectiveEndDate < {formatDate(m_Start)})) ) And ServiceResource.IsActive = true";

            //TODO: implement for Enhanced Match Rule

            /*
             * if(enhancedRules != null && enhancedRules.Count > 0)
             * {
             *  List<string> queriesToFilterResources = getQueriesToFilterResourcesAcoordingToEnhancedRules(service, enhancedRules);
             *  foreach(string queryToFilterResource in queriesToFilterResources){
             *      queryStr += queryToFilterResource;
             *  }
             * }
             */

            doAdditionalMembersQuery = true;
            queryStr = formatQueryString(queryStr);
            return(queryStr);
        }
 public abstract string getQuery(AppointmentBookingRequest i_Request = null,
                                 AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default);
Exemple #21
0
 private void deselializeQueryResult(sObjectUtils i_ObjectUtils, string i_QueryResultStr, AdditionalObjectsUtils.eAdditionalObjectQuery i_ObjectToDeserialize = default, bool async = false)
 {
     i_ObjectUtils.Deserialize(i_QueryResultStr, m_ABData, i_ObjectToDeserialize, async);
 }
        public override void Deserialize(string i_QueryResult, AppointmentBookingData i_ABData,
                                         AdditionalObjectsUtils.eAdditionalObjectQuery i_AdditionalObjQuery = default, bool async = false)
        {
            DeserializedQueryResult deserializedQuery =
                JsonConvert.DeserializeObject <DeserializedQueryResult>(i_QueryResult);

            bool serviceHasSkills = false;
            Dictionary <string, double?> skillIdToLevel = new Dictionary <string, double?>();

            foreach (SkillRequirement skillReq in i_ABData.ServiceParent[i_ABData.ServiceToSchedule.ParentRecordId].SkillRequirements)
            {
                skillIdToLevel.Add(skillReq.SkillId, skillReq.SkillLevel);
                serviceHasSkills = true;
            }

            bool matchSkillLevel = false;

            if (i_ABData.RulesByDevName.ContainsKey("Match_Skills_Service"))
            {
                List <Work_Rule__c> matchSkillsRules = i_ABData.RulesByDevName["Match_Skills_Service"];
                foreach (Work_Rule__c rule in matchSkillsRules)
                {
                    if (rule.Match_Skill_Level__c == true)
                    {
                        matchSkillLevel = true;
                    }
                }
            }

            i_ABData.CandidatesById = new Dictionary <string, ServiceResource>();
            if (!matchSkillLevel || !serviceHasSkills)
            {
                i_ABData.CandidatesById = deserializedQuery.records.ToDictionary(candidate => candidate.Id);
            }
            else
            {
                foreach (ServiceResource resource in deserializedQuery.records)
                {
                    if (resource.serviceResourceSkillsCollection == null)
                    {
                        continue;
                    }

                    foreach (ServiceResourceSkill skill in resource.serviceResourceSkillsCollection.records)
                    {
                        if (skillIdToLevel.ContainsKey(skill.SkillId))
                        {
                            if (matchSkillLevel && skill.SkillLevel < skillIdToLevel[skill.SkillId])
                            {
                                continue;
                            }

                            if (!i_ABData.CandidatesById.ContainsKey(resource.Id))
                            {
                                i_ABData.CandidatesById.Add(resource.Id, resource);
                            }
                        }
                    }
                }
            }
        }