Example #1
0
        public IActionResult Index()
        {
            DepartmentGroupsModel model = new DepartmentGroupsModel();

            model.Users  = _departmentsService.GetAllUsersForDepartment(DepartmentId);
            model.Groups = _departmentGroupsService.GetAllGroupsForDepartmentUnlimited(DepartmentId);

            model.CanAddNewGroup = _limitsService.CanDepartentAddNewGroup(DepartmentId);

            return(View(model));
        }
        public IActionResult NewList()
        {
            var model = new NewListView();

            model.List        = new DistributionList();
            model.List.Port   = 110;
            model.ListTypes   = model.Type.ToSelectList();
            model.List.UseSsl = false;
            model.List.Type   = (int)DistributionListTypes.Internal;

            model.Users = _departmentsService.GetAllUsersForDepartment(DepartmentId, true);

            return(View(model));
        }
Example #3
0
        private void PopulateLogViewModel(NewLogView model)
        {
            model.Department     = _departmentsService.GetDepartmentByUserId(UserId);
            model.User           = _usersService.GetUserById(UserId);
            model.Types          = model.LogType.ToSelectList();
            model.CallPriorities = model.CallPriority.ToSelectList();
            model.Users.Add(String.Empty, "Not Applicable");
            model.SetUsers(_departmentsService.GetAllUsersForDepartment(DepartmentId));
            var groups = new List <DepartmentGroup>();

            groups.Add(new DepartmentGroup
            {
                Name = "Not Applicable"
            });
            groups.AddRange(_departmentGroupsService.GetAllStationGroupsForDepartment(DepartmentId));
            model.Stations = groups;

            List <CallType> types = new List <CallType>();

            types.Add(new CallType {
                CallTypeId = 0, Type = "No Type"
            });
            types.AddRange(_callsService.GetCallTypesForDepartment(DepartmentId));
            model.CallTypes = new SelectList(types, "Type", "Type");
        }
Example #4
0
        public DepartmentStatusResult GetDepartmentStatus()
        {
            var result = new DepartmentStatusResult();

            result.Lup   = _departmentSettingsService.GetDepartmentUpdateTimestamp(DepartmentId);
            result.Users = _departmentsService.GetAllUsersForDepartment(DepartmentId).Select(x => x.UserId.ToString()).ToList();

            return(result);
        }
Example #5
0
        public List <UserState> GetStatesForDepartment(int departmentId)
        {
            var states = new List <UserState>();
            var users  = _departmentsService.GetAllUsersForDepartment(departmentId);

            foreach (var u in users)
            {
                states.Add(GetLastUserStateByUserId(u.UserId));
            }

            return(states);
        }
Example #6
0
        public async Task <IActionResult> Settings()
        {
            var model = new OrderSetttingsView();

            var department = _departmentsService.GetDepartmentById(DepartmentId);
            var settings   = await _resourceOrdersService.GetSettingsByDepartmentId(DepartmentId);

            if (settings != null)
            {
                model.Settings = settings;
            }
            else
            {
                model.Settings = new ResourceOrderSetting();
                model.Settings.DefaultResourceOrderManagerUserId = department.ManagingUserId;
                model.Settings.Range = 500;
            }

            model.OrderVisibilities = model.Visibility.ToSelectListInt();

            var staffingLevels = _customStateService.GetActiveStaffingLevelsForDepartment(DepartmentId);

            if (staffingLevels == null)
            {
                model.StaffingLevels = model.UserStateTypes.ToSelectListInt();
            }
            else
            {
                model.StaffingLevels = new SelectList(staffingLevels.GetActiveDetails(), "CustomStateDetailId", "ButtonText");
            }

            model.SetUsers(_departmentsService.GetAllUsersForDepartment(DepartmentId, false, true), _departmentsService.GetAllPersonnelNamesForDepartment(DepartmentId));
            ViewBag.Users = new SelectList(model.Users, "Key", "Value");

            return(View(model));
        }
        public Tuple <bool, string> Process(StaffingScheduleQueueItem item)
        {
            bool   success = true;
            string result  = "";

            if (item != null && item.ScheduledTask != null)
            {
                try
                {
                    if (item.ScheduledTask.TaskType == (int)TaskTypes.UserStaffingLevel)
                    {
                        _userStateService.CreateUserState(item.ScheduledTask.UserId, item.ScheduledTask.DepartmentId, int.Parse(item.ScheduledTask.Data), item.ScheduledTask.Note);
                    }
                    else if (item.ScheduledTask.TaskType == (int)TaskTypes.DepartmentStaffingReset)
                    {
                        //var department = _departmentsService.GetDepartmentByUserId(item.ScheduledTask.UserId);
                        //var users = _departmentsService.GetAllUsersForDepartment(department.DepartmentId, true);
                        var users = _departmentsService.GetAllUsersForDepartment(item.ScheduledTask.DepartmentId, true);

                        foreach (var user in users)
                        {
                            _userStateService.CreateUserState(user.UserId, item.ScheduledTask.DepartmentId, int.Parse(item.ScheduledTask.Data));
                        }
                    }
                    else if (item.ScheduledTask.TaskType == (int)TaskTypes.DepartmentStatusReset)
                    {
                        //var department = _departmentsService.GetDepartmentByUserId(item.ScheduledTask.UserId);
                        _actionLogsService.SetActionForEntireDepartment(item.ScheduledTask.DepartmentId, int.Parse(item.ScheduledTask.Data));
                    }
                }
                catch (Exception ex)
                {
                    Logging.LogException(ex);
                    success = false;
                    result  = ex.ToString();
                }

                if (success)
                {
                    _scheduledTasksService.CreateScheduleTaskLog(item.ScheduledTask);
                }
            }

            return(new Tuple <bool, string>(success, result));
        }
Example #8
0
        public IActionResult GetPersonnelList(int linkId)
        {
            var link = _departmentLinksService.GetLinkById(linkId);

            if (link.DepartmentId != DepartmentId && link.LinkedDepartmentId != DepartmentId)
            {
                Unauthorized();
            }

            var department         = _departmentsService.GetDepartmentById(link.DepartmentId);
            var allUsers           = _departmentsService.GetAllUsersForDepartment(link.DepartmentId);
            var lastUserActionlogs = _actionLogsService.GetActionLogsForDepartment(link.DepartmentId);
            var departmentGroups   = _departmentGroupsService.GetAllGroupsForDepartment(link.DepartmentId);

            var lastUserStates = _userStateService.GetLatestStatesForDepartment(link.DepartmentId);
            var personnelNames = _departmentsService.GetAllPersonnelNamesForDepartment(link.DepartmentId);

            var calls    = _callsService.GetActiveCallsByDepartment(link.DepartmentId);
            var stations = _departmentGroupsService.GetAllStationGroupsForDepartment(link.DepartmentId);

            var names = new Dictionary <string, string>();

            var userStates = new List <UserState>();

            foreach (var u in allUsers)
            {
                var state = lastUserStates.FirstOrDefault(x => x.UserId == u.UserId);

                if (state != null)
                {
                    userStates.Add(state);
                }
                else
                {
                    userStates.Add(_userStateService.GetLastUserStateByUserId(u.UserId));
                }

                var name = personnelNames.FirstOrDefault(x => x.UserId == u.UserId);
                if (name != null)
                {
                    names.Add(u.UserId, name.Name);
                }
                else
                {
                    names.Add(u.UserId, UserHelper.GetFullNameForUser(u.UserId));
                }
            }

            var personnelViewModels = new List <Models.BigBoardX.PersonnelViewModel>();

            var sortedUngroupedUsers = from u in allUsers
                                       // let mu = Membership.GetUser(u.UserId)
                                       let userGroup = _departmentGroupsService.GetGroupForUser(u.UserId, DepartmentId)
                                                       let groupName                         = userGroup == null ? "" : userGroup.Name
                                                                                   let roles = _personnelRolesService.GetRolesForUser(u.UserId, DepartmentId)
                                                                                               //let name = (ProfileBase.Create(mu.UserName, true)).GetPropertyValue("Name").ToString()
                                                                                               let name = names[u.UserId]
                                                                                                          let weight = lastUserActionlogs.Where(x => x.UserId == u.UserId).FirstOrDefault().GetWeightForAction()
                                                                                                                       orderby groupName, weight, name ascending
                select new
            {
                Name  = name,
                User  = u,
                Group = userGroup,
                Roles = roles
            };

            foreach (var u in sortedUngroupedUsers)
            {
                //var mu = Membership.GetUser(u.User.UserId);
                var al = lastUserActionlogs.Where(x => x.UserId == u.User.UserId).FirstOrDefault();
                var us = userStates.Where(x => x.UserId == u.User.UserId).FirstOrDefault();

                string callNumber = "";
                if (al != null && al.ActionTypeId == (int)ActionTypes.RespondingToScene || (al != null && al.DestinationType.HasValue && al.DestinationType.Value == 2))
                {
                    if (al.DestinationId.HasValue)
                    {
                        var call = calls.FirstOrDefault(x => x.CallId == al.DestinationId.Value);

                        if (call != null)
                        {
                            callNumber = call.Number;
                        }
                    }
                }
                var respondingToDepartment = stations.Where(s => al != null && s.DepartmentGroupId == al.DestinationId).FirstOrDefault();
                var personnelViewModel     = Models.BigBoardX.PersonnelViewModel.Create(u.Name, al, us, department, respondingToDepartment, u.Group, u.Roles, callNumber);

                personnelViewModels.Add(personnelViewModel);
            }

            return(Json(personnelViewModels));
        }
Example #9
0
        public IActionResult Compose(ComposeMessageModel model, IFormCollection collection)
        {
            var roles  = new List <string>();
            var groups = new List <string>();
            var users  = new List <string>();
            var shifts = new List <string>();

            if (collection.ContainsKey("roles"))
            {
                roles.AddRange(collection["roles"].ToString().Split(char.Parse(",")));
            }

            if (collection.ContainsKey("groups"))
            {
                groups.AddRange(collection["groups"].ToString().Split(char.Parse(",")));
            }

            if (collection.ContainsKey("users"))
            {
                users.AddRange(collection["users"].ToString().Split(char.Parse(",")));
            }

            if (collection.ContainsKey("exludedShifts"))
            {
                shifts.AddRange(collection["exludedShifts"].ToString().Split(char.Parse(",")));
            }

            if (!model.SendToAll && (roles.Count + groups.Count + users.Count) == 0)
            {
                ModelState.AddModelError("", "You must specify at least one Recipient.");
            }

            if (model.SendToMatchOnly && (roles.Count + groups.Count) == 0)
            {
                ModelState.AddModelError("", "You must specify at least one Group or Role to send to.");
            }

            if (ModelState.IsValid)
            {
                var excludedUsers = new List <string>();

                if (shifts.Any())
                {
                    foreach (var shiftId in shifts)
                    {
                        var shift = _shiftsService.GetShiftById(int.Parse(shiftId));
                        excludedUsers.AddRange(shift.Personnel.Select(x => x.UserId));
                    }
                }

                model.Message.Type = (int)model.MessageType;
                if (model.SendToAll)
                {
                    var allUsers = _departmentsService.GetAllUsersForDepartment(DepartmentId);
                    foreach (var user in allUsers)
                    {
                        if (user.UserId != UserId && (!excludedUsers.Any() || !excludedUsers.Contains(user.UserId)))
                        {
                            model.Message.AddRecipient(user.UserId);
                        }
                    }
                }
                else if (model.SendToMatchOnly)
                {
                    var usersInRoles = new Dictionary <int, List <string> >();

                    foreach (var role in roles)
                    {
                        var roleMembers = _personnelRolesService.GetAllMembersOfRole(int.Parse(role));
                        usersInRoles.Add(int.Parse(role), roleMembers.Select(x => x.UserId).ToList());
                    }

                    foreach (var group in groups)
                    {
                        var members = _departmentGroupsService.GetAllMembersForGroup(int.Parse(group));

                        foreach (var member in members)
                        {
                            bool isInRoles = false;
                            if (model.Message.GetRecipients().All(x => x != member.UserId) && member.UserId != UserId &&
                                (!excludedUsers.Any() || !excludedUsers.Contains(member.UserId)))
                            {
                                foreach (var key in usersInRoles)
                                {
                                    if (key.Value.Any(x => x == member.UserId))
                                    {
                                        isInRoles = true;
                                        break;
                                    }
                                }

                                if (isInRoles)
                                {
                                    model.Message.AddRecipient(member.UserId);
                                }
                            }
                        }
                    }
                }
                else
                {
                    foreach (var user in users)
                    {
                        model.Message.AddRecipient(user);
                    }

                    // Add all members of the group
                    foreach (var group in groups)
                    {
                        var members = _departmentGroupsService.GetAllMembersForGroup(int.Parse(group));

                        foreach (var member in members)
                        {
                            if (model.Message.GetRecipients().All(x => x != member.UserId) && member.UserId != UserId && (!excludedUsers.Any() || !excludedUsers.Contains(member.UserId)))
                            {
                                model.Message.AddRecipient(member.UserId);
                            }
                        }
                    }

                    // Add all the users of a specific role
                    foreach (var role in roles)
                    {
                        var roleMembers = _personnelRolesService.GetAllMembersOfRole(int.Parse(role));

                        foreach (var member in roleMembers)
                        {
                            if (model.Message.GetRecipients().All(x => x != member.UserId) && member.UserId != UserId && (!excludedUsers.Any() || !excludedUsers.Contains(member.UserId)))
                            {
                                model.Message.AddRecipient(member.UserId);
                            }
                        }
                    }
                }

                model.Message.SentOn        = DateTime.UtcNow;
                model.Message.SendingUserId = UserId;
                model.Message.Body          = System.Net.WebUtility.HtmlDecode(model.Message.Body);
                model.Message.IsBroadcast   = true;

                var savedMessage = _messageService.SaveMessage(model.Message);
                _messageService.SendMessage(savedMessage, "", DepartmentId, false);

                return(RedirectToAction("Inbox"));
            }

            model.Department = _departmentsService.GetDepartmentById(DepartmentId);
            model.User       = _usersService.GetUserById(UserId);
            model.Types      = model.MessageType.ToSelectList();

            var savedShifts = _shiftsService.GetAllShiftsByDepartment(DepartmentId);

            model.Shifts       = new SelectList(savedShifts, "ShiftId", "Name");
            model.Message.Body = System.Net.WebUtility.HtmlDecode(model.Message.Body);

            return(View(FillComposeMessageModel(model)));
        }
