示例#1
0
        public (CaseSubmissionResponse, CaseSubmission) ExecutePost(CreateCaseSubmissionRequest request)
        {
            var worker   = GetSanitisedWorker(request.CreatedBy);
            var resident = GetSanitisedResident(request.ResidentId);

            var dateTimeNow = DateTime.Now;

            var caseSubmission = new CaseSubmission
            {
                FormId    = request.FormId,
                Residents = new List <Person> {
                    resident
                },
                Workers = new List <Worker> {
                    worker
                },
                CreatedAt       = dateTimeNow,
                CreatedBy       = worker,
                SubmissionState = SubmissionState.InProgress,
                EditHistory     = new List <EditHistory <Worker> > {
                    new EditHistory <Worker> {
                        Worker = worker, EditTime = dateTimeNow
                    }
                },
                FormAnswers = new Dictionary <string, string>()
            };

            _mongoGateway.InsertRecord(_collectionName, caseSubmission);

            return(caseSubmission.ToDomain().ToResponse(), caseSubmission);
        }
示例#2
0
        private static void UpdateTitle(CaseSubmission caseSubmission, string?title)
        {
            if (title == null)
            {
                return;
            }

            caseSubmission.Title = title;
        }
示例#3
0
        private static void UpdateDateOfEvent(CaseSubmission caseSubmission, DateTime?dateOfEvent)
        {
            if (dateOfEvent == null)
            {
                return;
            }

            caseSubmission.DateOfEvent = dateOfEvent;
        }
示例#4
0
        private void UpdateResidents(CaseSubmission caseSubmission, UpdateCaseSubmissionRequest request)
        {
            if (request.Residents == null)
            {
                return;
            }

            if (request.Residents.Count == 0)
            {
                throw new UpdateSubmissionException("A submission must be against at least one resident");
            }

            if (caseSubmission.SubmissionState != SubmissionState.InProgress)
            {
                throw new UpdateSubmissionException("Cannot update residents for submission, submission state not 'in progress'");
            }

            var residentsWithoutDuplicates = new HashSet <long>(request.Residents);

            var newResident = residentsWithoutDuplicates.Select(GetSanitisedResident).ToList();

            caseSubmission.Residents = newResident;
        }
示例#5
0
        private static void UpdateSubmissionState(CaseSubmission submission, UpdateCaseSubmissionRequest request, Worker worker)
        {
            if (request.SubmissionState == null)
            {
                return;
            }

            var mapSubmissionStateToResponseString = new Dictionary <SubmissionState, string> {
                { SubmissionState.InProgress, "In progress" },
                { SubmissionState.Submitted, "Submitted" },
                { SubmissionState.Approved, "Approved" },
                { SubmissionState.Discarded, "Discarded" },
                { SubmissionState.PanelApproved, "Panel Approved" }
            };

            if (!_stringToSubmissionState.ContainsKey(request.SubmissionState.ToLower()))
            {
                throw new UpdateSubmissionException($"Invalid submission state supplied {request.SubmissionState}");
            }

            var newSubmissionState = _stringToSubmissionState[request.SubmissionState.ToLower()];

            // We should never hit the default but C# compiler complains if we don't provide a default case
            // https://stackoverflow.com/questions/1098644/switch-statement-without-default-when-dealing-with-enumerations
            switch (newSubmissionState)
            {
            case SubmissionState.Discarded:
                if (submission.SubmissionState != SubmissionState.InProgress)
                {
                    throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}");
                }
                break;

            case SubmissionState.InProgress:
                if (submission.SubmissionState != SubmissionState.Submitted && submission.SubmissionState != SubmissionState.Approved)
                {
                    throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}");
                }
                submission.RejectionReason = request.RejectionReason;
                break;

            case SubmissionState.Submitted:
                if (submission.SubmissionState != SubmissionState.InProgress)
                {
                    throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}");
                }
                submission.SubmittedAt = DateTime.Now;
                submission.SubmittedBy = worker;
                break;

            case SubmissionState.Approved:
                if (submission.SubmissionState != SubmissionState.Submitted)
                {
                    throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}");
                }
                if (submission.CreatedBy.Email.Equals(request.EditedBy, StringComparison.OrdinalIgnoreCase))
                {
                    throw new UpdateSubmissionException($"Worker with email {request.EditedBy} cannot approve the submission as they created the submission");
                }
                submission.ApprovedAt = DateTime.Now;
                submission.ApprovedBy = worker;
                break;

            case SubmissionState.PanelApproved:
                if (submission.SubmissionState != SubmissionState.Approved)
                {
                    throw new UpdateSubmissionException($"Invalid submission state change from {mapSubmissionStateToResponseString[submission.SubmissionState]} to {mapSubmissionStateToResponseString[newSubmissionState]}");
                }
                if (submission.CreatedBy.Email.Equals(request.EditedBy, StringComparison.OrdinalIgnoreCase))
                {
                    throw new UpdateSubmissionException($"Worker with email {request.EditedBy} cannot panel approve the submission as they created the submission");
                }
                submission.PanelApprovedAt = DateTime.Now;
                submission.PanelApprovedBy = worker;
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(request));
            }

            submission.SubmissionState = newSubmissionState;
        }