Exemple #1
0
        public async Task <IActionResult> CreateIncidenceRemote([FromForm] SaveIncidenceResource incidenceResource)
        {
            try
            {
                var loggedInUserId = _userRepo.GetLoggedInUserId();
                var user           = await _userRepo.GetUser(loggedInUserId);

                bool triggerNotification     = false;
                bool triggerDeptNotification = false;
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                //business rule validation
                var incidenceCode = !string.IsNullOrEmpty(incidenceResource.Description) ? incidenceResource.Description + "/"
                                    + ((incidenceResource.ReportedIncidenceLatitude != null) ? incidenceResource.ReportedIncidenceLatitude : DateTime.Now.Minute) + "/"
                                    + ((incidenceResource.ReportedIncidenceLongitude != null) ? incidenceResource.ReportedIncidenceLongitude : DateTime.Now.Minute)
                    : incidenceResource.ReportedIncidenceLatitude + "/" + incidenceResource.ReportedIncidenceLongitude;
                if (repository.CheckIncidenceCode(incidenceCode))
                {
                    ModelState.AddModelError("Error", "The incidence with this Code already exists.");
                    return(BadRequest(ModelState));
                }

                var incidence = mapper.Map <SaveIncidenceResource, Incidence>(incidenceResource);
                incidence.Deleted         = false;
                incidence.CreatedByUserId = loggedInUserId;
                // incidence.Protected = true; in other to allow pseudo-deletion which only hides the record
                incidence.DateCreated       = DateTime.UtcNow;
                incidence.IncidenceStatusId = GlobalFields.NewIncidenceStatus;
                incidence.Code = incidenceCode;
                //incidence.LastUpdate = DateTime.Now;

                if (user != null)
                {
                    var reporterFullName = string.IsNullOrEmpty(user.MiddleName) ? user.FirstName + " " + user.LastName
                        : user.FirstName + " " + user.MiddleName + " " + user.LastName;
                    incidence.ReporterName         = reporterFullName ?? "";
                    incidence.ReporterDepartmentId = user.DepartmentId;
                    incidence.ReporterEmail        = user.Email1;
                }

                // trigger alert when incidence status is open or re-opened provided as Assignee and Assigner were sent
                if (incidenceResource.AssigneeId != null && (incidenceResource.IncidenceStatusId == GlobalFields.OpenIncidenceStatus || incidenceResource.IncidenceStatusId == GlobalFields.ReOpenedIncidenceStatus))
                {
                    incidence.AssignerId = loggedInUserId;
                    triggerNotification  = true;
                }

                var incidenceTypeDepartment = new OrganizationDepartment();
                if (incidenceResource.IncidenceTypeId != null)
                {
                    incidenceTypeDepartment = await _incidenceTypeDeptRepo.GetDepartmentFromIncidenceType(incidenceResource.IncidenceTypeId);
                }

                incidence.AssignedDepartmentId   = incidenceTypeDepartment.Id;
                incidence.OrganizationId         = incidenceTypeDepartment.OrganizationId;
                incidence.AssignedOrganizationId = incidenceTypeDepartment.OrganizationId;

                incidence.IncidenceStatusId = incidenceResource.IncidenceStatusId ?? GlobalFields.NewIncidenceStatus;
                if (incidence.IncidenceStatusId == GlobalFields.NewIncidenceStatus && incidenceResource.IncidenceTypeId != null)
                {
                    incidence.AssignedDepartmentId   = incidenceTypeDepartment.Id;
                    incidence.OrganizationId         = incidenceTypeDepartment.OrganizationId;
                    incidence.AssignedOrganizationId = incidenceTypeDepartment.OrganizationId;
                    triggerDeptNotification          = true;
                }

                repository.Add(incidence);
                await unitOfWork.CompleteAsync();

                incidence = await repository.GetIncidence(incidence.Id);

                if (incidence == null)
                {
                    return(NotFound());
                }

                if (incidenceResource.file != null && incidenceResource.file.Length != 0)
                {
                    var deptSettings = await _settingsRepo.GetDepartmentSettings(incidenceTypeDepartment.Id);

                    var orgSettings = await _settingsRepo.GetOrganizationSettings(incidenceTypeDepartment.OrganizationId);

                    var generalSettings = await _settingsRepo.GetGeneralSettings();

                    if (!_settingsRepo.ValidateFileType(deptSettings, orgSettings, generalSettings, incidenceResource.file))
                    {
                        return(BadRequest("Invalid file type"));
                    }

                    if (!_settingsRepo.ValidateFileSize(deptSettings, orgSettings, generalSettings, incidenceResource.file))
                    {
                        return(BadRequest("Maximun file size exceeded"));
                    }

                    var isFilePhotoNotVideo = _settingsRepo.IsImageFileNotVideo(deptSettings, orgSettings, generalSettings, incidenceResource.file);

                    //Dont use webrootpath i.e wwwroot as it gets cleared after angular ng build
                    var uploadsFolderPath = Path.Combine(_host.WebRootPath, "uploads");
                    var photo             = await _photoService.UploadPhoto(incidence, incidenceResource.file, uploadsFolderPath, FileUploadChannels.incidencesReportedOnMobile, isFilePhotoNotVideo);

                    // return Ok(mapper.Map<Media, MediaResource>(photo));
                }

                //Next, fetch notification settings from the IncidenceType's-mapped department or the mapped department's organization if dept settings is empty. Dept receives notification here
                //IncidenceType's mapped department's settings is used for sending notification, otherwise if empty, use organization or system settings
                //await _notificationRepo.SendIncidenceNotification(incidenceResource, incidenceTypeDepartment.Id, null, null, incidenceTypeDepartment.OrganizationId);

                if (triggerDeptNotification)
                {
                    //pass the reporter details into incidenceResource as it only exists in incidence and it is needed in email notification
                    incidenceResource.ReporterName  = incidence.ReporterName;
                    incidenceResource.ReporterEmail = incidence.ReporterEmail;
                    incidence.ReporterDepartmentId  = incidence.ReporterDepartmentId;
                    await _notificationRepo.SendEmailNotificationToOrgDeptUsers(incidenceResource, incidenceTypeDepartment.Id, incidenceTypeDepartment.OrganizationId, incidence.ReporterDepartmentId); // use SendEmailNotificationToOrgDeptUsers method in notificationRepo
                }

                if (triggerNotification)
                {
                    await _notificationRepo.SendIncidenceNotification(incidenceResource, incidenceResource.AssignedDepartmentId, incidenceResource.AssignerId, incidenceResource.AssigneeId, incidenceResource.AssignedOrganizationId);
                }

                incidence = await repository.GetIncidence(incidence.Id);

                var result = mapper.Map <Incidence, IncidenceResource>(incidence);

                return(Ok(result));
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("Error", "An error occured while performing this operation.");
                return(BadRequest(ModelState));
            }

            //var result = mapper.Map<Incidence, IncidenceResource>(incidence);

            //return Ok(result);
        }