Example #10
0
        public UnitAppPayloadResult GetCommandAppCoreData()
        {
            var results = new UnitAppPayloadResult();

            results.Personnel    = new List <PersonnelInfoResult>();
            results.Groups       = new List <GroupInfoResult>();
            results.Units        = new List <UnitInfoResult>();
            results.Roles        = new List <RoleInfoResult>();
            results.Statuses     = new List <CustomStatusesResult>();
            results.Calls        = new List <CallResult>();
            results.UnitStatuses = new List <UnitStatusCoreResult>();
            results.UnitRoles    = new List <UnitRoleResult>();

            var users  = _departmentsService.GetAllUsersForDepartment(DepartmentId);
            var groups = _departmentGroupsService.GetAllDepartmentGroupsForDepartment(DepartmentId);
            var rolesForUsersInDepartment = _personnelRolesService.GetAllRolesForUsersInDepartment(DepartmentId);
            var allRoles    = _personnelRolesService.GetRolesForDepartment(DepartmentId);
            var allProfiles = _userProfileService.GetAllProfilesForDepartment(DepartmentId);
            var allGroups   = _departmentGroupsService.GetAllGroupsForDepartment(DepartmentId);
            var units       = _unitsService.GetUnitsForDepartment(DepartmentId);
            var unitTypes   = _unitsService.GetUnitTypesForDepartment(DepartmentId);


            foreach (var user in users)
            {
                //var profile = _userProfileService.GetProfileByUserId(user.UserId);
                //var group = _departmentGroupsService.GetGroupForUser(user.UserId);

                UserProfile profile = null;
                if (allProfiles.ContainsKey(user.UserId))
                {
                    profile = allProfiles[user.UserId];
                }

                DepartmentGroup group = null;
                if (groups.ContainsKey(user.UserId))
                {
                    group = groups[user.UserId];
                }

                //var roles = _personnelRolesService.GetRolesForUser(user.UserId);

                List <PersonnelRole> roles = null;
                if (rolesForUsersInDepartment.ContainsKey(user.UserId))
                {
                    roles = rolesForUsersInDepartment[user.UserId];
                }

                var result = new PersonnelInfoResult();

                if (profile != null)
                {
                    result.Fnm = profile.FirstName;
                    result.Lnm = profile.LastName;
                    result.Id  = profile.IdentificationNumber;
                    result.Mnu = profile.MobileNumber;
                }
                else
                {
                    result.Fnm = "Unknown";
                    result.Lnm = "Check Profile";
                    result.Id  = "";
                    result.Mnu = "";
                }

                result.Eml = user.Email;
                result.Did = DepartmentId;
                result.Uid = user.UserId.ToString();

                if (group != null)
                {
                    result.Gid = group.DepartmentGroupId;
                    result.Gnm = group.Name;
                }

                result.Roles = new List <string>();
                if (roles != null && roles.Count > 0)
                {
                    foreach (var role in roles)
                    {
                        if (role != null)
                        {
                            result.Roles.Add(role.Name);
                        }
                    }
                }

                results.Personnel.Add(result);
            }


            results.Rights = new DepartmentRightsResult();
            var currentUser = _usersService.GetUserByName(UserName);

            if (currentUser == null)
            {
                throw HttpStatusCode.Unauthorized.AsException();
            }

            var department = _departmentsService.GetDepartmentById(DepartmentId, false);

            results.Rights.Adm  = department.IsUserAnAdmin(currentUser.UserId);
            results.Rights.Grps = new List <GroupRight>();

            var currentGroup = _departmentGroupsService.GetGroupForUser(currentUser.UserId, DepartmentId);

            if (currentGroup != null)
            {
                var groupRight = new GroupRight();
                groupRight.Gid = currentGroup.DepartmentGroupId;
                groupRight.Adm = currentGroup.IsUserGroupAdmin(currentUser.UserId);

                results.Rights.Grps.Add(groupRight);
            }

            foreach (var group in allGroups)
            {
                var groupInfo = new GroupInfoResult();
                groupInfo.Gid = group.DepartmentGroupId;
                groupInfo.Nme = group.Name;

                if (group.Type.HasValue)
                {
                    groupInfo.Typ = group.Type.Value;
                }

                if (group.Address != null)
                {
                    groupInfo.Add = group.Address.FormatAddress();
                }

                results.Groups.Add(groupInfo);
            }

            foreach (var unit in units)
            {
                var unitResult = new UnitInfoResult();
                unitResult.Uid = unit.UnitId;
                unitResult.Did = DepartmentId;
                unitResult.Nme = unit.Name;
                unitResult.Typ = unit.Type;

                if (!string.IsNullOrWhiteSpace(unit.Type))
                {
                    var unitType = unitTypes.FirstOrDefault(x => x.Type == unit.Type);

                    if (unitType != null)
                    {
                        unitResult.Cid = unitType.CustomStatesId.GetValueOrDefault();
                    }
                }
                else
                {
                    unitResult.Cid = 0;
                }

                if (unit.StationGroup != null)
                {
                    unitResult.Sid = unit.StationGroup.DepartmentGroupId;
                    unitResult.Snm = unit.StationGroup.Name;
                }

                results.Units.Add(unitResult);

                // Add unit roles for this unit
                var roles = _unitsService.GetRolesForUnit(unit.UnitId);
                foreach (var role in roles)
                {
                    var roleResult = new UnitRoleResult();
                    roleResult.Name       = role.Name;
                    roleResult.UnitId     = role.UnitId;
                    roleResult.UnitRoleId = role.UnitRoleId;

                    results.UnitRoles.Add(roleResult);
                }
            }

            var unitStatuses = _unitsService.GetAllLatestStatusForUnitsByDepartmentId(DepartmentId);

            foreach (var us in unitStatuses)
            {
                var unitStatus = new UnitStatusCoreResult();
                unitStatus.UnitId      = us.UnitId;
                unitStatus.StateType   = (UnitStateTypes)us.State;
                unitStatus.StateTypeId = us.State;
                unitStatus.Type        = us.Unit.Type;
                unitStatus.Timestamp   = us.Timestamp.TimeConverter(department);
                unitStatus.Name        = us.Unit.Name;

                if (us.DestinationId.HasValue)
                {
                    unitStatus.DestinationId = us.DestinationId.Value;
                }

                results.UnitStatuses.Add(unitStatus);
            }

            foreach (var role in allRoles)
            {
                var roleResult = new RoleInfoResult();
                roleResult.Rid = role.PersonnelRoleId;
                roleResult.Nme = role.Name;

                results.Roles.Add(roleResult);
            }

            var customStates = _customStateService.GetAllActiveCustomStatesForDepartment(DepartmentId);

            foreach (var customState in customStates)
            {
                if (customState.IsDeleted)
                {
                    continue;
                }

                foreach (var stateDetail in customState.GetActiveDetails())
                {
                    if (stateDetail.IsDeleted)
                    {
                        continue;
                    }

                    var customStateResult = new CustomStatusesResult();
                    customStateResult.Id      = stateDetail.CustomStateDetailId;
                    customStateResult.Type    = customState.Type;
                    customStateResult.StateId = stateDetail.CustomStateId;
                    customStateResult.Text    = stateDetail.ButtonText;
                    customStateResult.BColor  = stateDetail.ButtonColor;
                    customStateResult.Color   = stateDetail.TextColor;
                    customStateResult.Gps     = stateDetail.GpsRequired;
                    customStateResult.Note    = stateDetail.NoteType;
                    customStateResult.Detail  = stateDetail.DetailType;

                    results.Statuses.Add(customStateResult);
                }
            }

            var calls = _callsService.GetActiveCallsByDepartment(DepartmentId).OrderByDescending(x => x.LoggedOn);

            if (calls != null && calls.Any())
            {
                foreach (var c in calls)
                {
                    var call = new CallResult();

                    call.Cid = c.CallId;
                    call.Pri = c.Priority;
                    call.Ctl = c.IsCritical;
                    call.Nme = c.Name;
                    call.Noc = c.NatureOfCall;
                    call.Map = c.MapPage;
                    call.Not = c.Notes;

                    if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData))
                    {
                        var geo = c.GeoLocationData.Split(char.Parse(","));

                        if (geo.Length == 2)
                        {
                            call.Add = _geoLocationProvider.GetAddressFromLatLong(double.Parse(geo[0]), double.Parse(geo[1]));
                        }
                    }
                    else
                    {
                        call.Add = c.Address;
                    }

                    call.Add = c.Address;
                    call.Geo = c.GeoLocationData;
                    call.Lon = c.LoggedOn.TimeConverter(department);
                    call.Ste = c.State;
                    call.Num = c.Number;

                    results.Calls.Add(call);
                }
            }
            else
            {
                // This is a hack due to a bug in the current units app! -SJ 1-31-2016
                var call = new CallResult();
                call.Cid = 0;
                call.Pri = 0;
                call.Ctl = false;
                call.Nme = "No Call";
                call.Noc = "";
                call.Map = "";
                call.Not = "";
                call.Add = "";
                call.Geo = "";
                call.Lon = DateTime.UtcNow;
                call.Ste = 0;
                call.Num = "";

                results.Calls.Add(call);
            }


            return(results);
        }
Example #11
0
        public List <StationResult> GetStationResources()
        {
            var result = new List <StationResult>();

            var        unitStatuses = _unitsService.GetAllLatestStatusForUnitsByDepartmentId(DepartmentId);
            var        actionLogs   = _actionLogsService.GetActionLogsForDepartment(DepartmentId);
            var        userStates   = _userStateService.GetLatestStatesForDepartment(DepartmentId);
            var        stations     = _departmentGroupsService.GetAllGroupsForDepartment(DepartmentId);
            var        userGroups   = _departmentGroupsService.GetAllDepartmentGroupsForDepartment(DepartmentId);
            var        users        = _departmentsService.GetAllUsersForDepartment(DepartmentId);
            var        units        = _unitsService.GetUnitsForDepartment(DepartmentId);
            Department department   = _departmentsService.GetDepartmentById(DepartmentId, false);

            Parallel.ForEach(users, u =>
            {
                var log = (from l in actionLogs
                           where l.UserId == u.UserId
                           select l).FirstOrDefault();

                var state = (from l in userStates
                             where l.UserId == u.UserId
                             select l).FirstOrDefault();

                var s = new StationResult();
                s.Id  = u.UserId.ToString();
                s.Typ = 1;

                if (log != null)
                {
                    s.Sts = log.ActionTypeId;
                    s.Stm = log.Timestamp.TimeConverter(department);

                    if (log.DestinationId.HasValue)
                    {
                        if (log.ActionTypeId == (int)ActionTypes.RespondingToStation)
                        {
                            s.Did = log.DestinationId.GetValueOrDefault();

                            var group = stations.First(x => x.DepartmentGroupId == log.DestinationId.Value);
                            s.Dnm     = group.Name;
                        }
                        else if (log.ActionTypeId == (int)ActionTypes.AvailableStation)
                        {
                            s.Did = log.DestinationId.GetValueOrDefault();

                            var group = stations.First(x => x.DepartmentGroupId == log.DestinationId.Value);
                            s.Dnm     = group.Name;
                        }
                    }
                }
                else
                {
                    s.Sts = (int)ActionTypes.StandingBy;
                    s.Stm = DateTime.UtcNow.TimeConverter(department);
                }

                if (s.Did == 0)
                {
                    if (userGroups.ContainsKey(u.UserId))
                    {
                        var homeGroup = userGroups[u.UserId];
                        if (homeGroup != null && homeGroup.Type.HasValue &&
                            ((DepartmentGroupTypes)homeGroup.Type) == DepartmentGroupTypes.Station)
                        {
                            s.Did = homeGroup.DepartmentGroupId;
                            s.Dnm = homeGroup.Name;
                        }
                    }
                }

                if (state != null)
                {
                    s.Ste = state.State;
                    s.Stt = state.Timestamp.TimeConverter(department);
                }
                else
                {
                    s.Ste = (int)UserStateTypes.Available;
                    s.Stt = DateTime.UtcNow.TimeConverter(department);
                }

                if (!String.IsNullOrWhiteSpace(s.Dnm))
                {
                    result.Add(s);
                }
            });

            Parallel.ForEach(unitStatuses, unit =>
            {
                var unitResult = new StationResult();
                var savedUnit  = units.FirstOrDefault(x => x.UnitId == unit.UnitId);

                if (savedUnit != null)
                {
                    unitResult.Id = savedUnit.UnitId.ToString();
                    //unitResult.Nme = savedUnit.Name;
                    unitResult.Typ = 2;
                    unitResult.Sts = unit.State;
                    unitResult.Stm = unit.Timestamp.TimeConverter(department);

                    if (savedUnit.StationGroupId.HasValue)
                    {
                        unitResult.Did = savedUnit.StationGroupId.Value;
                        unitResult.Dnm = stations.First(x => x.DepartmentGroupId == savedUnit.StationGroupId.Value).Name;

                        result.Add(unitResult);
                    }
                }
            });

            return(result);
        }
