Beispiel #1
0
        /// <summary>
        /// Adds a new call into Resgrid and Dispatches the call
        /// </summary>
        /// <param name="callInput">Call data to add into the system</param>
        /// <returns></returns>
        public async Task <AddCallInput> AddCall([FromBody] AddCallInput callInput)
        {
            try
            {
                var call = new Call
                {
                    DepartmentId     = DepartmentId,
                    ReportingUserId  = UserId,
                    Priority         = callInput.Priority,
                    Name             = callInput.Name,
                    NatureOfCall     = callInput.NatureOfCall,
                    Number           = callInput.Number,
                    IsCritical       = callInput.IsCritical,
                    IncidentNumber   = callInput.IncidentNumber,
                    MapPage          = callInput.MapPage,
                    Notes            = callInput.Notes,
                    CompletedNotes   = callInput.CompletedNotes,
                    Address          = callInput.Address,
                    GeoLocationData  = callInput.GeoLocationData,
                    LoggedOn         = callInput.LoggedOn,
                    ClosedByUserId   = callInput.ClosedByUserId,
                    ClosedOn         = callInput.ClosedOn,
                    State            = callInput.State,
                    IsDeleted        = callInput.IsDeleted,
                    CallSource       = callInput.CallSource,
                    DispatchCount    = callInput.DispatchCount,
                    LastDispatchedOn = callInput.LastDispatchedOn,
                    SourceIdentifier = callInput.SourceIdentifier,
                    W3W                = callInput.W3W,
                    ContactName        = callInput.ContactName,
                    ContactNumber      = callInput.ContactNumber,
                    Public             = callInput.Public,
                    ExternalIdentifier = callInput.ExternalIdentifier,
                    ReferenceNumber    = callInput.ReferenceNumber
                };

                if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.Address))
                {
                    call.GeoLocationData = _geoLocationProvider.GetLatLonFromAddress(call.Address);
                }

                if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.W3W))
                {
                    var coords = await _geoLocationProvider.GetCoordinatesFromW3WAsync(call.W3W);

                    if (coords != null)
                    {
                        call.GeoLocationData = $"{coords.Latitude},{coords.Longitude}";
                    }
                }

                call.LoggedOn = DateTime.UtcNow;

                if (!String.IsNullOrWhiteSpace(callInput.Type) && callInput.Type != "No Type")
                {
                    var callTypes = await _callsService.GetCallTypesForDepartmentAsync(DepartmentId);

                    var type = callTypes.FirstOrDefault(x => x.Type == callInput.Type);

                    if (type != null)
                    {
                        call.Type = type.Type;
                    }
                }

                call.Dispatches      = new List <CallDispatch>();
                call.GroupDispatches = new List <CallDispatchGroup>();
                call.RoleDispatches  = new List <CallDispatchRole>();

                List <string> groupUserIds = new List <string>();

                var users = await _departmentsService.GetAllUsersForDepartmentAsync(DepartmentId);

                if (callInput.AllCall)
                {
                    foreach (var u in users)
                    {
                        var cd = new CallDispatch {
                            UserId = u.UserId
                        };

                        call.Dispatches.Add(cd);
                    }
                }
                else
                {
                    if (callInput.GroupCodesToDispatch != null && callInput.GroupCodesToDispatch.Count > 0)
                    {
                        var allGroups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId);

                        foreach (var groupCode in callInput.GroupCodesToDispatch)
                        {
                            var groupsToDispatch = allGroups.FirstOrDefault(x => x.DispatchEmail == groupCode);

                            if (groupsToDispatch != null)
                            {
                                var cd = new CallDispatchGroup {
                                    DepartmentGroupId = groupsToDispatch.DepartmentGroupId
                                };
                                call.GroupDispatches.Add(cd);

                                if (groupsToDispatch.Members != null && groupsToDispatch.Members.Any())
                                {
                                    foreach (var departmentGroupMember in groupsToDispatch.Members)
                                    {
                                        if (!groupUserIds.Contains(departmentGroupMember.UserId))
                                        {
                                            groupUserIds.Add(departmentGroupMember.UserId);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if (callInput.Attachments != null && callInput.Attachments.Any())
                {
                    call.Attachments = new List <CallAttachment>();

                    foreach (var attachment in callInput.Attachments)
                    {
                        var newAttachment = new CallAttachment();
                        newAttachment.Data               = attachment.Data;
                        newAttachment.Timestamp          = DateTime.UtcNow;
                        newAttachment.FileName           = attachment.FileName;
                        newAttachment.Size               = attachment.Size;
                        newAttachment.CallAttachmentType = attachment.CallAttachmentType;

                        call.Attachments.Add(newAttachment);
                    }
                }

                var savedCall = _callsService.SaveCall(call);


                OutboundEventProvider.CallAddedTopicHandler handler = new OutboundEventProvider.CallAddedTopicHandler();
                handler.Handle(new CallAddedEvent()
                {
                    DepartmentId = DepartmentId, Call = savedCall
                });

                var cqi = new CallQueueItem();
                cqi.Call = savedCall;

                if (cqi.Call.Dispatches != null && cqi.Call.Dispatches.Any())
                {
                    cqi.Profiles =
                        await _userProfileService.GetSelectedUserProfilesAsync(cqi.Call.Dispatches.Select(x => x.UserId).ToList());
                }
                else
                {
                    if (groupUserIds.Any())
                    {
                        cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(groupUserIds);
                    }
                }

                _queueService.EnqueueCallBroadcast(cqi);

                callInput.CallId = savedCall.CallId;
                callInput.Number = savedCall.Number;
            }
            catch (Exception ex)
            {
                Logging.LogException(ex);

                throw ex;
            }

            return(callInput);
        }
Beispiel #2
0
        public HttpResponseMessage SaveCall([FromBody] NewCallInput newCallInput)
        {
            if (!ModelState.IsValid)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }

            var call = new Call
            {
                DepartmentId    = DepartmentId,
                ReportingUserId = UserId,
                Priority        = (int)Enum.Parse(typeof(CallPriority), newCallInput.Pri),
                Name            = newCallInput.Nme,
                NatureOfCall    = newCallInput.Noc
            };

            if (!string.IsNullOrWhiteSpace(newCallInput.CNme))
            {
                call.ContactName = newCallInput.CNme;
            }

            if (!string.IsNullOrWhiteSpace(newCallInput.CNum))
            {
                call.ContactName = newCallInput.CNum;
            }

            if (!string.IsNullOrWhiteSpace(newCallInput.Cid))
            {
                call.IncidentNumber = newCallInput.Cid;
            }

            if (!string.IsNullOrWhiteSpace(newCallInput.Add))
            {
                call.Address = newCallInput.Add;
            }

            if (!string.IsNullOrWhiteSpace(newCallInput.W3W))
            {
                call.W3W = newCallInput.W3W;
            }

            //if (call.Address.Equals("Current Coordinates", StringComparison.InvariantCultureIgnoreCase))
            //	call.Address = "";

            if (!string.IsNullOrWhiteSpace(newCallInput.Not))
            {
                call.Notes = newCallInput.Not;
            }

            if (!string.IsNullOrWhiteSpace(newCallInput.Geo))
            {
                call.GeoLocationData = newCallInput.Geo;
            }

            if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.Address))
            {
                call.GeoLocationData = _geoLocationProvider.GetLatLonFromAddress(call.Address);
            }

            if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.W3W))
            {
                var coords = _geoLocationProvider.GetCoordinatesFromW3W(call.W3W);

                if (coords != null)
                {
                    call.GeoLocationData = $"{coords.Latitude},{coords.Longitude}";
                }
            }

            call.LoggedOn = DateTime.UtcNow;

            if (!String.IsNullOrWhiteSpace(newCallInput.Typ) && newCallInput.Typ != "No Type")
            {
                var callTypes = _callsService.GetCallTypesForDepartment(DepartmentId);
                var type      = callTypes.FirstOrDefault(x => x.Type == newCallInput.Typ);

                if (type != null)
                {
                    call.Type = type.Type;
                }
            }
            var users = _departmentsService.GetAllUsersForDepartment(DepartmentId);

            call.Dispatches      = new Collection <CallDispatch>();
            call.GroupDispatches = new List <CallDispatchGroup>();
            call.RoleDispatches  = new List <CallDispatchRole>();

            if (string.IsNullOrWhiteSpace(newCallInput.Dis) || newCallInput.Dis == "0")
            {
                // Use case, existing clients and non-ionic2 app this will be null dispatch all users. Or we've specified everyone (0).
                foreach (var u in users)
                {
                    var cd = new CallDispatch {
                        UserId = u.UserId
                    };

                    call.Dispatches.Add(cd);
                }
            }
            else
            {
                var dispatch = newCallInput.Dis.Split(char.Parse("|"));

                try
                {
                    var usersToDispatch = dispatch.Where(x => x.StartsWith("P:")).Select(y => y.Replace("P:", ""));
                    foreach (var user in usersToDispatch)
                    {
                        var cd = new CallDispatch {
                            UserId = user
                        };
                        call.Dispatches.Add(cd);
                    }
                }
                catch (Exception ex)
                {
                    Logging.LogException(ex);
                }

                try
                {
                    var groupsToDispatch = dispatch.Where(x => x.StartsWith("G:")).Select(y => int.Parse(y.Replace("G:", "")));
                    foreach (var group in groupsToDispatch)
                    {
                        var cd = new CallDispatchGroup {
                            DepartmentGroupId = group
                        };
                        call.GroupDispatches.Add(cd);
                    }
                }
                catch (Exception ex)
                {
                    Logging.LogException(ex);
                }

                try
                {
                    var rolesToDispatch = dispatch.Where(x => x.StartsWith("R:")).Select(y => int.Parse(y.Replace("R:", "")));
                    foreach (var role in rolesToDispatch)
                    {
                        var cd = new CallDispatchRole {
                            RoleId = role
                        };
                        call.RoleDispatches.Add(cd);
                    }
                }
                catch (Exception ex)
                {
                    Logging.LogException(ex);
                }
            }


            var savedCall = _callsService.SaveCall(call);

            OutboundEventProvider.CallAddedTopicHandler handler = new OutboundEventProvider.CallAddedTopicHandler();
            handler.Handle(new CallAddedEvent()
            {
                DepartmentId = DepartmentId, Call = savedCall
            });

            var profiles = new List <string>();

            if (call.Dispatches != null && call.Dispatches.Any())
            {
                profiles.AddRange(call.Dispatches.Select(x => x.UserId).ToList());
            }

            if (call.GroupDispatches != null && call.GroupDispatches.Any())
            {
                foreach (var groupDispatch in call.GroupDispatches)
                {
                    var group = _departmentGroupsService.GetGroupById(groupDispatch.DepartmentGroupId);

                    if (group != null && group.Members != null)
                    {
                        profiles.AddRange(group.Members.Select(x => x.UserId));
                    }
                }
            }

            if (call.RoleDispatches != null && call.RoleDispatches.Any())
            {
                foreach (var roleDispatch in call.RoleDispatches)
                {
                    var members = _personnelRolesService.GetAllMembersOfRole(roleDispatch.RoleId);

                    if (members != null)
                    {
                        profiles.AddRange(members.Select(x => x.UserId).ToList());
                    }
                }
            }

            var cqi = new CallQueueItem();

            cqi.Call     = savedCall;
            cqi.Profiles = _userProfileService.GetSelectedUserProfiles(profiles);

            _queueService.EnqueueCallBroadcast(cqi);

            return(Request.CreateResponse(HttpStatusCode.Created));
        }