Exemple #2
0
        public async Task <IActionResult> PutIncidence([FromRoute] Guid id, [FromBody] SaveIncidenceResource incidenceResource)
        {
            try
            {
                bool triggerNotification = false;
                //input validation
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }
                var incidence = await repository.GetIncidence(id);

                if (incidence == null)
                {
                    return(NotFound());
                }

                incidenceResource.EditedByUserId         = _userRepo.GetLoggedInUserId();
                incidenceResource.DateCreated            = incidence.DateCreated;
                incidenceResource.CreatedByUserId        = incidence.CreatedByUserId;
                incidenceResource.Code                   = incidence.Code;
                incidenceResource.DateEdited             = DateTime.UtcNow;
                incidenceResource.AssignerId             = incidence.AssignerId;
                incidenceResource.AssignedOrganizationId = incidence.AssignedOrganizationId;
                incidenceResource.ResolutionDate         = incidence.ResolutionDate;

                incidenceResource.Description = incidence.Description;
                incidenceResource.ReportedIncidenceLatitude  = incidence.ReportedIncidenceLatitude ?? 0;
                incidenceResource.ReportedIncidenceLongitude = incidence.ReportedIncidenceLongitude ?? 0;
                incidenceResource.ReporterName  = incidence.ReporterName;
                incidenceResource.ReporterEmail = incidence.ReporterEmail;
                incidenceResource.ReporterFirstResponderAction = incidence.ReporterFirstResponderAction;
                incidenceResource.ReporterFeedbackRating       = incidence.ReporterFeedbackRating;
                incidenceResource.Protected = incidence.Protected;
                incidenceResource.Deleted   = incidence.Deleted;

                // trigger alert when incidence status is open or re-opened
                if (incidenceResource.IncidenceStatusId != incidence.IncidenceStatusId && (incidenceResource.IncidenceStatusId == GlobalFields.OpenIncidenceStatus || incidenceResource.IncidenceStatusId == GlobalFields.ReOpenedIncidenceStatus))
                {
                    incidenceResource.AssignerId = _userRepo.GetLoggedInUserId();
                    triggerNotification          = true;
                }
                else if (incidenceResource.IncidenceStatusId != incidence.IncidenceStatusId && incidenceResource.IncidenceStatusId == GlobalFields.ClosedIncidenceStatus)
                {
                    // set resolution date when incidence is closed
                    incidenceResource.ResolutionDate = DateTime.Now;
                    triggerNotification = true;
                }
                else if (incidenceResource.IncidenceStatusId != incidence.IncidenceStatusId && (incidenceResource.IncidenceStatusId == GlobalFields.ResolvedIncidenceStatus || incidenceResource.IncidenceStatusId == GlobalFields.UnderReviewIncidenceStatus))
                {
                    triggerNotification = true;
                }

                mapper.Map <SaveIncidenceResource, Incidence>(incidenceResource, incidence);

                await unitOfWork.CompleteAsync();

                //send email and sms to notify assignee upon incidence opening and assignment
                //IncidenceType's mapped department's settings is used for sending notification, otherwise if empty, use organization or system settings
                if (triggerNotification)
                {
                    await _notificationRepo.SendIncidenceNotification(incidenceResource, incidenceResource.AssignedDepartmentId, incidenceResource.AssignerId, incidenceResource.AssigneeId, incidenceResource.AssignedOrganizationId);
                }

                incidence = await repository.GetIncidence(id);

                var result = mapper.Map <Incidence, IncidenceResource>(incidence);
                return(Ok(result));
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("Error", "An error occured while performing this operation.");
                return(BadRequest(ModelState));
            }
        }