Example #12
0
        public HttpResponseMessage IncomingMessage([FromUri] TwilioMessage request)
        {
            if (request == null || string.IsNullOrWhiteSpace(request.To) || string.IsNullOrWhiteSpace(request.From) || string.IsNullOrWhiteSpace(request.Body))
            {
                return(Request.CreateResponse(HttpStatusCode.BadRequest));
            }

            var response = new TwilioResponse();

            var textMessage = new TextMessage();

            textMessage.To        = request.To.Replace("+", "");
            textMessage.Msisdn    = request.From.Replace("+", "");
            textMessage.MessageId = request.MessageSid;
            textMessage.Timestamp = DateTime.UtcNow.ToLongDateString();
            textMessage.Data      = request.Body;
            textMessage.Text      = request.Body;

            var messageEvent = new InboundMessageEvent();

            messageEvent.MessageType = (int)InboundMessageTypes.TextMessage;
            messageEvent.RecievedOn  = DateTime.UtcNow;
            messageEvent.Type        = typeof(InboundMessageEvent).FullName;
            messageEvent.Data        = JsonConvert.SerializeObject(textMessage);
            messageEvent.Processed   = false;
            messageEvent.CustomerId  = "";

            try
            {
                var departmentId = _departmentSettingsService.GetDepartmentIdByTextToCallNumber(textMessage.To);

                if (departmentId.HasValue)
                {
                    var department         = _departmentsService.GetDepartmentById(departmentId.Value);
                    var textToCallEnabled  = _departmentSettingsService.GetDepartmentIsTextCallImportEnabled(departmentId.Value);
                    var textCommandEnabled = _departmentSettingsService.GetDepartmentIsTextCommandEnabled(departmentId.Value);
                    var dispatchNumbers    = _departmentSettingsService.GetTextToCallSourceNumbersForDepartment(departmentId.Value);
                    var authroized         = _limitsService.CanDepartmentProvisionNumber(departmentId.Value);
                    var customStates       = _customStateService.GetAllActiveCustomStatesForDepartment(departmentId.Value);

                    messageEvent.CustomerId = departmentId.Value.ToString();

                    if (authroized)
                    {
                        bool isDispatchSource = false;

                        if (!String.IsNullOrWhiteSpace(dispatchNumbers))
                        {
                            isDispatchSource = _numbersService.DoesNumberMatchAnyPattern(dispatchNumbers.Split(Char.Parse(",")).ToList(), textMessage.Msisdn);
                        }

                        // If we don't have dispatchNumbers and Text Command isn't enabled it's a dispatch text
                        if (!isDispatchSource && !textCommandEnabled)
                        {
                            isDispatchSource = true;
                        }

                        if (isDispatchSource && textToCallEnabled)
                        {
                            var c = new Call();
                            c.Notes            = textMessage.Text;
                            c.NatureOfCall     = textMessage.Text;
                            c.LoggedOn         = DateTime.UtcNow;
                            c.Name             = string.Format("TTC {0}", c.LoggedOn.TimeConverter(department).ToString("g"));
                            c.Priority         = (int)CallPriority.High;
                            c.ReportingUserId  = department.ManagingUserId;
                            c.Dispatches       = new Collection <CallDispatch>();
                            c.CallSource       = (int)CallSources.EmailImport;
                            c.SourceIdentifier = textMessage.MessageId;
                            c.DepartmentId     = departmentId.Value;

                            var users = _departmentsService.GetAllUsersForDepartment(departmentId.Value, true);
                            foreach (var u in users)
                            {
                                var cd = new CallDispatch();
                                cd.UserId = u.UserId;

                                c.Dispatches.Add(cd);
                            }

                            var savedCall = _callsService.SaveCall(c);

                            var cqi = new CallQueueItem();
                            cqi.Call                 = savedCall;
                            cqi.Profiles             = _userProfileService.GetSelectedUserProfiles(users.Select(x => x.UserId).ToList());
                            cqi.DepartmentTextNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(cqi.Call.DepartmentId);

                            _queueService.EnqueueCallBroadcast(cqi);

                            messageEvent.Processed = true;
                        }

                        if (!isDispatchSource && textCommandEnabled)
                        {
                            var profile = _userProfileService.FindProfileByMobileNumber(textMessage.Msisdn);

                            if (profile != null)
                            {
                                var payload        = _textCommandService.DetermineType(textMessage.Text);
                                var customActions  = customStates.FirstOrDefault(x => x.Type == (int)CustomStateTypes.Personnel);
                                var customStaffing = customStates.FirstOrDefault(x => x.Type == (int)CustomStateTypes.Staffing);

                                switch (payload.Type)
                                {
                                case TextCommandTypes.None:
                                    response.Message("Resgrid (https://resgrid.com) Automated Text System. Unknown command, text help for supported commands.");
                                    break;

                                case TextCommandTypes.Help:
                                    messageEvent.Processed = true;

                                    var help = new StringBuilder();
                                    help.Append("Resgrid Text Commands" + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);
                                    help.Append("These are the commands you can text to alter your status and staffing. Text help for help." + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);
                                    help.Append("Core Commands" + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);
                                    help.Append("STOP: To turn off all text messages" + Environment.NewLine);
                                    help.Append("HELP: This help text" + Environment.NewLine);
                                    help.Append("CALLS: List active calls" + Environment.NewLine);
                                    help.Append("C[CallId]: Get Call Detail i.e. C1445" + Environment.NewLine);
                                    help.Append("UNITS: List unit statuses" + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);
                                    help.Append("Status or Action Commands" + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);

                                    if (customActions != null && customActions.IsDeleted == false && customActions.GetActiveDetails() != null && customActions.GetActiveDetails().Any())
                                    {
                                        var activeDetails = customActions.GetActiveDetails();
                                        for (int i = 0; i < activeDetails.Count; i++)
                                        {
                                            help.Append($"{activeDetails[i].ButtonText.Trim().Replace(" ", "").Replace("-", "").Replace(":", "")} or {i + 1}: {activeDetails[i].ButtonText}" + Environment.NewLine);
                                        }
                                    }
                                    else
                                    {
                                        help.Append("responding or 1: Responding" + Environment.NewLine);
                                        help.Append("notresponding or 2: Not Responding" + Environment.NewLine);
                                        help.Append("onscene or 3: On Scene" + Environment.NewLine);
                                        help.Append("available or 4: Available" + Environment.NewLine);
                                    }
                                    help.Append("---------------------" + Environment.NewLine);
                                    help.Append("Staffing Commands" + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);

                                    if (customStaffing != null && customStaffing.IsDeleted == false && customStaffing.GetActiveDetails() != null && customStaffing.GetActiveDetails().Any())
                                    {
                                        var activeDetails = customStaffing.GetActiveDetails();
                                        for (int i = 0; i < activeDetails.Count; i++)
                                        {
                                            help.Append($"{activeDetails[i].ButtonText.Trim().Replace(" ", "").Replace("-", "").Replace(":", "")} or S{i + 1}: {activeDetails[i].ButtonText}" + Environment.NewLine);
                                        }
                                    }
                                    else
                                    {
                                        help.Append("available or s1: Available Staffing" + Environment.NewLine);
                                        help.Append("delayed or s2: Delayed Staffing" + Environment.NewLine);
                                        help.Append("unavailable or s3: Unavailable Staffing" + Environment.NewLine);
                                        help.Append("committed or s4: Committed Staffing" + Environment.NewLine);
                                        help.Append("onshift or s4: On Shift Staffing" + Environment.NewLine);
                                    }

                                    response.Message(help.ToString());

                                    //_communicationService.SendTextMessage(profile.UserId, "Resgrid TCI Help", help.ToString(), department.DepartmentId, textMessage.To, profile);
                                    break;

                                case TextCommandTypes.Action:
                                    messageEvent.Processed = true;
                                    _actionLogsService.SetUserAction(profile.UserId, department.DepartmentId, (int)payload.GetActionType());
                                    response.Message(string.Format("Resgrid recieved your text command. Status changed to: {0}", payload.GetActionType()));
                                    //_communicationService.SendTextMessage(profile.UserId, "Resgrid TCI Status", string.Format("Resgrid recieved your text command. Status changed to: {0}", payload.GetActionType()), department.DepartmentId, textMessage.To, profile);
                                    break;

                                case TextCommandTypes.Staffing:
                                    messageEvent.Processed = true;
                                    _userStateService.CreateUserState(profile.UserId, department.DepartmentId, (int)payload.GetStaffingType());
                                    response.Message(string.Format("Resgrid recieved your text command. Staffing level changed to: {0}", payload.GetStaffingType()));
                                    //_communicationService.SendTextMessage(profile.UserId, "Resgrid TCI Staffing", string.Format("Resgrid recieved your text command. Staffing level changed to: {0}", payload.GetStaffingType()), department.DepartmentId, textMessage.To, profile);
                                    break;

                                case TextCommandTypes.Stop:
                                    messageEvent.Processed = true;
                                    _userProfileService.DisableTextMessagesForUser(profile.UserId);
                                    response.Message("Text messages are now turned off for this user, to enable again log in to Resgrid and update your profile.");
                                    break;

                                case TextCommandTypes.CustomAction:
                                    messageEvent.Processed = true;
                                    _actionLogsService.SetUserAction(profile.UserId, department.DepartmentId, payload.GetCustomActionType());

                                    if (customActions != null && customActions.IsDeleted == false && customActions.GetActiveDetails() != null && customActions.GetActiveDetails().Any() && customActions.GetActiveDetails().FirstOrDefault(x => x.CustomStateDetailId == payload.GetCustomActionType()) != null)
                                    {
                                        var detail = customActions.GetActiveDetails().FirstOrDefault(x => x.CustomStateDetailId == payload.GetCustomActionType());
                                        response.Message(string.Format("Resgrid recieved your text command. Status changed to: {0}", detail.ButtonText));
                                    }
                                    else
                                    {
                                        response.Message("Resgrid recieved your text command and updated your status");
                                    }
                                    break;

                                case TextCommandTypes.CustomStaffing:
                                    messageEvent.Processed = true;
                                    _userStateService.CreateUserState(profile.UserId, department.DepartmentId, payload.GetCustomStaffingType());

                                    if (customStaffing != null && customStaffing.IsDeleted == false && customStaffing.GetActiveDetails() != null && customStaffing.GetActiveDetails().Any() && customStaffing.GetActiveDetails().FirstOrDefault(x => x.CustomStateDetailId == payload.GetCustomStaffingType()) != null)
                                    {
                                        var detail = customStaffing.GetActiveDetails().FirstOrDefault(x => x.CustomStateDetailId == payload.GetCustomStaffingType());
                                        response.Message(string.Format("Resgrid recieved your text command. Staffing changed to: {0}", detail.ButtonText));
                                    }
                                    else
                                    {
                                        response.Message("Resgrid recieved your text command and updated your staffing");
                                    }
                                    break;

                                case TextCommandTypes.MyStatus:
                                    messageEvent.Processed = true;


                                    var userStatus   = _actionLogsService.GetLastActionLogForUser(profile.UserId);
                                    var userStaffing = _userStateService.GetLastUserStateByUserId(profile.UserId);

                                    var customStatusLevel   = _customStateService.GetCustomPersonnelStatus(department.DepartmentId, userStatus);
                                    var customStaffingLevel = _customStateService.GetCustomPersonnelStaffing(department.DepartmentId, userStaffing);

                                    response.Message($"Hello {profile.FullName.AsFirstNameLastName} at {DateTime.UtcNow.TimeConverterToString(department)} your current status is {customStatusLevel.ButtonText} and your current staffing is {customStaffingLevel.ButtonText}.");
                                    break;

                                case TextCommandTypes.Calls:
                                    messageEvent.Processed = true;

                                    var activeCalls = _callsService.GetActiveCallsByDepartment(department.DepartmentId);

                                    var activeCallText = new StringBuilder();
                                    activeCallText.Append($"Active Calls for {department.Name}" + Environment.NewLine);
                                    activeCallText.Append("---------------------" + Environment.NewLine);

                                    foreach (var activeCall in activeCalls)
                                    {
                                        activeCallText.Append($"CallId: {activeCall.CallId} Name: {activeCall.Name} Nature:{activeCall.NatureOfCall}" + Environment.NewLine);
                                    }


                                    response.Message(activeCallText.ToString());
                                    break;

                                case TextCommandTypes.Units:
                                    messageEvent.Processed = true;

                                    var unitStatus = _unitsService.GetAllLatestStatusForUnitsByDepartmentId(department.DepartmentId);

                                    var unitStatusesText = new StringBuilder();
                                    unitStatusesText.Append($"Unit Statuses for {department.Name}" + Environment.NewLine);
                                    unitStatusesText.Append("---------------------" + Environment.NewLine);

                                    foreach (var unit in unitStatus)
                                    {
                                        var unitState = _customStateService.GetCustomUnitState(unit);
                                        unitStatusesText.Append($"{unit.Unit.Name} is {unitState.ButtonText}" + Environment.NewLine);
                                    }

                                    response.Message(unitStatusesText.ToString());
                                    break;

                                case TextCommandTypes.CallDetail:
                                    messageEvent.Processed = true;

                                    var call = _callsService.GetCallById(int.Parse(payload.Data));

                                    var callText = new StringBuilder();
                                    callText.Append($"Call Information for {call.Name}" + Environment.NewLine);
                                    callText.Append("---------------------" + Environment.NewLine);
                                    callText.Append($"Id: {call.CallId}" + Environment.NewLine);
                                    callText.Append($"Number: {call.Number}" + Environment.NewLine);
                                    callText.Append($"Logged: {call.LoggedOn.TimeConverterToString(department)}" + Environment.NewLine);
                                    callText.Append("-----Nature-----" + Environment.NewLine);
                                    callText.Append(call.NatureOfCall + Environment.NewLine);
                                    callText.Append("-----Address-----" + Environment.NewLine);

                                    if (!String.IsNullOrWhiteSpace(call.Address))
                                    {
                                        callText.Append(call.Address + Environment.NewLine);
                                    }
                                    else if (!string.IsNullOrEmpty(call.GeoLocationData))
                                    {
                                        try
                                        {
                                            string[] points = call.GeoLocationData.Split(char.Parse(","));

                                            if (points != null && points.Length == 2)
                                            {
                                                callText.Append(_geoLocationProvider.GetAproxAddressFromLatLong(double.Parse(points[0]), double.Parse(points[1])) + Environment.NewLine);
                                            }
                                        }
                                        catch
                                        {
                                        }
                                    }

                                    response.Message(callText.ToString());
                                    break;
                                }
                            }
                        }
                    }
                }
                else if (textMessage.To == "17753765253")                 // Resgrid master text number
                {
                    var profile = _userProfileService.FindProfileByMobileNumber(textMessage.Msisdn);
                    var payload = _textCommandService.DetermineType(textMessage.Text);

                    switch (payload.Type)
                    {
                    case TextCommandTypes.None:
                        response.Message("Resgrid (https://resgrid.com) Automated Text System. Unknown command, text help for supported commands.");
                        break;

                    case TextCommandTypes.Help:
                        messageEvent.Processed = true;

                        var help = new StringBuilder();
                        help.Append("Resgrid Text Commands" + Environment.NewLine);
                        help.Append("---------------------" + Environment.NewLine);
                        help.Append("This is the Resgrid system for first responders (https://resgrid.com) automated text system. Your department isn't signed up for inbound text messages, but you can send the following commands." + Environment.NewLine);
                        help.Append("---------------------" + Environment.NewLine);
                        help.Append("STOP: To turn off all text messages" + Environment.NewLine);
                        help.Append("HELP: This help text" + Environment.NewLine);

                        response.Message(help.ToString());

                        break;

                    case TextCommandTypes.Stop:
                        messageEvent.Processed = true;
                        _userProfileService.DisableTextMessagesForUser(profile.UserId);
                        response.Message("Text messages are now turned off for this user, to enable again log in to Resgrid and update your profile.");
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Framework.Logging.LogException(ex);
            }
            finally
            {
                _numbersService.SaveInboundMessageEvent(messageEvent);
            }

            //return Request.CreateResponse(HttpStatusCode.OK);

            //var response = new TwilioResponse();

            return(Request.CreateResponse(HttpStatusCode.OK, response.Element, new XmlMediaTypeFormatter()));
        }
Example #13
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));
        }
