public static UnitReport BuildAndPersistUnitReport(bool submitted, Organization organization,
                                                           ReportingPeriod reportingPeriod, ISession s)
        {
            string description   = DataProvider.Get <string>();
            var    reportingData = new ReportDataBuilder().Build();
            var    report        =
                new UnitReport(description, organization, reportingPeriod, reportingData);

            if (submitted)
            {
                report.MarkStatusAsSubmitted();
            }

            s.Save(report);
            return(report);
        }
        public void CreateNewUnitPlanAi_SavesCorrectlyWhenLastYearSubmitted(ReportingFrequency reportingFrequency)
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var organizationType = OrganizationType.Unit;

                var description   = DataProvider.Get <string>();
                var year          = 2019;
                var reportingTerm = ReportingTerm.One;
                var organization  = new TestObjectBuilder <Organization>()
                                    .SetArgument(o => o.OrganizationType, organizationType)
                                    .SetArgument(o => o.ReportingFrequency, reportingFrequency)
                                    .BuildAndPersist(s);

                OrganizationReference organizationRef = organization;

                var reportingPeriod = new ReportingPeriod(reportingFrequency, reportingTerm, year);

                var lastPeriod1 = reportingPeriod.GetReportingPeriodOfPreviousTerm();
                var lastPeriod1ReportingData = new ReportDataBuilder().Build();
                var lastPeriod1UnitReport    = new UnitReport(description, organization, lastPeriod1, lastPeriod1ReportingData);
                lastPeriod1UnitReport.MarkStatusAsSubmitted();
                s.Save(lastPeriod1UnitReport);

                var lastPeriod2 = lastPeriod1.GetReportingPeriodOfPreviousTerm();
                var lastPeriod2ReportingData = new ReportDataBuilder().Build();
                var lastPeriod2UnitReport    = new UnitReport(description, organization, lastPeriod2, lastPeriod2ReportingData);
                lastPeriod2UnitReport.MarkStatusAsSubmitted();
                s.Save(lastPeriod2UnitReport);

                var expected = new UnitReportBuilder()
                               .SetDescription(description)
                               .SetOrganization(organization)
                               .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingTerm, year))
                               .Build();

                return(new
                {
                    description,
                    organizationRef,
                    reportingPeriod,
                    lastPeriod1UnitReport,
                    expected
                });
            });
            var result = Endpoint.Act(AssemblySetupFixture.EndpointTestContainer,
                                      c =>
            {
                var unitReport = c.GetInstance <UnitReportFactory>()
                                 .CreateNewUnitPlanAi(testParams.description,
                                                      testParams.organizationRef,
                                                      testParams.reportingPeriod.ReportingTerm,
                                                      testParams.reportingPeriod.Year,
                                                      reportingFrequency);
                return(new
                {
                    unitReport
                });
            });

            result.unitReport.Should().NotBeNull();

            result.unitReport.Should().BeEquivalentTo(testParams.expected, e =>
                                                      e.Excluding(p => p.Id)
                                                      .Excluding(p => p.AssociateMemberData)
                                                      .Excluding(p => p.PreliminaryMemberData)
                                                      .Excluding(p => p.WorkerMeetingProgramData)
                                                      .Excluding(p => p.SupporterMemberData)
                                                      .Excluding(p => p.DawahMeetingProgramData)
                                                      .Excluding(p => p.MemberMemberData));


            TestHelper.MemberDataForCreateUnitPlanShouldBeEquivalent(result.unitReport.AssociateMemberData, testParams.lastPeriod1UnitReport.AssociateMemberData);
            TestHelper.MemberDataForCreateUnitPlanShouldBeEquivalent(result.unitReport.PreliminaryMemberData, testParams.lastPeriod1UnitReport.PreliminaryMemberData);
            result.unitReport.PreliminaryMemberData.Should().BeEquivalentTo(testParams.lastPeriod1UnitReport.WorkerMeetingProgramData);
        }
        public void PromotePlanToUnitReportAi_SavesCorrectlyWhenLastYearSubmitted(ReportingFrequency reportingFrequency)
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var organizationType = OrganizationType.Unit;

                var description   = DataProvider.Get <string>();
                var year          = 2019;
                var reportingTerm = ReportingTerm.One;
                var organization  = new TestObjectBuilder <Organization>()
                                    .SetArgument(o => o.OrganizationType, organizationType)
                                    .SetArgument(o => o.ReportingFrequency, reportingFrequency)
                                    .BuildAndPersist(s);

                var period1 = new ReportingPeriod(reportingFrequency, reportingTerm, year);
                var period1ReportingData = new ReportDataBuilder().Build();
                var period1UnitReport    =
                    new UnitReport(description, organization, period1, period1ReportingData);
                s.Save(period1UnitReport);

                var lastPeriod2 = period1.GetReportingPeriodOfPreviousTerm();
                var lastPeriod2ReportingData = new ReportDataBuilder().Build();
                var lastPeriod2UnitReport    =
                    new UnitReport(description, organization, lastPeriod2, lastPeriod2ReportingData);
                lastPeriod2UnitReport.MarkStatusAsSubmitted();
                s.Save(lastPeriod2UnitReport);

                return(new
                {
                    period1UnitReport,
                    lastPeriod2UnitReport
                });
            });
            var result = Endpoint.Act(AssemblySetupFixture.EndpointTestContainer,
                                      c =>
            {
                var unitReport = c.GetInstance <UnitReportService>()
                                 .PromotePlanToUnitReportAi(testParams.period1UnitReport.Id);
                return(new
                {
                    unitReport
                });
            });

            result.unitReport.Should().NotBeNull();
            result.unitReport.Should().BeEquivalentTo(testParams.period1UnitReport, e =>
                                                      e.Excluding(p => p.ReportStatus)
                                                      .Excluding(p => p.AssociateMemberData)
                                                      .Excluding(p => p.PreliminaryMemberData)
                                                      .Excluding(p => p.WorkerMeetingProgramData));

            result.unitReport.ReportStatus.Should().Be(ReportStatus.PlanPromoted);

            result.unitReport.AssociateMemberData.UpgradeTarget.Should()
            .Be(testParams.period1UnitReport.AssociateMemberData.UpgradeTarget);
            result.unitReport.AssociateMemberData.LastPeriod.Should()
            .Be(testParams.period1UnitReport.AssociateMemberData.LastPeriod);
            result.unitReport.AssociateMemberData.ThisPeriod.Should()
            .Be(testParams.lastPeriod2UnitReport.AssociateMemberData.ThisPeriod);

            result.unitReport.PreliminaryMemberData.UpgradeTarget.Should()
            .Be(testParams.period1UnitReport.PreliminaryMemberData.UpgradeTarget);
            result.unitReport.PreliminaryMemberData.LastPeriod.Should()
            .Be(testParams.period1UnitReport.PreliminaryMemberData.LastPeriod);
            result.unitReport.PreliminaryMemberData.ThisPeriod.Should()
            .Be(testParams.lastPeriod2UnitReport.PreliminaryMemberData.ThisPeriod);

            //Worker meeting values should be initial values. Should not set last period values (as that will be irrelevant)
            result.unitReport.WorkerMeetingProgramData.Target.Should()
            .Be(testParams.period1UnitReport.WorkerMeetingProgramData.Target);
            result.unitReport.WorkerMeetingProgramData.Actual.Should()
            .Be(testParams.period1UnitReport.WorkerMeetingProgramData.Actual);
            result.unitReport.WorkerMeetingProgramData.AverageAttendance.Should()
            .Be(testParams.period1UnitReport.WorkerMeetingProgramData.AverageAttendance);
        }