Exemple #3
0
        public async Task <IActionResult> CreateIncidence([FromBody] SaveIncidenceResource incidenceResource)
        {
            try
            {
                var loggedInUserId = _userRepo.GetLoggedInUserId();
                var user           = await _userRepo.GetUser(loggedInUserId);

                bool triggerNotification     = false;
                bool triggerDeptNotification = false;
                //assumes the organization creates this incidence front front-end, notification applies only when its assigned, resolved or closed
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                //business rule validation
                var incidenceCode = !string.IsNullOrEmpty(incidenceResource.Description) ? incidenceResource.Description + "/"
                                    + ((incidenceResource.ReportedIncidenceLatitude != null) ? incidenceResource.ReportedIncidenceLatitude : DateTime.Now.Minute) + "/"
                                    + ((incidenceResource.ReportedIncidenceLongitude != null) ? incidenceResource.ReportedIncidenceLongitude : DateTime.Now.Minute)
                    : incidenceResource.ReportedIncidenceLatitude + "/" + incidenceResource.ReportedIncidenceLongitude;
                if (repository.CheckIncidenceCode(incidenceCode))
                {
                    ModelState.AddModelError("Error", "The incidence with this Code already exists.");
                    return(BadRequest(ModelState));
                }

                var incidence = mapper.Map <SaveIncidenceResource, Incidence>(incidenceResource);
                incidence.Deleted = false;
                // incidence.Protected = true; in other to allow pseudo-deletion which only hides the record
                incidence.CreatedByUserId   = _userRepo.GetLoggedInUserId();
                incidence.DateCreated       = DateTime.Now;
                incidence.IncidenceStatusId = incidenceResource.IncidenceStatusId ?? GlobalFields.NewIncidenceStatus;
                incidence.Code = incidenceCode;
                //incidence.LastUpdate = DateTime.Now;

                if (user != null)
                {
                    var reporterFullName = string.IsNullOrEmpty(user.MiddleName) ? user.FirstName + " " + user.LastName
                        : user.FirstName + " " + user.MiddleName + " " + user.LastName;
                    incidence.ReporterName         = reporterFullName ?? "";
                    incidence.ReporterDepartmentId = user.DepartmentId;
                    incidence.ReporterEmail        = user.Email1;
                }
                incidence.OrganizationId = user.UserName != "Admin" ? user.OrganizationId : null;
                // trigger alert when incidence status is open or re-opened provided as Assignee and Assigner were sent
                if (incidenceResource.AssigneeId != null && (incidenceResource.IncidenceStatusId == GlobalFields.OpenIncidenceStatus || incidenceResource.IncidenceStatusId == GlobalFields.ReOpenedIncidenceStatus))
                {
                    incidence.AssignerId = loggedInUserId;
                    triggerNotification  = true;
                }
                else if (incidenceResource.IncidenceStatusId != incidence.IncidenceStatusId && incidenceResource.IncidenceStatusId == GlobalFields.ClosedIncidenceStatus)
                {
                    // set resolution date when incidence is closed. No notification here as it incidence was already closed before creation. No Assigner or Assignee before now
                    incidenceResource.ResolutionDate = DateTime.Now;
                }

                var incidenceTypeDepartment = new OrganizationDepartment();
                if (incidenceResource.IncidenceTypeId != null)
                {
                    incidenceTypeDepartment = await _incidenceTypeDeptRepo.GetDepartmentFromIncidenceType(incidenceResource.IncidenceTypeId);
                }
                incidence.IncidenceStatusId = incidenceResource.IncidenceStatusId ?? GlobalFields.NewIncidenceStatus;
                if (incidence.IncidenceStatusId == GlobalFields.NewIncidenceStatus && incidenceResource.IncidenceTypeId != null)
                {
                    incidence.AssignedDepartmentId   = incidenceTypeDepartment.Id;
                    incidence.OrganizationId         = incidenceTypeDepartment.OrganizationId;
                    incidence.AssignedOrganizationId = incidenceTypeDepartment.OrganizationId;
                    triggerDeptNotification          = true;
                }

                repository.Add(incidence);
                await unitOfWork.CompleteAsync();

                if (triggerDeptNotification)
                {
                    //pass the reporter details into incidenceResource as it only exists in incidence and it is needed in email notification
                    incidenceResource.ReporterName  = incidence.ReporterName;
                    incidenceResource.ReporterEmail = incidence.ReporterEmail;
                    incidence.ReporterDepartmentId  = incidence.ReporterDepartmentId;
                    await _notificationRepo.SendEmailNotificationToOrgDeptUsers(incidenceResource, incidenceTypeDepartment.Id, incidenceTypeDepartment.OrganizationId, incidence.ReporterDepartmentId); // use SendEmailNotificationToOrgDeptUsers method in notificationRepo
                }

                if (triggerNotification)
                {
                    await _notificationRepo.SendIncidenceNotification(incidenceResource, incidenceResource.AssignedDepartmentId, incidenceResource.AssignerId, incidenceResource.AssigneeId, incidenceResource.AssignedOrganizationId);
                }

                incidence = await repository.GetIncidence(incidence.Id);

                var result = mapper.Map <Incidence, IncidenceResource>(incidence);

                return(Ok(result));
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("Error", "An error occured while performing this operation.");
                return(BadRequest(ModelState));
            }
        }