Example #14
0
        public List <ProcessedNotification> ProcessNotifications(List <ProcessedNotification> notifications, List <DepartmentNotification> settings)
        {
            if (notifications == null || notifications.Count < 0)
            {
                return(null);
            }

            //if (settings == null || settings.Count < 0)
            //	return null;

            var processNotifications = new List <ProcessedNotification>();

            foreach (var notification in notifications)
            {
                if (settings != null && settings.Any())
                {
                    var typeSettings = settings.Where(x => x.EventType == (int)notification.Type);

                    if (typeSettings != null && typeSettings.Any())
                    {
                        processNotifications.Add(notification);

                        foreach (var setting in typeSettings)
                        {
                            if (ValidateNotificationForProcessing(notification, setting))
                            {
                                if (setting.Everyone)                                 // Add Everyone
                                {
                                    notification.Users =
                                        _departmentsService.GetAllUsersForDepartment(notification.DepartmentId, true).Select(x => x.UserId).ToList();
                                }
                                else if (setting.DepartmentAdmins)                                 // Add Only Department Admins
                                {
                                    notification.Users =
                                        _departmentsService.GetAllAdminsForDepartment(notification.DepartmentId).Select(x => x.UserId).ToList();
                                }
                                else if (setting.LockToGroup && EventOptions.GroupEvents.Contains(notification.Type))
                                // We are locked to the source group
                                {
                                    var group = GetGroupForEvent(notification);
                                    if (group != null)
                                    {
                                        if (setting.SelectedGroupsAdminsOnly)                                         // Only add source group admins
                                        {
                                            var usersInGroup = _departmentGroupsService.GetAllAdminsForGroup(group.DepartmentGroupId);

                                            if (usersInGroup != null)
                                            {
                                                foreach (var user in usersInGroup)
                                                {
                                                    if (!notification.Users.Contains(user.UserId))
                                                    {
                                                        notification.Users.Add(user.UserId);
                                                    }
                                                }
                                            }
                                        }
                                        else                                         // Add source group users in selected roles
                                        {
                                            var usersInGroup = _departmentGroupsService.GetAllMembersForGroup(group.DepartmentGroupId)
                                                               .Select(x => x.UserId);
                                            var roles = setting.RolesToNotify.Split(char.Parse(","));

                                            foreach (var roleId in roles)
                                            {
                                                var usersInRole = _personnelRolesService.GetAllMembersOfRole(int.Parse(roleId));

                                                if (usersInRole != null)
                                                {
                                                    foreach (var user in usersInRole)
                                                    {
                                                        if (usersInGroup.Contains(user.UserId) && !notification.Users.Contains(user.UserId))
                                                        {
                                                            notification.Users.Add(user.UserId);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                else                                 // Run through users, Roles and groups
                                {
                                    if (!String.IsNullOrWhiteSpace(setting.RolesToNotify))
                                    {
                                        var roles = setting.RolesToNotify.Split(char.Parse(","));
                                        foreach (var roleId in roles)                                         // Add all users in Roles
                                        {
                                            var usersInRole = _personnelRolesService.GetAllMembersOfRole(int.Parse(roleId));
                                            foreach (var user in usersInRole)
                                            {
                                                if (!notification.Users.Contains(user.UserId))
                                                {
                                                    notification.Users.Add(user.UserId);
                                                }
                                            }
                                        }
                                    }

                                    if (!String.IsNullOrWhiteSpace(setting.UsersToNotify))
                                    {
                                        var users = setting.UsersToNotify.Split(char.Parse(","));
                                        if (users != null)
                                        {
                                            foreach (var userId in users)                                             // Add all Users
                                            {
                                                if (!notification.Users.Contains(userId))
                                                {
                                                    notification.Users.Add(userId);
                                                }
                                            }
                                        }
                                    }

                                    if (!String.IsNullOrWhiteSpace(setting.GroupsToNotify))
                                    {
                                        var groups = setting.GroupsToNotify.Split(char.Parse(","));
                                        if (groups != null)
                                        {
                                            foreach (var groupId in groups)                                             // Add all users in Groups
                                            {
                                                if (setting.SelectedGroupsAdminsOnly)                                   // Only add group admins
                                                {
                                                    var usersInGroup = _departmentGroupsService.GetAllAdminsForGroup(int.Parse(groupId));

                                                    if (usersInGroup != null)
                                                    {
                                                        foreach (var user in usersInGroup)
                                                        {
                                                            if (!notification.Users.Contains(user.UserId))
                                                            {
                                                                notification.Users.Add(user.UserId);
                                                            }
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    var usersInGroup = _departmentGroupsService.GetAllMembersForGroup(int.Parse(groupId));

                                                    if (usersInGroup != null)
                                                    {
                                                        foreach (var user in usersInGroup)
                                                        {
                                                            if (!notification.Users.Contains(user.UserId))
                                                            {
                                                                notification.Users.Add(user.UserId);
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if (notification.Type == EventTypes.CalendarEventAdded)
                {
                    var calEvent = _calendarService.GetCalendarItemById(notification.ItemId);

                    if (calEvent != null)
                    {
                        if (calEvent.ItemType == 0 && !String.IsNullOrWhiteSpace(calEvent.Entities))                         // NONE: Notify based on entities
                        {
                            var items = calEvent.Entities.Split(char.Parse(","));

                            if (items.Any(x => x.StartsWith("D:")))
                            {
                                notification.Users =
                                    _departmentsService.GetAllUsersForDepartment(notification.DepartmentId, true).Select(x => x.UserId).ToList();
                            }
                            else
                            {
                                foreach (var val in items)
                                {
                                    int groupId = 0;
                                    if (int.TryParse(val.Replace("G:", ""), out groupId))
                                    {
                                        var usersInGroup = _departmentGroupsService.GetAllMembersForGroup(groupId);

                                        if (usersInGroup != null)
                                        {
                                            foreach (var user in usersInGroup)
                                            {
                                                if (!notification.Users.Contains(user.UserId))
                                                {
                                                    notification.Users.Add(user.UserId);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else if (calEvent.ItemType == 1)                         // ASSIGNED: Notify based on Required and Optional attendees
                        {
                        }
                        else if (calEvent.ItemType == 1)                         // RSVP: Notify entire department
                        {
                            notification.Users =
                                _departmentsService.GetAllUsersForDepartment(notification.DepartmentId, true).Select(x => x.UserId).ToList();
                        }
                    }
                }
                else if (notification.Type == EventTypes.CalendarEventUpdated)
                {
                    var calEvent = _calendarService.GetCalendarItemById(notification.ItemId);

                    if (calEvent != null)
                    {
                        if (calEvent.ItemType == 0 && !String.IsNullOrWhiteSpace(calEvent.Entities))                         // NONE: Notify based on entities
                        {
                            var items = calEvent.Entities.Split(char.Parse(","));

                            if (items.Any(x => x.StartsWith("D:")))
                            {
                                notification.Users =
                                    _departmentsService.GetAllUsersForDepartment(notification.DepartmentId, true).Select(x => x.UserId).ToList();
                            }
                            else
                            {
                                foreach (var val in items)
                                {
                                    int groupId = 0;
                                    if (int.TryParse(val.Replace("G:", ""), out groupId))
                                    {
                                        var usersInGroup = _departmentGroupsService.GetAllMembersForGroup(groupId);

                                        if (usersInGroup != null)
                                        {
                                            foreach (var user in usersInGroup)
                                            {
                                                if (!notification.Users.Contains(user.UserId))
                                                {
                                                    notification.Users.Add(user.UserId);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else if (calEvent.ItemType == 1)                         // ASSIGNED: Notify based on Required and Optional attendees
                        {
                        }
                        else if (calEvent.ItemType == 1 && calEvent.Attendees != null && calEvent.Attendees.Any())                         // RSVP: Notify people who've signed up
                        {
                            foreach (var attendee in calEvent.Attendees)
                            {
                                if (!notification.Users.Contains(attendee.UserId))
                                {
                                    notification.Users.Add(attendee.UserId);
                                }
                            }
                        }
                    }
                }
            }

            return(processNotifications);
        }
Example #15
0
        public CoreDataResult GetCoreData()
        {
            var results = new CoreDataResult();

            results.Personnel   = new List <PersonnelInfoResult>();
            results.Groups      = new List <GroupInfoResult>();
            results.Units       = new List <UnitInfoResult>();
            results.Roles       = new List <RoleInfoResult>();
            results.Statuses    = new List <CustomStatusesResult>();
            results.Priorities  = new List <CallPriorityResult>();
            results.Departments = new List <JoinedDepartmentResult>();

            var users  = _departmentsService.GetAllUsersForDepartment(DepartmentId);
            var groups = _departmentGroupsService.GetAllDepartmentGroupsForDepartment(DepartmentId);
            var rolesForUsersInDepartment = _personnelRolesService.GetAllRolesForUsersInDepartment(DepartmentId);
            var allRoles      = _personnelRolesService.GetRolesForDepartment(DepartmentId);
            var allProfiles   = _userProfileService.GetAllProfilesForDepartment(DepartmentId);
            var allGroups     = _departmentGroupsService.GetAllGroupsForDepartment(DepartmentId);
            var units         = _unitsService.GetUnitsForDepartment(DepartmentId);
            var unitTypes     = _unitsService.GetUnitTypesForDepartment(DepartmentId);
            var callPriorites = _callsService.GetCallPrioritesForDepartment(DepartmentId);

            foreach (var user in users)
            {
                UserProfile profile = null;
                if (allProfiles.ContainsKey(user.UserId))
                {
                    profile = allProfiles[user.UserId];
                }

                DepartmentGroup group = null;
                if (groups.ContainsKey(user.UserId))
                {
                    group = groups[user.UserId];
                }

                List <PersonnelRole> roles = null;
                if (rolesForUsersInDepartment.ContainsKey(user.UserId))
                {
                    roles = rolesForUsersInDepartment[user.UserId];
                }

                var result = new PersonnelInfoResult();

                if (profile != null)
                {
                    result.Fnm = profile.FirstName;
                    result.Lnm = profile.LastName;
                    result.Id  = profile.IdentificationNumber;


                    result.Mnu = profile.MobileNumber;
                }
                else
                {
                    result.Fnm = "Unknown";
                    result.Lnm = "Check Profile";
                    result.Id  = "";
                    result.Mnu = "";
                }

                if (user != null)
                {
                    result.Eml = user.Email;
                }

                result.Did = DepartmentId;
                result.Uid = user.UserId.ToString();

                if (group != null)
                {
                    result.Gid = group.DepartmentGroupId;
                    result.Gnm = group.Name;
                }

                result.Roles = new List <string>();
                if (roles != null && roles.Count > 0)
                {
                    foreach (var role in roles)
                    {
                        if (role != null)
                        {
                            result.Roles.Add(role.Name);
                        }
                    }
                }

                results.Personnel.Add(result);
            }


            results.Rights = new DepartmentRightsResult();
            var currentUser = _usersService.GetUserByName(UserName);

            if (currentUser == null)
            {
                throw HttpStatusCode.Unauthorized.AsException();
            }

            var department = _departmentsService.GetDepartmentById(DepartmentId, false);

            results.Rights.Adm  = department.IsUserAnAdmin(currentUser.UserId);
            results.Rights.Grps = new List <GroupRight>();

            var currentGroup = _departmentGroupsService.GetGroupForUser(currentUser.UserId, DepartmentId);

            if (currentGroup != null)
            {
                var groupRight = new GroupRight();
                groupRight.Gid = currentGroup.DepartmentGroupId;
                groupRight.Adm = currentGroup.IsUserGroupAdmin(currentUser.UserId);

                results.Rights.Grps.Add(groupRight);
            }

            foreach (var group in allGroups)
            {
                var groupInfo = new GroupInfoResult();
                groupInfo.Gid = group.DepartmentGroupId;
                groupInfo.Nme = group.Name;

                if (group.Type.HasValue)
                {
                    groupInfo.Typ = group.Type.Value;
                }

                if (group.Address != null)
                {
                    groupInfo.Add = group.Address.FormatAddress();
                }

                results.Groups.Add(groupInfo);
            }

            foreach (var unit in units)
            {
                var unitResult = new UnitInfoResult();
                unitResult.Uid = unit.UnitId;
                unitResult.Did = DepartmentId;
                unitResult.Nme = unit.Name;
                unitResult.Typ = unit.Type;

                if (!string.IsNullOrWhiteSpace(unit.Type))
                {
                    var unitType = unitTypes.FirstOrDefault(x => x.Type == unit.Type);

                    if (unitType != null)
                    {
                        unitResult.Cid = unitType.CustomStatesId.GetValueOrDefault();
                    }
                }
                else
                {
                    unitResult.Cid = 0;
                }

                if (unit.StationGroup != null)
                {
                    unitResult.Sid = unit.StationGroup.DepartmentGroupId;
                    unitResult.Snm = unit.StationGroup.Name;
                }

                results.Units.Add(unitResult);
            }

            foreach (var role in allRoles)
            {
                var roleResult = new RoleInfoResult();
                roleResult.Rid = role.PersonnelRoleId;
                roleResult.Nme = role.Name;

                results.Roles.Add(roleResult);
            }

            var customStates = _customStateService.GetAllActiveCustomStatesForDepartment(DepartmentId);

            foreach (var customState in customStates)
            {
                if (customState != null)
                {
                    if (customState.IsDeleted || customState.Details == null)
                    {
                        continue;
                    }

                    foreach (var stateDetail in customState.Details)
                    {
                        if (stateDetail == null || stateDetail.IsDeleted)
                        {
                            continue;
                        }

                        var customStateResult = new CustomStatusesResult();
                        customStateResult.Id      = stateDetail.CustomStateDetailId;
                        customStateResult.Type    = customState.Type;
                        customStateResult.StateId = stateDetail.CustomStateId;
                        customStateResult.Text    = stateDetail.ButtonText;
                        customStateResult.BColor  = stateDetail.ButtonColor;
                        customStateResult.Color   = stateDetail.TextColor;
                        customStateResult.Gps     = stateDetail.GpsRequired;
                        customStateResult.Note    = stateDetail.NoteType;
                        customStateResult.Detail  = stateDetail.DetailType;

                        if (customState.IsDeleted)
                        {
                            customStateResult.IsDeleted = true;
                        }
                        else
                        {
                            customStateResult.IsDeleted = stateDetail.IsDeleted;
                        }

                        results.Statuses.Add(customStateResult);
                    }
                }
            }

            foreach (var priority in callPriorites)
            {
                var priorityResult = new CallPriorityResult();
                priorityResult.Id           = priority.DepartmentCallPriorityId;
                priorityResult.DepartmentId = priority.DepartmentId;
                priorityResult.Name         = priority.Name;
                priorityResult.Color        = priority.Color;
                priorityResult.Sort         = priority.Sort;
                priorityResult.IsDeleted    = priority.IsDeleted;
                priorityResult.IsDefault    = priority.IsDefault;

                results.Priorities.Add(priorityResult);
            }

            var members = _departmentsService.GetAllDepartmentsForUser(UserId);

            foreach (var member in members)
            {
                if (member.IsDeleted)
                {
                    continue;
                }

                if (member.IsDisabled.GetValueOrDefault())
                {
                    continue;
                }

                var depRest = new JoinedDepartmentResult();
                depRest.Did = member.DepartmentId;
                depRest.Nme = member.Department.Name;

                results.Departments.Add(depRest);
            }

            return(results);
        }
Example #16
0
        public IActionResult New(NewTrainingModel model, IFormCollection form, ICollection <IFormFile> attachments)
        {
            model.Training.CreatedByUserId = UserId;

            if (attachments != null)
            {
                model.Training.Attachments = new Collection <TrainingAttachment>();
                foreach (var file in attachments)
                {
                    if (file != null && file.Length > 0)
                    {
                        var extenion = file.FileName.Substring(file.FileName.IndexOf(char.Parse(".")) + 1,
                                                               file.FileName.Length - file.FileName.IndexOf(char.Parse(".")) - 1);

                        if (!String.IsNullOrWhiteSpace(extenion))
                        {
                            extenion = extenion.ToLower();
                        }

                        if (extenion != "jpg" && extenion != "jpeg" && extenion != "png" && extenion != "gif" && extenion != "gif" &&
                            extenion != "pdf" && extenion != "doc" &&
                            extenion != "docx" && extenion != "ppt" && extenion != "pptx" && extenion != "pps" && extenion != "ppsx" &&
                            extenion != "odt" &&
                            extenion != "xls" && extenion != "xlsx" && extenion != "txt" && extenion != "mpg" && extenion != "avi" &&
                            extenion != "mpeg")
                        {
                            ModelState.AddModelError("fileToUpload", string.Format("File type ({0}) is not importable.", extenion));
                        }

                        if (file.Length > 30000000)
                        {
                            ModelState.AddModelError("fileToUpload", "Attachment is too large, must be smaller then 30MB.");
                        }

                        var attachment = new TrainingAttachment();
                        attachment.FileType = file.ContentType;
                        attachment.FileName = file.FileName;

                        var uploadedFile = new byte[file.OpenReadStream().Length];
                        file.OpenReadStream().Read(uploadedFile, 0, uploadedFile.Length);

                        attachment.Data = uploadedFile;
                        model.Training.Attachments.Add(attachment);
                    }
                }
            }

            var roles  = new List <string>();
            var groups = new List <string>();
            var users  = new List <string>();

            if (form.ContainsKey("rolesToAdd"))
            {
                roles.AddRange(form["rolesToAdd"].ToString().Split(char.Parse(",")));
            }

            if (form.ContainsKey("groupsToAdd"))
            {
                groups.AddRange(form["groupsToAdd"].ToString().Split(char.Parse(",")));
            }

            if (form.ContainsKey("usersToAdd"))
            {
                users.AddRange(form["usersToAdd"].ToString().Split(char.Parse(",")));
            }

            model.Training.Users = new List <TrainingUser>();

            if (model.SendToAll)
            {
                var allUsers = _departmentsService.GetAllUsersForDepartment(DepartmentId);
                foreach (var user in allUsers)
                {
                    var trainingUser = new TrainingUser();
                    trainingUser.UserId = user.UserId;

                    model.Training.Users.Add(trainingUser);
                }
            }
            else
            {
                foreach (var user in users)
                {
                    var trainingUser = new TrainingUser();
                    trainingUser.UserId = user;

                    model.Training.Users.Add(trainingUser);
                }

                foreach (var group in groups)
                {
                    var members = _departmentGroupsService.GetAllMembersForGroup(int.Parse(group));

                    foreach (var member in members)
                    {
                        var trainingUser = new TrainingUser();
                        trainingUser.UserId = member.UserId;

                        if (model.Training.Users.All(x => x.UserId != member.UserId))
                        {
                            model.Training.Users.Add(trainingUser);
                        }
                    }
                }

                foreach (var role in roles)
                {
                    var roleMembers = _personnelRolesService.GetAllMembersOfRole(int.Parse(role));

                    foreach (var member in roleMembers)
                    {
                        var trainingUser = new TrainingUser();
                        trainingUser.UserId = member.UserId;

                        if (model.Training.Users.All(x => x.UserId != member.UserId))
                        {
                            model.Training.Users.Add(trainingUser);
                        }
                    }
                }
            }

            if (!model.Training.Users.Any())
            {
                ModelState.AddModelError("", "You have not selected any personnel, roles or groups to assign this training to.");
            }

            if (ModelState.IsValid)
            {
                List <int> questions = (from object key in form.Keys where key.ToString().StartsWith("question_") select int.Parse(key.ToString().Replace("question_", ""))).ToList();

                if (questions.Count > 0)
                {
                    model.Training.Questions = new Collection <TrainingQuestion>();
                }

                model.Training.DepartmentId    = DepartmentId;
                model.Training.CreatedOn       = DateTime.UtcNow;
                model.Training.CreatedByUserId = UserId;
                model.Training.GroupsToAdd     = form["groupsToAdd"];
                model.Training.RolesToAdd      = form["rolesToAdd"];
                model.Training.UsersToAdd      = form["usersToAdd"];
                model.Training.Description     = System.Net.WebUtility.HtmlDecode(model.Training.Description);
                model.Training.TrainingText    = System.Net.WebUtility.HtmlDecode(model.Training.TrainingText);


                foreach (var i in questions)
                {
                    if (form.ContainsKey("question_" + i))
                    {
                        var questionText = form["question_" + i];
                        var question     = new TrainingQuestion();
                        question.Question = questionText;

                        List <int> answers = (from object key in form.Keys where key.ToString().StartsWith("answerForQuestion_" + i + "_") select int.Parse(key.ToString().Replace("answerForQuestion_" + i + "_", ""))).ToList();

                        if (answers.Count > 0)
                        {
                            question.Answers = new Collection <TrainingQuestionAnswer>();
                        }

                        foreach (var answer in answers)
                        {
                            var trainingQuestionAnswer = new TrainingQuestionAnswer();
                            var answerForQuestion      = form["answerForQuestion_" + i + "_" + answer];

                            var possibleAnswer = form["answer_" + i];
                            trainingQuestionAnswer.Answer = answerForQuestion;

                            if (!string.IsNullOrWhiteSpace(possibleAnswer))
                            {
                                if ("answerForQuestion_" + i + "_" + answer == possibleAnswer)
                                {
                                    trainingQuestionAnswer.Correct = true;
                                }
                            }

                            question.Answers.Add(trainingQuestionAnswer);
                        }

                        model.Training.Questions.Add(question);
                    }
                }

                _trainingService.Save(model.Training);

                return(RedirectToAction("Index"));
            }

            return(View(model));
        }
Example #17
0
        public HttpResponseMessage Receive(PostmarkInboundMessage message)
        {
            if (message != null)
            {
                try
                {
                    var mailMessage = new MimeMessage();

                    if (message.FromFull != null && !String.IsNullOrWhiteSpace(message.FromFull.Email) && message.FromFull.Email.Trim() == "*****@*****.**")
                    {
                        return(new HttpResponseMessage(HttpStatusCode.Created));
                    }

                    if (message.FromFull != null && !String.IsNullOrWhiteSpace(message.FromFull.Email) && !String.IsNullOrWhiteSpace(message.FromFull.Name))
                    {
                        mailMessage.From.Add(new MailboxAddress(message.FromFull.Name.Trim(), message.FromFull.Email.Trim()));
                    }
                    else
                    {
                        mailMessage.From.Add(new MailboxAddress("Inbound Email Dispatch", "*****@*****.**"));
                    }

                    if (!String.IsNullOrWhiteSpace(message.Subject))
                    {
                        mailMessage.Subject = message.Subject;
                    }
                    else
                    {
                        mailMessage.Subject = "Dispatch Email";
                    }

                    var builder = new BodyBuilder();

                    if (!String.IsNullOrWhiteSpace(message.HtmlBody))
                    {
                        builder.HtmlBody = HttpUtility.HtmlDecode(message.HtmlBody);
                    }

                    if (!String.IsNullOrWhiteSpace(message.TextBody))
                    {
                        builder.TextBody = message.TextBody;
                    }

                    int    type         = 0;          // 1 = dispatch // 2 = email list // 3 = group dispatch // 4 = group message
                    string emailAddress = String.Empty;
                    string bounceEmail  = String.Empty;
                    string name         = String.Empty;

                    #region Trying to Find What type of email this is
                    foreach (var email in message.ToFull)
                    {
                        if (StringHelpers.ValidateEmail(email.Email))
                        {
                            if (email.Email.Contains($"@{Config.InboundEmailConfig.DispatchDomain}") || email.Email.Contains($"@{Config.InboundEmailConfig.DispatchTestDomain}"))
                            {
                                type = 1;

                                if (email.Email.Contains($"@{Config.InboundEmailConfig.DispatchDomain}"))
                                {
                                    emailAddress = email.Email.Replace($"@{Config.InboundEmailConfig.DispatchDomain}", "");
                                }
                                else
                                {
                                    emailAddress = email.Email.Replace($"@{Config.InboundEmailConfig.DispatchTestDomain}", "");
                                }

                                name = email.Name;
                                mailMessage.To.Clear();
                                mailMessage.To.Add(new MailboxAddress(email.Name, email.Email));

                                break;
                            }
                            else if (email.Email.Contains($"@{Config.InboundEmailConfig.ListsDomain}") || email.Email.Contains($"@{Config.InboundEmailConfig.ListsTestDomain}"))
                            {
                                type = 2;

                                if (email.Email.Contains($"@{Config.InboundEmailConfig.ListsDomain}"))
                                {
                                    emailAddress = email.Email.Replace($"@{Config.InboundEmailConfig.ListsDomain}", "");
                                }
                                else
                                {
                                    emailAddress = email.Email.Replace($"@{Config.InboundEmailConfig.ListsTestDomain}", "");
                                }

                                if (emailAddress.Contains("+") && emailAddress.Contains("="))
                                {
                                    var tempBounceEmail = emailAddress.Substring(emailAddress.IndexOf("+") + 1);
                                    bounceEmail = tempBounceEmail.Replace("=", "@");

                                    emailAddress = emailAddress.Replace(tempBounceEmail, "");
                                    emailAddress = emailAddress.Replace("+", "");
                                }

                                name = email.Name;
                                mailMessage.To.Clear();
                                mailMessage.To.Add(new MailboxAddress(email.Name, email.Email));

                                break;
                            }
                            else if (email.Email.Contains($"@{Config.InboundEmailConfig.GroupsDomain}") || email.Email.Contains($"@{Config.InboundEmailConfig.GroupsTestDomain}"))
                            {
                                type = 3;

                                if (email.Email.Contains($"@{Config.InboundEmailConfig.GroupsDomain}"))
                                {
                                    emailAddress = email.Email.Replace($"@{Config.InboundEmailConfig.GroupsDomain}", "");
                                }
                                else
                                {
                                    emailAddress = email.Email.Replace($"@{Config.InboundEmailConfig.GroupsTestDomain}", "");
                                }

                                name = email.Name;
                                mailMessage.To.Clear();
                                mailMessage.To.Add(new MailboxAddress(email.Name, email.Email));

                                break;
                            }
                            else if (email.Email.Contains($"@{Config.InboundEmailConfig.GroupMessageDomain}") || email.Email.Contains($"@{Config.InboundEmailConfig.GroupTestMessageDomain}"))
                            {
                                type = 4;

                                if (email.Email.Contains($"@{Config.InboundEmailConfig.GroupMessageDomain}"))
                                {
                                    emailAddress = email.Email.Replace($"@{Config.InboundEmailConfig.GroupMessageDomain}", "");
                                }
                                else
                                {
                                    emailAddress = email.Email.Replace($"@{Config.InboundEmailConfig.GroupTestMessageDomain}", "");
                                }

                                name = email.Name;
                                mailMessage.To.Clear();
                                mailMessage.To.Add(new MailboxAddress(email.Name, email.Email));

                                break;
                            }
                        }
                    }

                    // Some providers aren't putting email address in the To line, process the CC line
                    if (type == 0)
                    {
                        foreach (var email in message.CcFull)
                        {
                            if (StringHelpers.ValidateEmail(email.Email))
                            {
                                var proccedEmailInfo = ProcessEmailAddress(email.Email);

                                if (proccedEmailInfo.Item1 > 0)
                                {
                                    type         = proccedEmailInfo.Item1;
                                    emailAddress = proccedEmailInfo.Item2;

                                    mailMessage.To.Clear();
                                    mailMessage.To.Add(new MailboxAddress(email.Name, email.Email));
                                }
                            }
                        }
                    }

                    // If To and CC didn't work, try the header.
                    if (type == 0)
                    {
                        try
                        {
                            if (message.Headers != null && message.Headers.Count > 0)
                            {
                                var header = message.Headers.FirstOrDefault(x => x.Name == "Received-SPF");

                                if (header != null)
                                {
                                    var lastValue = header.Value.LastIndexOf(char.Parse("="));
                                    var newEmail  = header.Value.Substring(lastValue + 1, (header.Value.Length - (lastValue + 1)));

                                    newEmail = newEmail.Trim();

                                    if (StringHelpers.ValidateEmail(newEmail))
                                    {
                                        emailAddress = newEmail;
                                        var proccedEmailInfo = ProcessEmailAddress(newEmail);

                                        type         = proccedEmailInfo.Item1;
                                        emailAddress = proccedEmailInfo.Item2;

                                        mailMessage.To.Clear();
                                        mailMessage.To.Add(new MailboxAddress("Email Importer", newEmail));
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogException(ex);
                        }
                    }
                    #endregion Trying to Find What type of email this is

                    if (type == 1)                      // Dispatch
                    {
                        #region Dispatch Email
                        var departmentId = _departmentSettingsService.GetDepartmentIdForDispatchEmail(emailAddress);

                        if (departmentId.HasValue)
                        {
                            try
                            {
                                var emailSettings = _departmentsService.GetDepartmentEmailSettings(departmentId.Value);
                                List <IdentityUser> departmentUsers = _departmentsService.GetAllUsersForDepartment(departmentId.Value, true);

                                var callEmail = new CallEmail();

                                if (!String.IsNullOrWhiteSpace(message.Subject))
                                {
                                    callEmail.Subject = message.Subject;
                                }

                                else
                                {
                                    callEmail.Subject = "Dispatch Email";
                                }

                                if (!String.IsNullOrWhiteSpace(message.HtmlBody))
                                {
                                    callEmail.Body = HttpUtility.HtmlDecode(message.HtmlBody);
                                }
                                else
                                {
                                    callEmail.Body = message.TextBody;
                                }

                                callEmail.TextBody = message.TextBody;

                                foreach (var attachment in message.Attachments)
                                {
                                    try
                                    {
                                        if (Convert.ToInt32(attachment.ContentLength) > 0)
                                        {
                                            if (attachment.Name.Contains(".mp3") || attachment.Name.Contains(".amr"))
                                            {
                                                byte[] filebytes = Convert.FromBase64String(attachment.Content);

                                                callEmail.DispatchAudioFileName = attachment.Name;
                                                callEmail.DispatchAudio         = filebytes;
                                            }
                                        }
                                    }
                                    catch { }
                                }

                                if (emailSettings == null)
                                {
                                    emailSettings              = new DepartmentCallEmail();
                                    emailSettings.FormatType   = (int)CallEmailTypes.Generic;
                                    emailSettings.DepartmentId = departmentId.Value;
                                    emailSettings.Department   = _departmentsService.GetDepartmentById(departmentId.Value, false);
                                }
                                else if (emailSettings.Department == null)
                                {
                                    emailSettings.Department = _departmentsService.GetDepartmentById(departmentId.Value);
                                }

                                var activeCalls     = _callsService.GetLatest10ActiveCallsByDepartment(emailSettings.Department.DepartmentId);
                                var units           = _unitsService.GetUnitsForDepartment(emailSettings.Department.DepartmentId);
                                var priorities      = _callsService.GetActiveCallPrioritesForDepartment(emailSettings.Department.DepartmentId);
                                int defaultPriority = (int)CallPriority.High;

                                if (priorities != null && priorities.Any())
                                {
                                    var defaultPrio = priorities.FirstOrDefault(x => x.IsDefault && x.IsDeleted == false);

                                    if (defaultPrio != null)
                                    {
                                        defaultPriority = defaultPrio.DepartmentCallPriorityId;
                                    }
                                }

                                var call = _callsService.GenerateCallFromEmail(emailSettings.FormatType, callEmail,
                                                                               emailSettings.Department.ManagingUserId,
                                                                               departmentUsers, emailSettings.Department, activeCalls, units, defaultPriority);

                                if (call != null)
                                {
                                    call.DepartmentId = departmentId.Value;

                                    var savedCall = _callsService.SaveCall(call);

                                    var cqi = new CallQueueItem();
                                    cqi.Call                 = savedCall;
                                    cqi.Profiles             = _userProfileService.GetAllProfilesForDepartment(call.DepartmentId).Select(x => x.Value).ToList();
                                    cqi.DepartmentTextNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(cqi.Call.DepartmentId);

                                    _queueService.EnqueueCallBroadcast(cqi);

                                    return(new HttpResponseMessage(HttpStatusCode.Created));
                                }
                            }
                            catch (Exception ex)
                            {
                                Logging.LogException(ex);
                                return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
                            }
                        }
                        #endregion Dispatch
                    }
                    else if (type == 2)                     // Email List
                    {
                        #region Distribution Email
                        var list = _distributionListsService.GetDistributionListByAddress(emailAddress);

                        if (list != null)
                        {
                            if (String.IsNullOrWhiteSpace(bounceEmail))
                            {
                                try
                                {
                                    List <Model.File> files = new List <Model.File>();

                                    try
                                    {
                                        if (message.Attachments != null && message.Attachments.Any())
                                        {
                                            foreach (var attachment in message.Attachments)
                                            {
                                                if (Convert.ToInt32(attachment.ContentLength) > 0)
                                                {
                                                    Model.File file = new Model.File();

                                                    byte[] filebytes = Convert.FromBase64String(attachment.Content);

                                                    file.Data         = filebytes;
                                                    file.FileName     = attachment.Name;
                                                    file.DepartmentId = list.DepartmentId;
                                                    file.ContentId    = attachment.ContentID;
                                                    file.FileType     = attachment.ContentType;
                                                    file.Timestamp    = DateTime.UtcNow;

                                                    files.Add(_fileService.SaveFile(file));
                                                }
                                            }
                                        }
                                    }
                                    catch { }

                                    var dlqi = new DistributionListQueueItem();
                                    dlqi.List  = list;
                                    dlqi.Users = _departmentsService.GetAllUsersForDepartment(list.DepartmentId);

                                    if (files != null && files.Any())
                                    {
                                        dlqi.FileIds = new List <int>();
                                        dlqi.FileIds.AddRange(files.Select(x => x.FileId).ToList());
                                    }

                                    dlqi.Message             = new InboundMessage();
                                    dlqi.Message.Attachments = new List <InboundMessageAttachment>();

                                    if (message.FromFull != null && !String.IsNullOrWhiteSpace(message.FromFull.Email) && !String.IsNullOrWhiteSpace(message.FromFull.Name))
                                    {
                                        dlqi.Message.FromEmail = message.FromFull.Email.Trim();
                                        dlqi.Message.FromName  = message.FromFull.Name.Trim();
                                    }

                                    dlqi.Message.Subject   = message.Subject;
                                    dlqi.Message.HtmlBody  = message.HtmlBody;
                                    dlqi.Message.TextBody  = message.TextBody;
                                    dlqi.Message.MessageID = message.MessageID;

                                    _queueService.EnqueueDistributionListBroadcast(dlqi);
                                }
                                catch (Exception ex)
                                {
                                    Logging.LogException(ex);
                                    return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
                                }
                            }
                            else
                            {
                                return(new HttpResponseMessage(HttpStatusCode.Created));
                            }
                        }

                        return(new HttpResponseMessage(HttpStatusCode.Created));

                        #endregion Distribution Email
                    }
                    if (type == 3)                      // Group Dispatch
                    {
                        #region Group Dispatch Email
                        var departmentGroup = _departmentGroupsService.GetGroupByDispatchEmailCode(emailAddress);

                        if (departmentGroup != null)
                        {
                            try
                            {
                                var emailSettings = _departmentsService.GetDepartmentEmailSettings(departmentGroup.DepartmentId);
                                //var departmentGroupUsers = _departmentGroupsService.GetAllMembersForGroup(departmentGroup.DepartmentGroupId);
                                var departmentGroupUsers = _departmentGroupsService.GetAllMembersForGroupAndChildGroups(departmentGroup);

                                var callEmail = new CallEmail();
                                callEmail.Subject = message.Subject;

                                if (!String.IsNullOrWhiteSpace(message.HtmlBody))
                                {
                                    callEmail.Body = HttpUtility.HtmlDecode(message.HtmlBody);
                                }
                                else
                                {
                                    callEmail.Body = message.TextBody;
                                }

                                foreach (var attachment in message.Attachments)
                                {
                                    try
                                    {
                                        if (Convert.ToInt32(attachment.ContentLength) > 0)
                                        {
                                            if (attachment.Name.Contains(".mp3") || attachment.Name.Contains(".amr"))
                                            {
                                                byte[] filebytes = Convert.FromBase64String(attachment.Content);

                                                callEmail.DispatchAudioFileName = attachment.Name;
                                                callEmail.DispatchAudio         = filebytes;
                                            }
                                        }
                                    }
                                    catch { }
                                }

                                if (emailSettings == null)
                                {
                                    emailSettings              = new DepartmentCallEmail();
                                    emailSettings.FormatType   = (int)CallEmailTypes.Generic;
                                    emailSettings.DepartmentId = departmentGroup.DepartmentId;

                                    if (departmentGroup.Department != null)
                                    {
                                        emailSettings.Department = departmentGroup.Department;
                                    }
                                    else
                                    {
                                        emailSettings.Department = _departmentsService.GetDepartmentById(departmentGroup.DepartmentId);
                                    }
                                }

                                var activeCalls = _callsService.GetActiveCallsByDepartment(emailSettings.Department.DepartmentId);
                                var units       = _unitsService.GetAllUnitsForGroup(departmentGroup.DepartmentGroupId);

                                var priorities      = _callsService.GetActiveCallPrioritesForDepartment(emailSettings.Department.DepartmentId);
                                int defaultPriority = (int)CallPriority.High;

                                if (priorities != null && priorities.Any())
                                {
                                    var defaultPrio = priorities.FirstOrDefault(x => x.IsDefault && x.IsDeleted == false);

                                    if (defaultPrio != null)
                                    {
                                        defaultPriority = defaultPrio.DepartmentCallPriorityId;
                                    }
                                }

                                var call = _callsService.GenerateCallFromEmail(emailSettings.FormatType, callEmail,
                                                                               emailSettings.Department.ManagingUserId,
                                                                               departmentGroupUsers.Select(x => x.User).ToList(), emailSettings.Department, activeCalls, units, defaultPriority);

                                if (call != null)
                                {
                                    call.DepartmentId = departmentGroup.DepartmentId;

                                    var savedCall = _callsService.SaveCall(call);

                                    var cqi = new CallQueueItem();
                                    cqi.Call                 = savedCall;
                                    cqi.Profiles             = _userProfileService.GetSelectedUserProfiles(departmentGroupUsers.Select(x => x.UserId).ToList());
                                    cqi.DepartmentTextNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(cqi.Call.DepartmentId);

                                    _queueService.EnqueueCallBroadcast(cqi);

                                    return(new HttpResponseMessage(HttpStatusCode.Created));
                                }
                            }
                            catch (Exception ex)
                            {
                                Logging.LogException(ex);
                                return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
                            }
                        }
                        #endregion Group Dispatch Email
                    }
                    if (type == 4)                      // Group Message
                    {
                        #region Group Message
                        var departmentGroup = _departmentGroupsService.GetGroupByMessageEmailCode(emailAddress);

                        if (departmentGroup != null)
                        {
                            try
                            {
                                //var departmentGroupUsers = _departmentGroupsService.GetAllMembersForGroup(departmentGroup.DepartmentGroupId);
                                var departmentGroupUsers = _departmentGroupsService.GetAllMembersForGroupAndChildGroups(departmentGroup);

                                var newMessage = new Message();
                                newMessage.SentOn          = DateTime.UtcNow;
                                newMessage.SendingUserId   = departmentGroup.Department.ManagingUserId;
                                newMessage.IsBroadcast     = true;
                                newMessage.Subject         = message.Subject;
                                newMessage.SystemGenerated = true;

                                if (!String.IsNullOrWhiteSpace(message.HtmlBody))
                                {
                                    newMessage.Body = HttpUtility.HtmlDecode(message.HtmlBody);
                                }
                                else
                                {
                                    newMessage.Body = message.TextBody;
                                }

                                foreach (var member in departmentGroupUsers)
                                {
                                    if (newMessage.GetRecipients().All(x => x != member.UserId))
                                    {
                                        newMessage.AddRecipient(member.UserId);
                                    }
                                }

                                var savedMessage = _messageService.SaveMessage(newMessage);
                                _messageService.SendMessage(savedMessage, "", departmentGroup.DepartmentId, false);

                                return(new HttpResponseMessage(HttpStatusCode.Created));
                            }
                            catch (Exception ex)
                            {
                                Logging.LogException(ex);
                                return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
                            }
                        }

                        #endregion Group Message
                    }

                    return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
                }
                catch (Exception ex)
                {
                    Framework.Logging.LogException(ex);
                    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                    {
                        Content = new StringContent(ex.ToString())
                    });
                }
            }
            else
            {
                // If our message was null, we throw an exception
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    Content = new StringContent("Error parsing Inbound Message, message is null.")
                });
            }
        }
        public Tuple <bool, string> Process(CallEmailQueueItem item)
        {
            bool   success = true;
            string result  = "";

            _callEmailProvider = Bootstrapper.GetKernel().Resolve <ICallEmailProvider>();

            if (!String.IsNullOrWhiteSpace(item?.EmailSettings?.Hostname))
            {
                CallEmailsResult emailResult = _callEmailProvider.GetAllCallEmailsFromServer(item.EmailSettings);

                if (emailResult?.Emails != null && emailResult.Emails.Count > 0)
                {
                    var calls = new List <Call>();

                    _callsService              = Bootstrapper.GetKernel().Resolve <ICallsService>();
                    _queueService              = Bootstrapper.GetKernel().Resolve <IQueueService>();
                    _departmentsService        = Bootstrapper.GetKernel().Resolve <IDepartmentsService>();
                    _userProfileService        = Bootstrapper.GetKernel().Resolve <IUserProfileService>();
                    _departmentSettingsService = Bootstrapper.GetKernel().Resolve <IDepartmentSettingsService>();
                    _unitsService              = Bootstrapper.GetKernel().Resolve <IUnitsService>();

                    // Ran into an issue where the department users didn't come back. We can't put the email back in the POP
                    // email box so just added some simple retry logic here.
                    List <IdentityUser> departmentUsers = _departmentsService.GetAllUsersForDepartment(item.EmailSettings.DepartmentId, true);
                    var profiles = _userProfileService.GetAllProfilesForDepartment(item.EmailSettings.DepartmentId);

                    int retry = 0;
                    while (retry < 3 && departmentUsers == null)
                    {
                        Thread.Sleep(150);
                        departmentUsers = _departmentsService.GetAllUsersForDepartment(item.EmailSettings.DepartmentId, true);
                        retry++;
                    }

                    foreach (var email in emailResult.Emails)
                    {
                        var activeCalls = _callsService.GetActiveCallsByDepartment(item.EmailSettings.Department.DepartmentId);
                        var units       = _unitsService.GetUnitsForDepartment(item.EmailSettings.Department.DepartmentId);

                        var priorities      = _callsService.GetActiveCallPrioritesForDepartment(item.EmailSettings.Department.DepartmentId);
                        int defaultPriority = (int)CallPriority.High;

                        if (priorities != null && priorities.Any())
                        {
                            var defaultPrio = priorities.FirstOrDefault(x => x.IsDefault && x.IsDeleted == false);

                            if (defaultPrio != null)
                            {
                                defaultPriority = defaultPrio.DepartmentCallPriorityId;
                            }
                        }

                        var call = _callsService.GenerateCallFromEmail(item.EmailSettings.FormatType, email,
                                                                       item.EmailSettings.Department.ManagingUserId, departmentUsers, item.EmailSettings.Department, activeCalls, units, defaultPriority);

                        if (call != null)
                        {
                            call.DepartmentId = item.EmailSettings.DepartmentId;

                            if (!calls.Any(x => x.Name == call.Name && x.NatureOfCall == call.NatureOfCall))
                            {
                                calls.Add(call);
                            }
                        }
                    }

                    if (calls.Any())
                    {
                        var departmentTextNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(item.EmailSettings.DepartmentId);
                        foreach (var call in calls)
                        {
                            try
                            {
                                // Adding this in here to try and fix the error below with ObjectContext issues.
                                var newCall = CreateNewCallFromCall(call);

                                if (newCall.Dispatches != null && newCall.Dispatches.Any())
                                {
                                    // We've been having this error here:
                                    //      The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.
                                    // So I'm wrapping this in a try catch to prevent all calls form being dropped.
                                    var savedCall = _callsService.SaveCall(newCall);
                                    var cqi       = new CallQueueItem();
                                    cqi.Call = savedCall;

                                    cqi.Profiles             = profiles.Values.ToList();
                                    cqi.DepartmentTextNumber = departmentTextNumber;

                                    _queueService.EnqueueCallBroadcast(cqi);
                                }
                            }
                            catch (Exception ex)
                            {
                                result = ex.ToString();
                                Logging.LogException(ex);
                            }
                        }
                    }

                    _departmentsService.SaveDepartmentEmailSettings(emailResult.EmailSettings);

                    _callsService              = null;
                    _queueService              = null;
                    _departmentsService        = null;
                    _callEmailProvider         = null;
                    _userProfileService        = null;
                    _departmentSettingsService = null;
                }
            }

            return(new Tuple <bool, string>(success, result));
        }
Example #19
0
        public List <PersonnelStatusResult> GetPersonnelStatusesForLink(int linkId)
        {
            var link = _departmentLinksService.GetLinkById(linkId);

            if (link.DepartmentId != DepartmentId && link.LinkedDepartmentId != DepartmentId)
            {
                return(new List <PersonnelStatusResult>());
            }

            var results = new List <PersonnelStatusResult>();

            var        actionLogs = _actionLogsService.GetActionLogsForDepartment(link.DepartmentId);
            var        userStates = _userStateService.GetLatestStatesForDepartment(link.DepartmentId);
            var        users      = _departmentsService.GetAllUsersForDepartment(link.DepartmentId);
            Department department = _departmentsService.GetDepartmentById(link.DepartmentId, false);

            foreach (var u in users)
            {
                var log = (from l in actionLogs
                           where l.UserId == u.UserId
                           select l).FirstOrDefault();

                var state = (from l in userStates
                             where l.UserId == u.UserId
                             select l).FirstOrDefault();

                var s = new PersonnelStatusResult();
                s.Uid = u.UserId.ToString();

                if (log != null)
                {
                    s.Atp = log.ActionTypeId;
                    s.Atm = log.Timestamp.TimeConverter(department);

                    if (log.DestinationId.HasValue)
                    {
                        if (log.ActionTypeId == (int)ActionTypes.RespondingToScene)
                        {
                            s.Did = log.DestinationId.Value.ToString();
                        }
                        else if (log.ActionTypeId == (int)ActionTypes.RespondingToStation)
                        {
                            s.Did = log.DestinationId.Value.ToString();
                        }
                        else if (log.ActionTypeId == (int)ActionTypes.AvailableStation)
                        {
                            s.Did = log.DestinationId.Value.ToString();
                        }
                    }
                }
                else
                {
                    s.Atp = (int)ActionTypes.StandingBy;
                    s.Atm = DateTime.UtcNow.TimeConverter(department);
                }

                if (state != null)
                {
                    s.Ste = state.State;
                    s.Stm = state.Timestamp.TimeConverter(department);
                }
                else
                {
                    s.Ste = (int)UserStateTypes.Available;
                    s.Stm = DateTime.UtcNow.TimeConverter(department);
                }
                results.Add(s);
            }


            return(results);
        }
Example #20
0
        public List <PersonnelViewModel> GetPersonnelStatuses()
        {
            var department         = _departmentsService.GetDepartmentById(DepartmentId, false);
            var stations           = _departmentGroupsService.GetAllStationGroupsForDepartment(DepartmentId);
            var calls              = _callsService.GetActiveCallsByDepartment(DepartmentId);
            var allUsers           = _departmentsService.GetAllUsersForDepartment(DepartmentId);
            var hideUnavailable    = _departmentSettingsService.GetBigBoardHideUnavailableDepartment(DepartmentId);
            var lastUserActionlogs = _actionLogsService.GetActionLogsForDepartment(DepartmentId);
            //var departmentGroups = _departmentGroupsService.GetAllGroupsForDepartment(DepartmentId);

            var lastUserStates = _userStateService.GetLatestStatesForDepartment(DepartmentId);
            var personnelNames = _departmentsService.GetAllPersonnelNamesForDepartment(DepartmentId);

            var names = new Dictionary <string, string>();

            var userStates = new List <UserState>();

            foreach (var u in allUsers)
            {
                var state = lastUserStates.FirstOrDefault(x => x.UserId == u.UserId);

                if (state != null)
                {
                    userStates.Add(state);
                }
                else
                {
                    userStates.Add(_userStateService.GetLastUserStateByUserId(u.UserId));
                }

                var name = personnelNames.FirstOrDefault(x => x.UserId == u.UserId);
                if (name != null)
                {
                    names.Add(u.UserId, name.Name);
                }
            }

            var personnelViewModels = new List <PersonnelViewModel>();

            var sortedUngroupedUsers = from u in allUsers
                                       // let mu = Membership.GetUser(u.UserId)
                                       let userGroup = _departmentGroupsService.GetGroupForUser(u.UserId, DepartmentId)
                                                       let groupName                         = userGroup == null ? "" : userGroup.Name
                                                                                   let roles = _personnelRolesService.GetRolesForUser(u.UserId, DepartmentId)
                                                                                               //let name = (ProfileBase.Create(mu.UserName, true)).GetPropertyValue("Name").ToString()
                                                                                               let name = names[u.UserId]
                                                                                                          let weight = lastUserActionlogs.Where(x => x.UserId == u.UserId).FirstOrDefault().GetWeightForAction()
                                                                                                                       orderby groupName, weight, name ascending
                select new
            {
                Name  = name,
                User  = u,
                Group = userGroup,
                Roles = roles
            };

            foreach (var u in sortedUngroupedUsers)
            {
                //var mu = Membership.GetUser(u.User.UserId);
                var al = lastUserActionlogs.Where(x => x.UserId == u.User.UserId).FirstOrDefault();
                var us = userStates.Where(x => x.UserId == u.User.UserId).FirstOrDefault();

                // if setting is such, ignore unavailable users.
                if (hideUnavailable.HasValue && hideUnavailable.Value && us.State != (int)UserStateTypes.Unavailable)
                {
                    continue;
                }

                string callNumber = "";
                if (al != null && al.ActionTypeId == (int)ActionTypes.RespondingToScene ||
                    (al != null && al.DestinationType.HasValue && al.DestinationType.Value == 2))
                {
                    if (al.DestinationId.HasValue)
                    {
                        var call = calls.FirstOrDefault(x => x.CallId == al.DestinationId.Value);

                        if (call != null)
                        {
                            callNumber = call.Number;
                        }
                    }
                }
                var respondingToDepartment =
                    stations.Where(s => al != null && s.DepartmentGroupId == al.DestinationId).FirstOrDefault();
                var personnelViewModel = PersonnelViewModel.Create(u.Name, al, us, department, respondingToDepartment, u.Group,
                                                                   u.Roles, callNumber);

                personnelViewModels.Add(personnelViewModel);
            }

            return(personnelViewModels);
        }
Example #21
0
        public NewCallPayloadResult GetNewCallData()
        {
            var results = new NewCallPayloadResult();

            results.Personnel    = new List <PersonnelInfoResult>();
            results.Groups       = new List <GroupInfoResult>();
            results.Units        = new List <UnitInfoResult>();
            results.Roles        = new List <RoleInfoResult>();
            results.Statuses     = new List <CustomStatusesResult>();
            results.UnitStatuses = new List <UnitStatusCoreResult>();
            results.UnitRoles    = new List <UnitRoleResult>();
            results.Priorities   = new List <CallPriorityResult>();
            results.CallTypes    = new List <CallTypeResult>();

            var department = _departmentsService.GetDepartmentById(DepartmentId, false);
            var users      = _departmentsService.GetAllUsersForDepartment(DepartmentId);
            var groups     = _departmentGroupsService.GetAllDepartmentGroupsForDepartment(DepartmentId);
            var rolesForUsersInDepartment = _personnelRolesService.GetAllRolesForUsersInDepartment(DepartmentId);
            var allRoles      = _personnelRolesService.GetRolesForDepartment(DepartmentId);
            var allProfiles   = _userProfileService.GetAllProfilesForDepartment(DepartmentId);
            var allGroups     = _departmentGroupsService.GetAllGroupsForDepartment(DepartmentId);
            var units         = _unitsService.GetUnitsForDepartment(DepartmentId);
            var unitTypes     = _unitsService.GetUnitTypesForDepartment(DepartmentId);
            var callPriorites = _callsService.GetCallPrioritesForDepartment(DepartmentId);
            var callTypes     = _callsService.GetCallTypesForDepartment(DepartmentId);


            foreach (var user in users)
            {
                //var profile = _userProfileService.GetProfileByUserId(user.UserId);
                //var group = _departmentGroupsService.GetGroupForUser(user.UserId);

                UserProfile profile = null;
                if (allProfiles.ContainsKey(user.UserId))
                {
                    profile = allProfiles[user.UserId];
                }

                DepartmentGroup group = null;
                if (groups.ContainsKey(user.UserId))
                {
                    group = groups[user.UserId];
                }

                //var roles = _personnelRolesService.GetRolesForUser(user.UserId);

                List <PersonnelRole> roles = null;
                if (rolesForUsersInDepartment.ContainsKey(user.UserId))
                {
                    roles = rolesForUsersInDepartment[user.UserId];
                }

                var result = new PersonnelInfoResult();

                if (profile != null)
                {
                    result.Fnm = profile.FirstName;
                    result.Lnm = profile.LastName;
                    result.Id  = profile.IdentificationNumber;
                    result.Mnu = profile.MobileNumber;
                }
                else
                {
                    result.Fnm = "Unknown";
                    result.Lnm = "Check Profile";
                    result.Id  = "";
                    result.Mnu = "";
                }

                result.Eml = user.Email;
                result.Did = DepartmentId;
                result.Uid = user.UserId.ToString();

                if (group != null)
                {
                    result.Gid = group.DepartmentGroupId;
                    result.Gnm = group.Name;
                }

                result.Roles = new List <string>();
                if (roles != null && roles.Count > 0)
                {
                    foreach (var role in roles)
                    {
                        if (role != null)
                        {
                            result.Roles.Add(role.Name);
                        }
                    }
                }

                results.Personnel.Add(result);
            }

            foreach (var group in allGroups)
            {
                var groupInfo = new GroupInfoResult();
                groupInfo.Gid = group.DepartmentGroupId;
                groupInfo.Nme = group.Name;

                if (group.Type.HasValue)
                {
                    groupInfo.Typ = group.Type.Value;
                }

                if (group.Address != null)
                {
                    groupInfo.Add = group.Address.FormatAddress();
                }

                results.Groups.Add(groupInfo);
            }

            foreach (var unit in units)
            {
                var unitResult = new UnitInfoResult();
                unitResult.Uid = unit.UnitId;
                unitResult.Did = DepartmentId;
                unitResult.Nme = unit.Name;
                unitResult.Typ = unit.Type;

                if (!string.IsNullOrWhiteSpace(unit.Type))
                {
                    var unitType = unitTypes.FirstOrDefault(x => x.Type == unit.Type);

                    if (unitType != null)
                    {
                        unitResult.Cid = unitType.CustomStatesId.GetValueOrDefault();
                    }
                }
                else
                {
                    unitResult.Cid = 0;
                }

                if (unit.StationGroup != null)
                {
                    unitResult.Sid = unit.StationGroup.DepartmentGroupId;
                    unitResult.Snm = unit.StationGroup.Name;
                }

                results.Units.Add(unitResult);

                // Add unit roles for this unit
                var roles = _unitsService.GetRolesForUnit(unit.UnitId);
                foreach (var role in roles)
                {
                    var roleResult = new UnitRoleResult();
                    roleResult.Name       = role.Name;
                    roleResult.UnitId     = role.UnitId;
                    roleResult.UnitRoleId = role.UnitRoleId;

                    results.UnitRoles.Add(roleResult);
                }
            }

            var unitStatuses = _unitsService.GetAllLatestStatusForUnitsByDepartmentId(DepartmentId);

            foreach (var us in unitStatuses)
            {
                var unitStatus = new UnitStatusCoreResult();
                unitStatus.UnitId      = us.UnitId;
                unitStatus.StateType   = (UnitStateTypes)us.State;
                unitStatus.StateTypeId = us.State;
                unitStatus.Type        = us.Unit.Type;
                unitStatus.Timestamp   = us.Timestamp.TimeConverter(department);
                unitStatus.Name        = us.Unit.Name;
                unitStatus.Note        = us.Note;

                if (us.DestinationId.HasValue)
                {
                    unitStatus.DestinationId = us.DestinationId.Value;
                }

                if (us.LocalTimestamp.HasValue)
                {
                    unitStatus.LocalTimestamp = us.LocalTimestamp.Value;
                }

                if (us.Latitude.HasValue)
                {
                    unitStatus.Latitude = us.Latitude.Value;
                }

                if (us.Longitude.HasValue)
                {
                    unitStatus.Longitude = us.Longitude.Value;
                }

                results.UnitStatuses.Add(unitStatus);
            }

            foreach (var role in allRoles)
            {
                var roleResult = new RoleInfoResult();
                roleResult.Rid = role.PersonnelRoleId;
                roleResult.Nme = role.Name;

                results.Roles.Add(roleResult);
            }

            var customStates = _customStateService.GetAllActiveCustomStatesForDepartment(DepartmentId);

            foreach (var customState in customStates)
            {
                if (customState.IsDeleted)
                {
                    continue;
                }

                foreach (var stateDetail in customState.GetActiveDetails())
                {
                    if (stateDetail.IsDeleted)
                    {
                        continue;
                    }

                    var customStateResult = new CustomStatusesResult();
                    customStateResult.Id      = stateDetail.CustomStateDetailId;
                    customStateResult.Type    = customState.Type;
                    customStateResult.StateId = stateDetail.CustomStateId;
                    customStateResult.Text    = stateDetail.ButtonText;
                    customStateResult.BColor  = stateDetail.ButtonColor;
                    customStateResult.Color   = stateDetail.TextColor;
                    customStateResult.Gps     = stateDetail.GpsRequired;
                    customStateResult.Note    = stateDetail.NoteType;
                    customStateResult.Detail  = stateDetail.DetailType;

                    results.Statuses.Add(customStateResult);
                }
            }

            foreach (var priority in callPriorites)
            {
                var priorityResult = new CallPriorityResult();
                priorityResult.Id           = priority.DepartmentCallPriorityId;
                priorityResult.DepartmentId = priority.DepartmentId;
                priorityResult.Name         = priority.Name;
                priorityResult.Color        = priority.Color;
                priorityResult.Sort         = priority.Sort;
                priorityResult.IsDeleted    = priority.IsDeleted;
                priorityResult.IsDefault    = priority.IsDefault;

                results.Priorities.Add(priorityResult);
            }

            if (callTypes != null && callTypes.Any())
            {
                foreach (var callType in callTypes)
                {
                    var type = new CallTypeResult();
                    type.Id   = callType.CallTypeId;
                    type.Name = callType.Type;

                    results.CallTypes.Add(type);
                }
            }


            return(results);
        }
Example #22
0
        //[AcceptVerbs("POST")]
        public HttpResponseMessage Process()        //([FromBody]TextMessage textMessage2)
        {
            var queryValues = Request.RequestUri.ParseQueryString();

            var textMessage = new TextMessage();

            textMessage.Type        = queryValues["type"];
            textMessage.To          = queryValues["to"];
            textMessage.Msisdn      = queryValues["msisdn"];
            textMessage.NetworkCode = queryValues["network-code"];
            textMessage.MessageId   = queryValues["messageId"];
            textMessage.Timestamp   = queryValues["message-timestamp"];
            textMessage.Concat      = queryValues["concat"];
            textMessage.ConcatRef   = queryValues["concat-ref"];
            textMessage.ConcatTotal = queryValues["concat-total"];
            textMessage.ConcatPart  = queryValues["concat-part"];
            textMessage.Data        = queryValues["data"];
            textMessage.Udh         = queryValues["udh"];
            textMessage.Text        = queryValues["text"];

            var messageEvent = new InboundMessageEvent();

            messageEvent.MessageType = (int)InboundMessageTypes.TextMessage;
            messageEvent.RecievedOn  = DateTime.UtcNow;
            messageEvent.Type        = typeof(InboundMessageEvent).FullName;
            messageEvent.Data        = JsonConvert.SerializeObject(textMessage);
            messageEvent.Processed   = false;
            messageEvent.CustomerId  = "";

            try
            {
                var departmentId = _departmentSettingsService.GetDepartmentIdByTextToCallNumber(textMessage.To);

                if (departmentId.HasValue)
                {
                    var department         = _departmentsService.GetDepartmentById(departmentId.Value);
                    var textToCallEnabled  = _departmentSettingsService.GetDepartmentIsTextCallImportEnabled(departmentId.Value);
                    var textCommandEnabled = _departmentSettingsService.GetDepartmentIsTextCommandEnabled(departmentId.Value);
                    var dispatchNumbers    = _departmentSettingsService.GetTextToCallSourceNumbersForDepartment(departmentId.Value);
                    var authroized         = _limitsService.CanDepartmentProvisionNumber(departmentId.Value);

                    messageEvent.CustomerId = departmentId.Value.ToString();

                    if (authroized)
                    {
                        bool isDispatchSource = false;

                        if (!String.IsNullOrWhiteSpace(dispatchNumbers))
                        {
                            isDispatchSource = _numbersService.DoesNumberMatchAnyPattern(dispatchNumbers.Split(Char.Parse(",")).ToList(), textMessage.Msisdn);
                        }

                        // If we don't have dispatchNumbers and Text Command isn't
                        // enabled it's a dispatch text
                        if (!isDispatchSource && !textCommandEnabled)
                        {
                            isDispatchSource = true;
                        }

                        if (isDispatchSource && textToCallEnabled)
                        {
                            var c = new Call();
                            c.Notes            = textMessage.Text;
                            c.NatureOfCall     = textMessage.Text;
                            c.LoggedOn         = DateTime.UtcNow;
                            c.Name             = string.Format("TTC {0}", c.LoggedOn.TimeConverter(department).ToString("g"));
                            c.Priority         = (int)CallPriority.High;
                            c.ReportingUserId  = department.ManagingUserId;
                            c.Dispatches       = new Collection <CallDispatch>();
                            c.CallSource       = (int)CallSources.EmailImport;
                            c.SourceIdentifier = textMessage.MessageId;
                            c.DepartmentId     = departmentId.Value;

                            var users = _departmentsService.GetAllUsersForDepartment(departmentId.Value, true);
                            foreach (var u in users)
                            {
                                var cd = new CallDispatch();
                                cd.UserId = u.UserId;

                                c.Dispatches.Add(cd);
                            }

                            var savedCall = _callsService.SaveCall(c);

                            var cqi = new CallQueueItem();
                            cqi.Call                 = savedCall;
                            cqi.Profiles             = _userProfileService.GetSelectedUserProfiles(users.Select(x => x.UserId).ToList());
                            cqi.DepartmentTextNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(cqi.Call.DepartmentId);

                            _queueService.EnqueueCallBroadcast(cqi);

                            messageEvent.Processed = true;
                        }

                        if (!isDispatchSource && textCommandEnabled)
                        {
                            var profile = _userProfileService.FindProfileByMobileNumber(textMessage.Msisdn);

                            if (profile != null)
                            {
                                var payload = _textCommandService.DetermineType(textMessage.Text);

                                switch (payload.Type)
                                {
                                case TextCommandTypes.None:
                                    break;

                                case TextCommandTypes.Help:
                                    messageEvent.Processed = true;

                                    var help = new StringBuilder();
                                    help.Append("Resgrid Text Commands" + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);
                                    help.Append("These are the commands you can text to alter your status and staffing. Text help for help." + Environment.NewLine);
                                    help.Append("Status Commands" + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);
                                    help.Append("responding or 1: Responding" + Environment.NewLine);
                                    help.Append("notresponding or 2: Not Responding" + Environment.NewLine);
                                    help.Append("onscene or 3: On Scene" + Environment.NewLine);
                                    help.Append("available or 4: Available" + Environment.NewLine);
                                    help.Append("Staffing Commands" + Environment.NewLine);
                                    help.Append("---------------------" + Environment.NewLine);
                                    help.Append("normal or s1: Available Staffing" + Environment.NewLine);
                                    help.Append("delayed or s2: Delayed Staffing" + Environment.NewLine);
                                    help.Append("unavailable or s3: Unavailable Staffing" + Environment.NewLine);
                                    help.Append("committed or s4: Committed Staffing" + Environment.NewLine);
                                    help.Append("onshift or s4: On Shift Staffing" + Environment.NewLine);

                                    _communicationService.SendTextMessage(profile.UserId, "Resgrid TCI Help", help.ToString(), department.DepartmentId, textMessage.To, profile);
                                    break;

                                case TextCommandTypes.Action:
                                    messageEvent.Processed = true;
                                    _actionLogsService.SetUserAction(profile.UserId, department.DepartmentId, (int)payload.GetActionType());
                                    _communicationService.SendTextMessage(profile.UserId, "Resgrid TCI Status", string.Format("Resgrid received your text command. Status changed to: {0}", payload.GetActionType()), department.DepartmentId, textMessage.To, profile);
                                    break;

                                case TextCommandTypes.Staffing:
                                    messageEvent.Processed = true;
                                    _userStateService.CreateUserState(profile.UserId, department.DepartmentId, (int)payload.GetStaffingType());
                                    _communicationService.SendTextMessage(profile.UserId, "Resgrid TCI Staffing", string.Format("Resgrid received your text command. Staffing level changed to: {0}", payload.GetStaffingType()), department.DepartmentId, textMessage.To, profile);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Framework.Logging.LogException(ex);
            }
            finally
            {
                _numbersService.SaveInboundMessageEvent(messageEvent);
            }

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