public async Task <IHttpActionResult> MakeCentralPlan2(
            OrganizationReference organization,
            int year,
            ReportingTerm reportingTerm,
            ReportingFrequency reportingFrequency)
        {
            try
            {
                if (!_userContext.CurrentUserIsSystemUser())
                {
                    return(Unauthorized());
                }

                if (organization == null)
                {
                    throw new ArgumentNullException(nameof(organization));
                }

                if (!_userContext.CurrentUserCanAccess(organization.Id))
                {
                    return(Unauthorized());
                }

                var cmd = new CreateCentralPlanCommand(organization, year, reportingTerm, reportingFrequency);
                await _endpointInstance().SendWithSignalRMetaData(cmd, Request);

                return(this.Accepted());
            }
            catch (Exception ex)
            {
                _log.Error(ex);
                return(InternalServerError());
            }
        }
        public async Task Handle_SavesCentralReport(ReportingFrequency reportingFrequency)
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var username      = DataProvider.Get <string>();
                var year          = 2019;
                var reportingTerm = ReportingTerm.One;
                var organization  = new TestObjectBuilder <Organization>()
                                    .SetArgument(o => o.OrganizationType, OrganizationType.Central)
                                    .SetArgument(o => o.ReportingFrequency, reportingFrequency)
                                    .BuildAndPersist(s);

                var cmd         = new CreateCentralPlanCommand(organization, year, reportingTerm, reportingFrequency);
                var description = cmd.Description;
                var expected    = new CentralReportBuilder()
                                  .SetDescription(description)
                                  .SetOrganization(organization)
                                  .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingTerm, year))
                                  .Build();

                return(new
                {
                    Cmd = cmd,
                    Organization = organization,
                    username,
                    expected
                });
            });

            var context = await Endpoint.Act <CreateCentralPlanCommandHandler>(
                AssemblySetupFixture.EndpointTestContainer,
                (h, ctx) =>
            {
                ctx.SetUsernameOnHeader(testParams.username);
                return(h.Handle(testParams.Cmd, ctx));
            });

            var evt = context.ExpectPublish <ICentralPlanCreated>();

            Endpoint.AssertOnSqlSessionThat(AssemblySetupFixture.EndpointTestContainer,
                                            s =>
            {
                var report = s.Query <CentralReport>().Single();
                report.Should().NotBeNull();
                report.Should().BeEquivalentTo(testParams.expected, e => e.Excluding(p => p.Id));
                report.ReportingPeriod.Should().BeEquivalentTo(testParams.expected.ReportingPeriod);

                EntityReference reportRef = report;

                var expectedEvt = Test.CreateInstance <ICentralPlanCreated>(e =>
                {
                    e.Organization  = testParams.expected.Organization;
                    e.Username      = testParams.username;
                    e.CentralReport = reportRef;
                });

                evt.Should().BeEquivalentTo(expectedEvt, e => e.Excluding(p => p.SerializedData));
                evt.SerializedData.Should().NotBe(null);
            });
        }