public IActionResult LateSubmissionReasonGet(string encryptedOrganisationId, int reportingYear)
        {
            long organisationId = ControllerHelper.DecryptOrganisationIdOrThrow404(encryptedOrganisationId);

            ControllerHelper.ThrowIfUserAccountRetiredOrEmailNotVerified(User, dataRepository);
            ControllerHelper.ThrowIfUserDoesNotHavePermissionsForGivenOrganisation(User, dataRepository, organisationId);
            ControllerHelper.ThrowIfReportingYearIsOutsideOfRange(reportingYear);

            if (!draftReturnService.DraftReturnExistsAndRequiredFieldsAreComplete(organisationId, reportingYear))
            {
                return(RedirectToReportOverviewPage(encryptedOrganisationId, reportingYear, "This report is not ready to submit. Complete the remaining sections"));
            }

            DraftReturn draftReturn = draftReturnService.GetDraftReturn(organisationId, reportingYear);

            if (!draftReturnService.DraftReturnWouldBeNewlyLateIfSubmittedNow(draftReturn))
            {
                // If this is not a late submission, send the user back to the Overview page
                return(RedirectToAction("ReportOverview", "ReportOverview",
                                        new { encryptedOrganisationId, reportingYear }));
            }

            var viewModel = new LateSubmissionReasonViewModel();

            PopulateLateSubmissionViewModel(viewModel, organisationId, reportingYear);

            return(View("LateSubmissionReason", viewModel));
        }
        private void PopulateLateSubmissionViewModel(LateSubmissionReasonViewModel viewModel, long organisationId, int reportingYear)
        {
            Organisation organisation = dataRepository.Get <Organisation>(organisationId);

            DateTime snapshotDate = organisation.SectorType.GetAccountingStartDate(reportingYear);
            DateTime deadlineDate = ReportingYearsHelper.GetDeadlineForAccountingDate(snapshotDate);

            viewModel.Organisation             = organisation;
            viewModel.ReportingYear            = reportingYear;
            viewModel.DeadlineDate             = deadlineDate;
            viewModel.IsEditingSubmittedReturn = organisation.HasSubmittedReturn(reportingYear);
        }
        public IActionResult LateSubmissionReasonPost(string encryptedOrganisationId, int reportingYear, LateSubmissionReasonViewModel viewModel)
        {
            long organisationId = ControllerHelper.DecryptOrganisationIdOrThrow404(encryptedOrganisationId);

            ControllerHelper.ThrowIfUserAccountRetiredOrEmailNotVerified(User, dataRepository);
            ControllerHelper.ThrowIfUserDoesNotHavePermissionsForGivenOrganisation(User, dataRepository, organisationId);
            ControllerHelper.ThrowIfReportingYearIsOutsideOfRange(reportingYear);

            if (!draftReturnService.DraftReturnExistsAndRequiredFieldsAreComplete(organisationId, reportingYear))
            {
                return(RedirectToReportOverviewPage(encryptedOrganisationId, reportingYear, "This report is not ready to submit. Complete the remaining sections"));
            }

            DraftReturn draftReturn = draftReturnService.GetDraftReturn(organisationId, reportingYear);

            if (!draftReturnService.DraftReturnWouldBeNewlyLateIfSubmittedNow(draftReturn))
            {
                // If this is not a late submission, send the user back to the Overview page
                return(RedirectToReportOverviewPage(encryptedOrganisationId, reportingYear));
            }

            viewModel.ParseAndValidateParameters(Request, m => m.ReceivedLetterFromEhrc);
            viewModel.ParseAndValidateParameters(Request, m => m.Reason);

            if (viewModel.HasAnyErrors())
            {
                PopulateLateSubmissionViewModel(viewModel, organisationId, reportingYear);
                return(View("LateSubmissionReason", viewModel));
            }

            User   user = ControllerHelper.GetGpgUserFromAspNetUser(User, dataRepository);
            bool   receivedLetterFromEhrc = viewModel.ReceivedLetterFromEhrc == ReportLateSubmissionReceivedLetterFromEhrc.Yes;
            Return newReturn = returnService.CreateAndSaveLateReturnFromDraftReturn(draftReturn, user, Url, viewModel.Reason, receivedLetterFromEhrc);

            return(RedirectToAction("ReportConfirmation", "ReportConfirmation",
                                    new
            {
                encryptedOrganisationId,
                reportingYear,
                confirmationId = Encryption.EncryptQuerystring(newReturn.ReturnId.ToString())
            }));
        }