public ProducerCharge GetProducerChargeBand(schemeType schmemeType, producerType producerType, MemberUpload memberUpload)
        {
            var complianceYear = int.Parse(schmemeType.complianceYear);

            var previousProducerSubmission =
                registeredProducerDataAccess.GetProducerRegistration(producerType.registrationNo, complianceYear, schmemeType.approvalNo, memberUpload);

            var previousAmendmentCharge =
                registeredProducerDataAccess.HasPreviousAmendmentCharge(producerType.registrationNo, complianceYear, schmemeType.approvalNo, memberUpload);

            var chargeband = environmentAgencyProducerChargeBandCalculator.GetProducerChargeBand(schmemeType, producerType, memberUpload);

            if (previousProducerSubmission != null)
            {
                Log.Information(string.Format("previous {0}", previousProducerSubmission.Id));
                Log.Information(string.Format("previous amendment {0}", previousAmendmentCharge.ToString()));
                if (!previousAmendmentCharge && (producerType.eeePlacedOnMarketBand == eeePlacedOnMarketBandType.Morethanorequalto5TEEEplacedonmarket &&
                                                 previousProducerSubmission.EEEPlacedOnMarketBandType == (int)eeePlacedOnMarketBandType.Lessthan5TEEEplacedonmarket))
                {
                    return(chargeband);
                }
            }

            return(new ProducerCharge()
            {
                ChargeBandAmount = chargeband.ChargeBandAmount,
                Amount = 0
            });
        }
        public void AnnualTurnoverDoesNotMatchWithBand_ShouldReturnInvalidResult_WithProducerName_AndProducerRegistrationNumber_AndWarningStatus(annualTurnoverBandType annualTurnoverBand, double annualTurnover)
        {
            const string name = "Some company";
            const string prn = "ABC12345";

            var producer = new producerType
            {
                annualTurnover = decimal.Parse(annualTurnover.ToString(CultureInfo.InvariantCulture)),
                annualTurnoverBand = annualTurnoverBand,
                producerBusiness = new producerBusinessType
                {
                    Item = new partnershipType
                    {
                        partnershipName = name
                    }
                },
                registrationNo = prn
            };

            var result = Rule().Evaluate(producer);

            Assert.False(result.IsValid);
            Assert.Contains(name, result.Message);
            Assert.Equal(Core.Shared.ErrorLevel.Warning, result.ErrorLevel);
        }
        public void Evaluate_Insert_MatchingCompanyRegistrationNumber_ReturnsError()
        {
            string companyNumber = "1234";

            var newProducer = new producerType()
            {
                status           = statusType.I,
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyNumber = companyNumber
                    }
                }
            };

            var existingProducer = FakeProducer.Create(ObligationType.Both, "prn",
                                                       producerBusiness: new ProducerBusiness(new Company("Company", companyNumber, null)));

            A.CallTo(() => producerQuerySet.GetLatestCompanyProducers()).Returns(new List <ProducerSubmission>()
            {
                existingProducer
            });

            var result = new CompanyAlreadyRegistered(producerQuerySet, migratedProducerQuerySet).Evaluate(newProducer);

            Assert.False(result.IsValid);
            Assert.Equal(Core.Shared.ErrorLevel.Error, result.ErrorLevel);
        }
Beispiel #4
0
            private producerType CreateProducer()
            {
                var producer = new producerType();

                producer.tradingName               = TradingName;
                producer.producerBrandNames        = BrandNames;
                producer.SICCodeList               = SicCodes;
                producer.producerBusiness          = ProducerBusiness;
                producer.authorisedRepresentative  = AuthorisedRepresentative;
                producer.eeePlacedOnMarketBand     = EEEPlacedOnMarketBandType;
                producer.sellingTechnique          = SellingTechnique;
                producer.obligationType            = ObligationType;
                producer.annualTurnoverBand        = AnnualTurnoverBandType;
                producer.ceaseToExistDateSpecified = CeaseDate.HasValue;
                if (CeaseDate.HasValue)
                {
                    producer.ceaseToExistDate = CeaseDate.Value;
                }
                producer.registrationNo = RegistrationNumber;
                producer.annualTurnover = AnnualTurnover;
                producer.VATRegistered  = VatRegistered;
                producer.status         = Status;

                return(producer);
            }
Beispiel #5
0
        public async Task Evaluate_ProducerObligationTypeChange_NoExistingEeeDataForProducer_ReturnsWarning()
        {
            // Arrange
            var builder = new ProducerObligationTypeChangeBuilder();

            var existingProducerDetails = A.Fake <ProducerSubmission>();

            A.CallTo(() => existingProducerDetails.ObligationType)
            .Returns(ObligationType.B2C);

            A.CallTo(() => builder.ProducerQuerySet.GetLatestProducerForComplianceYearAndScheme(A <string> ._, A <string> ._, A <Guid> ._))
            .Returns(existingProducerDetails);

            A.CallTo(() => builder.SchemeEeeDataQuerySet.GetLatestProducerEeeData(A <string> ._))
            .Returns((List <EeeOutputAmount>)null);

            var newProducerDetails = new producerType
            {
                status         = statusType.A,
                obligationType = obligationTypeType.B2B
            };

            // Act
            var result = await builder.Build().Evaluate(newProducerDetails);

            // Assert
            A.CallTo(() => builder.ProducerQuerySet.GetLatestProducerForComplianceYearAndScheme(A <string> ._, A <string> ._, A <Guid> ._))
            .MustHaveHappened();

            A.CallTo(() => builder.SchemeEeeDataQuerySet.GetLatestProducerEeeData(A <string> ._))
            .MustHaveHappened();

            Assert.False(result.IsValid);
            Assert.Equal(ErrorLevel.Warning, result.ErrorLevel);
        }
        public void AnnualTurnoverDoesNotMatchWithBand_ShouldReturnInvalidResult_WithProducerName_AndProducerRegistrationNumber_AndWarningStatus(annualTurnoverBandType annualTurnoverBand, double annualTurnover)
        {
            const string name = "Some company";
            const string prn  = "ABC12345";

            var producer = new producerType
            {
                annualTurnover     = decimal.Parse(annualTurnover.ToString(CultureInfo.InvariantCulture)),
                annualTurnoverBand = annualTurnoverBand,
                producerBusiness   = new producerBusinessType
                {
                    Item = new partnershipType
                    {
                        partnershipName = name
                    }
                },
                registrationNo = prn
            };

            var result = Rule().Evaluate(producer);

            Assert.False(result.IsValid);
            Assert.Contains(name, result.Message);
            Assert.Equal(Core.Shared.ErrorLevel.Warning, result.ErrorLevel);
        }
        public void Evaluate_Insert_MatchingMigratedProducerCompanyRegistrationNumber_ReturnsError()
        {
            string companyNumber = "1234";

            var newProducer = new producerType()
            {
                status = statusType.I,
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType() { companyNumber = companyNumber }
                }
            };

            A.CallTo(() => producerQuerySet.GetLatestCompanyProducers()).Returns(new List<ProducerSubmission>());

            var migratedProducer = A.Fake<MigratedProducer>();
            A.CallTo(() => migratedProducer.CompanyNumber).Returns(companyNumber);

            A.CallTo(() => migratedProducerQuerySet.GetAllMigratedProducers()).Returns(new List<MigratedProducer>() { migratedProducer });

            var result = new CompanyAlreadyRegistered(producerQuerySet, migratedProducerQuerySet).Evaluate(newProducer);

            Assert.False(result.IsValid);
            Assert.Equal(Core.Shared.ErrorLevel.Error, result.ErrorLevel);
        }
        public void Evaluate_Amend_NoMatchingProducer_ReturnsPass()
        {
            // Arrange
            string companyNumber = "1234";

            var newProducer = new producerType()
            {
                status = statusType.A,
                registrationNo = "prn",
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType() { companyNumber = companyNumber }
                }
            };

            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
                .Returns(null);

            // Act
            var result = new CompanyRegistrationNumberChange(producerQuerySet)
                .Evaluate(newProducer);

            // Assert
            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
                .MustHaveHappened();

            Assert.True(result.IsValid);
        }
Beispiel #9
0
        private static producerType SetUpProducer(countryType countryType, eeePlacedOnMarketBandType eeePlacedOnMarketBandType, annualTurnoverBandType annualTurnoverBandType, bool vatRegistered)
        {
            var producerCompany = new companyType()
            {
                companyName      = "Test company",
                companyNumber    = "Test CRN",
                registeredOffice = new contactDetailsContainerType()
                {
                    contactDetails = new contactDetailsType()
                    {
                        address = new addressType()
                        {
                            country = countryType
                        }
                    }
                }
            };

            var producerBusiness = new producerBusinessType()
            {
                Item = producerCompany
            };

            var producer = new producerType
            {
                annualTurnoverBand    = annualTurnoverBandType,
                VATRegistered         = vatRegistered,
                eeePlacedOnMarketBand = eeePlacedOnMarketBandType,
                producerBusiness      = producerBusiness
            };

            return(producer);
        }
        ProducerRegisteredMatchesComplianceYearAndObligationType_ButRegistrationNumberIsNullOrEmpty_ValidationSucceeds
            (string registrationNumber)
        {
            const string             complianceYear = "2016";
            const obligationTypeType obligationType = obligationTypeType.B2B;

            A.CallTo(() => producerQuerySet.GetProducerForOtherSchemeAndObligationType(A <string> ._, A <string> ._, A <Guid> ._, A <ObligationType> ._))
            .Returns(FakeProducer.Create(obligationType.ToDomainObligationType(), registrationNumber));

            producerType producer = new producerType()
            {
                tradingName      = "Test Trader",
                obligationType   = obligationType,
                producerBusiness = new producerBusinessType
                {
                    Item = new partnershipType
                    {
                        partnershipName = "New Producer Name"
                    }
                }
            };

            schemeType scheme = new schemeType()
            {
                complianceYear = complianceYear,
                producerList   = new[]
                {
                    producer
                }
            };
            var result = Rule().Evaluate(scheme, producer, A.Dummy <Guid>());

            Assert.True(result.IsValid);
        }
        public RuleResult Evaluate(schemeType root, producerType element, Guid organisationId)
        {
            var result = RuleResult.Pass();

            if (element.status == statusType.A)
            {
                var existingProducer =
                    querySet.GetLatestProducerForComplianceYearAndScheme(element.registrationNo, root.complianceYear, organisationId);

                if (existingProducer != null)
                {
                    ChargeBand existingChargeBandType = existingProducer.ChargeBandAmount.ChargeBand;

                    ChargeBand newChargeBandType = producerChargeBandCalculator.GetProducerChargeBand(
                        element.annualTurnoverBand,
                        element.VATRegistered,
                        element.eeePlacedOnMarketBand);

                    if (existingChargeBandType != newChargeBandType)
                    {
                        result = RuleResult.Fail(
                           string.Format("The charge band of {0} {1} will change from '{2}' to '{3}'.",
                              existingProducer.OrganisationName,
                              existingProducer.RegisteredProducer.ProducerRegistrationNumber,
                              existingChargeBandType,
                              newChargeBandType),
                           Core.Shared.ErrorLevel.Warning);
                    }
                }
            }

            return result;
        }
        public RuleResult Evaluate(schemeType root, producerType element, Guid organisationId)
        {
            var result = RuleResult.Pass();

            if (element.status == statusType.A)
            {
                var existingProducer =
                    querySet.GetLatestProducerForComplianceYearAndScheme(element.registrationNo, root.complianceYear, organisationId);

                if (existingProducer != null)
                {
                    var existingChargeBandType = existingProducer.ChargeBandAmount.ChargeBand;

                    var producerCharge = Task.Run(() => producerChargeBandCalculatorChooser.GetProducerChargeBand(root, element)).Result;

                    if (existingChargeBandType != producerCharge.ChargeBandAmount.ChargeBand)
                    {
                        result = RuleResult.Fail(
                            string.Format("The charge band of {0} {1} will change from '{2}' to '{3}'.",
                                          existingProducer.OrganisationName,
                                          existingProducer.RegisteredProducer.ProducerRegistrationNumber,
                                          existingChargeBandType,
                                          producerCharge.ChargeBandAmount.ChargeBand),
                            Core.Shared.ErrorLevel.Warning);
                    }
                }
            }

            return(result);
        }
        public void Evaluate_Insert_MatchingCompanyRegistrationNumber_DoesNotPerformMigratedProducerCompanyRegistrationNumberCheck()
        {
            string companyName   = "Test company name";
            string companyNumber = "1234";

            var newProducer = new producerType()
            {
                status           = statusType.I,
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyName = companyName, companyNumber = companyNumber
                    }
                }
            };

            var existingProducer = FakeProducer.Create(ObligationType.Both, "prn",
                                                       producerBusiness: new ProducerBusiness(new Company(companyName, companyNumber, null)));

            A.CallTo(() => producerQuerySet.GetLatestCompanyProducers()).Returns(new List <ProducerSubmission>()
            {
                existingProducer
            });

            new CompanyAlreadyRegistered(producerQuerySet, migratedProducerQuerySet).Evaluate(newProducer);

            A.CallTo(() => producerQuerySet.GetLatestCompanyProducers()).MustHaveHappened();
            A.CallTo(() => migratedProducerQuerySet.GetAllMigratedProducers()).MustNotHaveHappened();
        }
        public void Evaluate_Insert_NonMatchingMigratedProducerCompanyNumbersAfterFormatting_ReturnsPass(string newCompanyNumber, string migratedProducerCompanyNumber)
        {
            var newProducer = new producerType()
            {
                status           = statusType.I,
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyNumber = newCompanyNumber
                    }
                }
            };

            A.CallTo(() => producerQuerySet.GetLatestCompanyProducers()).Returns(new List <ProducerSubmission>());

            var migratedProducer = A.Fake <MigratedProducer>();

            A.CallTo(() => migratedProducer.CompanyNumber).Returns(migratedProducerCompanyNumber);

            A.CallTo(() => migratedProducerQuerySet.GetAllMigratedProducers()).Returns(new List <MigratedProducer>()
            {
                migratedProducer
            });

            var result = new CompanyAlreadyRegistered(producerQuerySet, migratedProducerQuerySet).Evaluate(newProducer);

            Assert.True(result.IsValid);
        }
        public void Evaluate_Insert_NonMatchingCompanyNumbersAfterFormatting_ReturnsPass(string newCompanyNumber, string existingCompanyNumber)
        {
            var newProducer = new producerType()
            {
                status           = statusType.I,
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyNumber = newCompanyNumber
                    }
                }
            };

            var existingProducer = FakeProducer.Create(ObligationType.Both, "prn",
                                                       producerBusiness: new ProducerBusiness(new Company("Company", existingCompanyNumber, null)));

            A.CallTo(() => producerQuerySet.GetLatestCompanyProducers()).Returns(new List <ProducerSubmission>()
            {
                existingProducer
            });

            var result = new CompanyAlreadyRegistered(producerQuerySet, migratedProducerQuerySet).Evaluate(newProducer);

            Assert.True(result.IsValid);
        }
        public void CalculateCharge_ProducerIsAmendmentInChargeBandCosting1WithPreviousTotalChargesOf25_ReturnsChargeAmountOf0()
        {
            // Arrange
            ChargeBandAmount chargeBandAmount = new ChargeBandAmount(
                new Guid("65D9ADC8-B53F-4570-A1C7-F49B0503FA6A"),
                ChargeBand.A,
                1);

            IProducerChargeCalculatorDataAccess dataAccess = A.Fake<IProducerChargeCalculatorDataAccess>();
            A.CallTo(() => dataAccess.FetchCurrentChargeBandAmount(ChargeBand.A)).Returns(chargeBandAmount);
            A.CallTo(() => dataAccess.FetchSumOfExistingCharges(A<string>._, "WEE/AB1234CD", 2016)).Returns(25);

            IProducerChargeBandCalculator bandCalculator = A.Fake<IProducerChargeBandCalculator>();
            A.CallTo(() => bandCalculator.GetProducerChargeBand(A<annualTurnoverBandType>._, A<bool>._, A<eeePlacedOnMarketBandType>._))
                .Returns(ChargeBand.A);

            ProducerChargeCalculator calculator = new ProducerChargeCalculator(dataAccess, bandCalculator);

            producerType producer = new producerType();
            producer.status = statusType.A;
            producer.registrationNo = "WEE/AB1234CD";
            
            // Act
            ProducerCharge result = calculator.CalculateCharge(A.Dummy<string>(), producer, 2016);

            // Assert
            Assert.Equal(0, result.Amount);
        }
        public async void GetProducerChargeBand_GivenPreviousAmendmentChargeAndChargeQualifies_EnvironmentAgencyProducerChargeWithZeroAmountShouldBeReturned()
        {
            var schemeType = new schemeType()
            {
                approvalNo = "app", complianceYear = ComplianceYear.ToString()
            };
            var producerType = new producerType()
            {
                registrationNo = "no", eeePlacedOnMarketBand = eeePlacedOnMarketBandType.Morethanorequalto5TEEEplacedonmarket
            };
            var producerCharge = new ProducerCharge()
            {
                ChargeBandAmount = new ChargeBandAmount(Guid.NewGuid(), ChargeBand.A, 0)
            };

            A.CallTo(() => registeredProducerDataAccess.GetProducerRegistration(producerType.registrationNo, ComplianceYear, schemeType.approvalNo))
            .Returns(RegisteredProducer());
            A.CallTo(() => environmentAgencyProducerChargeBandCalculator.GetProducerChargeBand(schemeType, producerType)).Returns(producerCharge);
            A.CallTo(() => registeredProducerDataAccess.HasPreviousAmendmentCharge(A <string> ._, A <int> ._, A <string> ._)).Returns(true);

            var result = await calculator.GetProducerChargeBand(schemeType, producerType);

            Assert.Equal(result.ChargeBandAmount, producerCharge.ChargeBandAmount);
            Assert.Equal(result.Amount, 0);
        }
        public void Evaluate_ProducerHasOverseasContactInFrance_Passes()
        {
            // Arrange
            EnsureAnOverseasProducerIsNotBasedInTheUK rule = new EnsureAnOverseasProducerIsNotBasedInTheUK();

            addressType address = new addressType();

            address.country = countryType.FRANCE;

            contactDetailsType overseasContact = new contactDetailsType();

            overseasContact.address = address;

            overseasProducerType overseasProducer = new overseasProducerType();

            overseasProducer.overseasContact = overseasContact;

            authorisedRepresentativeType authorisedRepresentative = new authorisedRepresentativeType();

            authorisedRepresentative.overseasProducer = overseasProducer;

            producerType producer = new producerType();

            producer.authorisedRepresentative = authorisedRepresentative;

            // Act
            RuleResult result = rule.Evaluate(producer);

            // Assert
            Assert.Equal(true, result.IsValid);
        }
        public void Evaluate_ProducerHasOverseaseContactInEngland_FailsWithError()
        {
            // Arrange
            EnsureAnOverseasProducerIsNotBasedInTheUK rule = new EnsureAnOverseasProducerIsNotBasedInTheUK();

            addressType address = new addressType();

            address.country = countryType.UKENGLAND;

            contactDetailsType overseasContact = new contactDetailsType();

            overseasContact.address = address;

            overseasProducerType overseasProducer = new overseasProducerType();

            overseasProducer.overseasContact = overseasContact;

            authorisedRepresentativeType authorisedRepresentative = new authorisedRepresentativeType();

            authorisedRepresentative.overseasProducer = overseasProducer;

            producerType producer = new producerType();

            producer.authorisedRepresentative = authorisedRepresentative;

            // Act
            RuleResult result = rule.Evaluate(producer);

            // Assert
            Assert.Equal(false, result.IsValid);
            Assert.Equal(ErrorLevel.Error, result.ErrorLevel);
        }
Beispiel #20
0
        public RuleResult Evaluate(schemeType scheme, producerType producer, Guid organisationId)
        {
            if (producer.status == statusType.A)
            {
                var existingProducer =
                    querySet.GetProducerForOtherSchemeAndObligationType(producer.registrationNo,
                                                                        scheme.complianceYear, organisationId, producer.obligationType.ToDomainObligationType());

                if (existingProducer != null)
                {
                    string schemeName = "another scheme";
                    if (existingProducer.RegisteredProducer.Scheme != null &&
                        !string.IsNullOrEmpty(existingProducer.RegisteredProducer.Scheme.SchemeName))
                    {
                        schemeName = existingProducer.RegisteredProducer.Scheme.SchemeName;
                    }

                    var errorMessage = string.Format(
                        "{0} {1} is already registered with {2} with obligation type: {3}. Review your file.",
                        producer.GetProducerName(),
                        producer.registrationNo,
                        schemeName,
                        (ObligationType)existingProducer.ObligationType);
                    return(RuleResult.Fail(errorMessage));
                }

                return(RuleResult.Pass());
            }

            return(RuleResult.Pass());
        }
        public async Task Evaluate_NoExistingProducerDetails_DoesNotRetrieveProducerEeeData_AndReturnsPass()
        {
            // Arrange
            var builder = new ProducerObligationTypeChangeBuilder();

            A.CallTo(() => builder.ProducerQuerySet.GetLatestProducerForComplianceYearAndScheme(A<string>._, A<string>._, A<Guid>._))
                .Returns(null);

            var newProducerDetails = new producerType
            {
                status = statusType.A,
                obligationType = obligationTypeType.B2C
            };

            // Act
            var result = await builder.Build().Evaluate(newProducerDetails);

            // Assert
            A.CallTo(() => builder.ProducerQuerySet.GetLatestProducerForComplianceYearAndScheme(A<string>._, A<string>._, A<Guid>._))
                .MustHaveHappened();

            A.CallTo(() => builder.SchemeEeeDataQuerySet.GetLatestProducerEeeData(A<string>._))
                .MustNotHaveHappened();

            Assert.True(result.IsValid);
        }
        public void Evaluate_Insert_MatchingMigratedProducerCompanyRegistrationNumber_ReturnsError()
        {
            string companyNumber = "1234";

            var newProducer = new producerType()
            {
                status           = statusType.I,
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyNumber = companyNumber
                    }
                }
            };

            A.CallTo(() => producerQuerySet.GetLatestCompanyProducers()).Returns(new List <ProducerSubmission>());

            var migratedProducer = A.Fake <MigratedProducer>();

            A.CallTo(() => migratedProducer.CompanyNumber).Returns(companyNumber);

            A.CallTo(() => migratedProducerQuerySet.GetAllMigratedProducers()).Returns(new List <MigratedProducer>()
            {
                migratedProducer
            });

            var result = new CompanyAlreadyRegistered(producerQuerySet, migratedProducerQuerySet).Evaluate(newProducer);

            Assert.False(result.IsValid);
            Assert.Equal(Core.Shared.ErrorLevel.Error, result.ErrorLevel);
        }
Beispiel #23
0
        public void Evaluate_Amend_MatchingProducerNotACompany_ReturnsPass()
        {
            // Arrange
            string companyNumber = "1234";

            var newProducer = new producerType()
            {
                status           = statusType.A,
                registrationNo   = "prn",
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyNumber = companyNumber
                    }
                }
            };

            var existingProducer = FakeProducer.Create(ObligationType.Both, "prn",
                                                       producerBusiness: new ProducerBusiness(partnership: new Partnership("PartnerShip", A.Dummy <ProducerContact>(), new List <Partner>())));

            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
            .Returns(existingProducer);

            // Act
            var result = new CompanyRegistrationNumberChange(producerQuerySet)
                         .Evaluate(newProducer);

            // Assert
            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
            .MustHaveHappened();

            Assert.True(result.IsValid);
        }
Beispiel #24
0
        public async Task Evaluate_ProducerObligationTypeUnchanged_DoesNotRetrieveProducerEeeData_AndReturnsPass()
        {
            // Arrange
            var builder = new ProducerObligationTypeChangeBuilder();

            var existingProducerDetails = A.Fake <ProducerSubmission>();

            A.CallTo(() => existingProducerDetails.ObligationType)
            .Returns(ObligationType.B2C);

            A.CallTo(() => builder.ProducerQuerySet.GetLatestProducerForComplianceYearAndScheme(A <string> ._, A <string> ._, A <Guid> ._))
            .Returns(existingProducerDetails);

            var newProducerDetails = new producerType
            {
                status         = statusType.A,
                obligationType = obligationTypeType.B2C
            };

            // Act
            var result = await builder.Build().Evaluate(newProducerDetails);

            // Assert
            A.CallTo(() => builder.ProducerQuerySet.GetLatestProducerForComplianceYearAndScheme(A <string> ._, A <string> ._, A <Guid> ._))
            .MustHaveHappened();

            A.CallTo(() => builder.SchemeEeeDataQuerySet.GetLatestProducerEeeData(A <string> ._))
            .MustNotHaveHappened();

            Assert.True(result.IsValid);
        }
Beispiel #25
0
        public void Evaluate_Amend_NoMatchingProducer_ReturnsPass()
        {
            // Arrange
            string companyNumber = "1234";

            var newProducer = new producerType()
            {
                status           = statusType.A,
                registrationNo   = "prn",
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyNumber = companyNumber
                    }
                }
            };

            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
            .Returns(null);

            // Act
            var result = new CompanyRegistrationNumberChange(producerQuerySet)
                         .Evaluate(newProducer);

            // Assert
            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
            .MustHaveHappened();

            Assert.True(result.IsValid);
        }
Beispiel #26
0
        public void Evaluate_Amend_MatchingProducerDifferentCompanyNumber_ReturnsWarning()
        {
            // Arrange
            var newProducer = new producerType()
            {
                status           = statusType.A,
                registrationNo   = "prn",
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyNumber = "1111"
                    }
                }
            };

            var existingProducer = FakeProducer.Create(ObligationType.Both, "prn",
                                                       producerBusiness: new ProducerBusiness(new Company("Company", "1234", null)));

            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
            .Returns(existingProducer);

            // Act
            var result = new CompanyRegistrationNumberChange(producerQuerySet)
                         .Evaluate(newProducer);

            // Assert
            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
            .MustHaveHappened();

            Assert.False(result.IsValid);
            Assert.Equal(Core.Shared.ErrorLevel.Warning, result.ErrorLevel);
        }
Beispiel #27
0
        public void Evaluate_Amend_MatchingCompanyNumbersAfterFormatting_ReturnsPass(string newCompanyNumber, string existingCompanyNumber)
        {
            // Arrange
            var newProducer = new producerType()
            {
                status           = statusType.A,
                registrationNo   = "prn",
                producerBusiness = new producerBusinessType()
                {
                    Item = new companyType()
                    {
                        companyNumber = newCompanyNumber
                    }
                }
            };

            var existingProducer = FakeProducer.Create(ObligationType.Both, "prn",
                                                       producerBusiness: new ProducerBusiness(new Company("Company", existingCompanyNumber, null)));

            A.CallTo(() => producerQuerySet.GetLatestProducerFromPreviousComplianceYears("prn"))
            .Returns(existingProducer);

            // Act
            var result = new CompanyRegistrationNumberChange(producerQuerySet)
                         .Evaluate(newProducer);

            // Assert
            Assert.True(result.IsValid);
        }
        public async Task<RuleResult> Evaluate(producerType producer)
        {
            var result = RuleResult.Pass();

            if (producer.status == statusType.A)
            {
                var existingProducerDetails =
                    producerQuerySet.GetLatestProducerForComplianceYearAndScheme(producer.registrationNo, complianceYear, organisationId);

                if (existingProducerDetails != null)
                {
                    var newObligationType = producer.obligationType.ToDomainObligationType();

                    if (existingProducerDetails.ObligationType != newObligationType)
                    {
                        var producerEeeData = await schemeEeeDataQuerySet.GetLatestProducerEeeData(producer.registrationNo);

                        if (producerEeeData != null &&
                            !producerEeeData.All(e => newObligationType.HasFlag(e.ObligationType)))
                        {
                            var eeeDataObligationTypes = producerEeeData
                                .Select(e => e.ObligationType)
                                .Distinct();

                            string eeeDataObligationTypeMessage = eeeDataObligationTypes.Count() == 1 ?
                                string.Format("{0} EEE data has", eeeDataObligationTypes.Single())
                                : "both B2B and B2C EEE data have";

                            var errorMessage =
                                string.Format("You are attempting to change the obligation type of {0} {1} from {2} to {3}. You cannot make this change because {4} already been submitted for this producer.",
                                producer.GetProducerName(),
                                producer.registrationNo,
                                existingProducerDetails.ObligationType,
                                newObligationType,
                                eeeDataObligationTypeMessage);

                            result = RuleResult.Fail(errorMessage, ErrorLevel.Error);
                        }
                        else
                        {
                            var warningMessage =
                                string.Format("You are changing the obligation type for {0} {1} from {2} to {3}.",
                                producer.GetProducerName(),
                                producer.registrationNo,
                                existingProducerDetails.ObligationType,
                                newObligationType);

                            result = RuleResult.Fail(warningMessage, ErrorLevel.Warning);
                        }
                    }
                }
            }

            return result;
        }
Beispiel #29
0
        public async Task <RuleResult> Evaluate(producerType producer)
        {
            var result = RuleResult.Pass();

            if (producer.status == statusType.A)
            {
                var existingProducerDetails =
                    producerQuerySet.GetLatestProducerForComplianceYearAndScheme(producer.registrationNo, complianceYear, organisationId);

                if (existingProducerDetails != null)
                {
                    var newObligationType = producer.obligationType.ToDomainObligationType();

                    if (existingProducerDetails.ObligationType != newObligationType)
                    {
                        var producerEeeData = await schemeEeeDataQuerySet.GetLatestProducerEeeData(producer.registrationNo);

                        if (producerEeeData != null &&
                            !producerEeeData.All(e => newObligationType.HasFlag(e.ObligationType)))
                        {
                            var eeeDataObligationTypes = producerEeeData
                                                         .Select(e => e.ObligationType)
                                                         .Distinct();

                            string eeeDataObligationTypeMessage = eeeDataObligationTypes.Count() == 1 ?
                                                                  string.Format("{0} EEE data has", eeeDataObligationTypes.Single())
                                : "both B2B and B2C EEE data have";

                            var errorMessage =
                                string.Format("You are attempting to change the obligation type of {0} {1} from {2} to {3}. You cannot make this change because {4} already been submitted for this producer.",
                                              producer.GetProducerName(),
                                              producer.registrationNo,
                                              existingProducerDetails.ObligationType,
                                              newObligationType,
                                              eeeDataObligationTypeMessage);

                            result = RuleResult.Fail(errorMessage, ErrorLevel.Error);
                        }
                        else
                        {
                            var warningMessage =
                                string.Format("You are changing the obligation type for {0} {1} from {2} to {3}.",
                                              producer.GetProducerName(),
                                              producer.registrationNo,
                                              existingProducerDetails.ObligationType,
                                              newObligationType);

                            result = RuleResult.Fail(warningMessage, ErrorLevel.Warning);
                        }
                    }
                }
            }

            return(result);
        }
        public ProducerCharge GetProducerChargeBand(schemeType scheme, producerType producer, MemberUpload upload, string name)
        {
            var calculator = chargeChargeBandCalculators.FirstOrDefault(c => c.IsMatch(scheme, producer, upload, name));

            if (calculator == null)
            {
                throw new ApplicationException(string.Format("No charge band calculator found for scheme {0} and producer {1}", scheme.approvalNo, producer.tradingName));
            }

            return(calculator.GetProducerChargeBand(scheme, producer, upload));
        }
Beispiel #31
0
        public void GetProducerName_ProducerBusinessIsNull_ReturnsTradingName()
        {
            const string tradingName = "some trading name";

            var producer = new producerType
            {
                tradingName = tradingName
            };

            Assert.Equal(tradingName, producer.GetProducerName());
        }
        public void GetProducerName_ProducerBusinessIsNull_ReturnsTradingName()
        {
            const string tradingName = "some trading name";

            var producer = new producerType
            {
                tradingName = tradingName
            };

            Assert.Equal(tradingName, producer.GetProducerName());
        }
        public void AuthorisedRepresentativeIsNotAValidBusinessType_ThrowsArgumentException()
        {
            var producer = new producerType
            {
                authorisedRepresentative =
                    new authorisedRepresentativeType { overseasProducer = new overseasProducerType() },
                producerBusiness = new producerBusinessType { Item = new object() }
            };

            Assert.Throws<ArgumentException>(() => Rule().Evaluate(producer));
        }
        public void InsertProducer_Or_ProducerHasNoRegistrationNumber_ValidationSucceeds(string prn, statusType status)
        {
            var producer = new producerType()
            {
                registrationNo = prn,
                status         = status
            };

            var result = Rule().Evaluate(producer);

            Assert.True(result.IsValid);
        }
        public void AnnualTurnoverMatchesWithBand_ShouldReturnValidResult(annualTurnoverBandType annualTurnoverBand, double annualTurnover)
        {
            var producer = new producerType
            {
                annualTurnover     = decimal.Parse(annualTurnover.ToString(CultureInfo.InvariantCulture)),
                annualTurnoverBand = annualTurnoverBand
            };

            var result = Rule().Evaluate(producer);

            Assert.True(result.IsValid);
        }
Beispiel #36
0
        public RuleResult Evaluate(producerType newProducer)
        {
            var result = RuleResult.Pass();

            if (newProducer.status == statusType.A &&
                newProducer.producerBusiness != null)
            {
                var newCompany = newProducer.producerBusiness.Item as companyType;
                if (newCompany != null)
                {
                    var existingProducer = producerQuerySet
                                           .GetLatestProducerFromPreviousComplianceYears(newProducer.registrationNo);

                    if (existingProducer != null &&
                        existingProducer.ProducerBusiness.CompanyDetails != null)
                    {
                        var existingCompanyNumberFormatted = CompanyRegistrationNumberFormatter
                                                             .FormatCompanyRegistrationNumber(existingProducer.ProducerBusiness.CompanyDetails.CompanyNumber);

                        if (!string.IsNullOrEmpty(existingCompanyNumberFormatted))
                        {
                            var newCompanyNumberFormatted = CompanyRegistrationNumberFormatter
                                                            .FormatCompanyRegistrationNumber(newCompany.companyNumber);

                            if (existingCompanyNumberFormatted != newCompanyNumberFormatted)
                            {
                                if (string.IsNullOrEmpty(newCompanyNumberFormatted))
                                {
                                    result = RuleResult.Fail(
                                        string.Format("The company registration number of {0} {1} which is currently {2} will be removed.",
                                                      existingProducer.OrganisationName,
                                                      existingProducer.RegisteredProducer.ProducerRegistrationNumber,
                                                      existingProducer.ProducerBusiness.CompanyDetails.CompanyNumber),
                                        ErrorLevel.Warning);
                                }
                                else
                                {
                                    result = RuleResult.Fail(
                                        string.Format("The company registration number of {0} {1} will change from {2} to {3}.",
                                                      existingProducer.OrganisationName,
                                                      existingProducer.RegisteredProducer.ProducerRegistrationNumber,
                                                      existingProducer.ProducerBusiness.CompanyDetails.CompanyNumber,
                                                      newCompany.companyNumber),
                                        ErrorLevel.Warning);
                                }
                            }
                        }
                    }
                }
            }

            return(result);
        }
        public void AnnualTurnoverMatchesWithBand_ShouldReturnValidResult(annualTurnoverBandType annualTurnoverBand, double annualTurnover)
        {
            var producer = new producerType
            {
                annualTurnover = decimal.Parse(annualTurnover.ToString(CultureInfo.InvariantCulture)),
                annualTurnoverBand = annualTurnoverBand
            };

            var result = Rule().Evaluate(producer);

            Assert.True(result.IsValid);
        }
        public void InsertProducer_Or_ProducerHasNoRegistrationNumber_ValidationSucceeds(string prn, statusType status)
        {
            var producer = new producerType()
            {
                registrationNo = prn,
                status = status
            };

            var result = Rule().Evaluate(producer);

            Assert.True(result.IsValid);
        }
        public RuleResult Evaluate(producerType newProducer)
        {
            var result = RuleResult.Pass();

            if (newProducer.status == statusType.A &&
                newProducer.producerBusiness != null)
            {
                var newCompany = newProducer.producerBusiness.Item as companyType;
                if (newCompany != null)
                {
                    var existingProducer = producerQuerySet
                        .GetLatestProducerFromPreviousComplianceYears(newProducer.registrationNo);

                    if (existingProducer != null &&
                        existingProducer.ProducerBusiness.CompanyDetails != null)
                    {
                        var existingCompanyNumberFormatted = CompanyRegistrationNumberFormatter
                            .FormatCompanyRegistrationNumber(existingProducer.ProducerBusiness.CompanyDetails.CompanyNumber);

                        if (!string.IsNullOrEmpty(existingCompanyNumberFormatted))
                        {
                            var newCompanyNumberFormatted = CompanyRegistrationNumberFormatter
                                .FormatCompanyRegistrationNumber(newCompany.companyNumber);

                            if (existingCompanyNumberFormatted != newCompanyNumberFormatted)
                            {
                                if (string.IsNullOrEmpty(newCompanyNumberFormatted))
                                {
                                    result = RuleResult.Fail(
                                        string.Format("The company registration number of {0} {1} which is currently {2} will be removed.",
                                        existingProducer.OrganisationName,
                                        existingProducer.RegisteredProducer.ProducerRegistrationNumber,
                                        existingProducer.ProducerBusiness.CompanyDetails.CompanyNumber),
                                        ErrorLevel.Warning);
                                }
                                else
                                {
                                    result = RuleResult.Fail(
                                        string.Format("The company registration number of {0} {1} will change from {2} to {3}.",
                                        existingProducer.OrganisationName,
                                        existingProducer.RegisteredProducer.ProducerRegistrationNumber,
                                        existingProducer.ProducerBusiness.CompanyDetails.CompanyNumber,
                                        newCompany.companyNumber),
                                        ErrorLevel.Warning);
                                }
                            }
                        }
                    }
                }
            }

            return result;
        }
        public RuleResult Evaluate(producerType producer)
        {
            if (producer.status == statusType.A && string.IsNullOrEmpty(producer.registrationNo))
            {
                return
                    (RuleResult.Fail(
                         string.Format(
                             "You have not provided a producer registration number (PRN) for {0} when attempting to amend existing producer details. To amend this producer add the PRN or to add as a brand new producer use status 'I' in the XML.",
                             producer.GetProducerName())));
            }

            return(RuleResult.Pass());
        }
        public ProducerCharge CalculateCharge(string schemeApprovalNumber, producerType producer, int complianceYear)
        {
            ProducerCharge producerCharge = GetProducerCharge(producer);

            if (producer.status == statusType.A)
            {
                decimal sumOfExistingCharges = dataAccess.FetchSumOfExistingCharges(schemeApprovalNumber, producer.registrationNo, complianceYear);

                producerCharge.Amount = Math.Max(0, producerCharge.ChargeBandAmount.Amount - sumOfExistingCharges);
            }

            return producerCharge;
        }
Beispiel #42
0
        public void Amendment_RegistrationNumberIsProdived_PassesValidation()
        {
            var producer = new producerType
            {
                tradingName    = "TestCompany",
                status         = statusType.A,
                registrationNo = "ABC12345"
            };

            var result = Rule().Evaluate(producer);

            Assert.True(result.IsValid);
        }
        public void Amendment_RegistrationNumberIsProdived_PassesValidation()
        {
            var producer = new producerType
            {
                tradingName = "TestCompany",
                status = statusType.A,
                registrationNo = "ABC12345"
            };

            var result = Rule().Evaluate(producer);

            Assert.True(result.IsValid);
        }
        public RuleResult Evaluate(producerType producer)
        {
            if (producer.status == statusType.I && !string.IsNullOrEmpty(producer.registrationNo))
            {
                return
                    RuleResult.Fail(
                        string.Format(
                            "You cannot add a producer registration number (PRN) for {0} when adding the producer for the first time. To add {0} as a new producer, remove the PRN - or if the producer already exists, amend its details using status 'A' not 'I'.",
                            producer.GetProducerName()));
            }

            return RuleResult.Pass();
        }
         public void Insert_RegistrationNumberIsNullOrEmpty_PassesValidation(string registrationNumber, string tradingName)
         {
             var producer = new producerType
             {
                 tradingName = tradingName,
                 status = statusType.I,
                 registrationNo = registrationNumber
             };

             var validationResult = Rule().Evaluate(producer);

             Assert.True(validationResult.IsValid);
         }
        public void NotAnAuthorisedRepresentativeButIsInNonUkCountry_PassesValidation()
        {
            const countryType SomeNonUkCountry = countryType.TURKEY;

            var producer = new producerType
            {
                authorisedRepresentative = new authorisedRepresentativeType { overseasProducer = null },
                producerBusiness = MakeProducerBusinessTypeInCountry(SomeNonUkCountry)
            };

            var validationResult = Rule().Evaluate(producer);

            Assert.True(validationResult.IsValid);
        }
        public void Evaluate_ProducerHasNoAuthorisedRepresentative_Passes()
        {
            // Arrange
            EnsureAnOverseasProducerIsNotBasedInTheUK rule = new EnsureAnOverseasProducerIsNotBasedInTheUK();

            producerType producer = new producerType();
            producer.authorisedRepresentative = null;

            // Act
            RuleResult result = rule.Evaluate(producer);

            // Assert
            Assert.Equal(true, result.IsValid);
        }
        public void AuthorisedRepresentativeOfficeCountryIsInUnitedKingdom_PassesValidation(countryType someUkCountry)
        {
            var producer = new producerType
            {
                authorisedRepresentative = new authorisedRepresentativeType
                {
                    overseasProducer = new overseasProducerType()
                },
                producerBusiness = MakeProducerBusinessTypeInCountry(someUkCountry)
            };

            var result = Rule().Evaluate(producer);

            Assert.True(result.IsValid);
        }
        public void Amendment_RegistrationNumberIsNullOrEmpty_FailsValidation_AndIncludesProducerNameInMessage_AndErrorLevelIsError(string registrationNumber, string tradingName)
        {
            var producer = new producerType
            {
                tradingName = tradingName,
                status = statusType.A,
                registrationNo = registrationNumber
            };

            var result = Rule().Evaluate(producer);

            Assert.False(result.IsValid);
            Assert.Contains(producer.GetProducerName(), result.Message);
            Assert.Equal(ErrorLevel.Error, result.ErrorLevel);
        }
        private ProducerCharge GetProducerCharge(producerType producer)
        {
            ChargeBand chargeBandType = producerChargeBandCalculator.GetProducerChargeBand(
                producer.annualTurnoverBand,
                producer.VATRegistered,
                producer.eeePlacedOnMarketBand);

            ChargeBandAmount currentChargeBandAmount =
                dataAccess.FetchCurrentChargeBandAmount(chargeBandType);

            return new ProducerCharge()
            {
                ChargeBandAmount = currentChargeBandAmount,
                Amount = currentChargeBandAmount.Amount
            };
        }
        public void ProducerHasMigratedPrnNumberThatDoesExist_ValidationSucceeds()
        {
            const string prn = "ABC12345";

            A.CallTo(() => migratedProducerQuerySet.GetAllRegistrationNumbers())
                .Returns(new List<string> { prn });

            var producer = new producerType()
            {
                registrationNo = prn,
                status = statusType.A
            };

            var result = Rule().Evaluate(producer);

            Assert.True(result.IsValid);
        }
        public RuleResult Evaluate(producerType producer)
        {
            if (producer.authorisedRepresentative == null)
            {
                return RuleResult.Pass();
            }

            if (producer.authorisedRepresentative.overseasProducer == null)
            {
                return RuleResult.Pass();
            }

            var producerBusinessItem = producer.producerBusiness.Item;
            contactDetailsContainerType officeContactDetails;

            if (producerBusinessItem is companyType)
            {
                officeContactDetails = ((companyType)producerBusinessItem).registeredOffice;
            }
            else if (producerBusinessItem is partnershipType)
            {
                officeContactDetails =
                    ((partnershipType)producerBusinessItem).principalPlaceOfBusiness;
            }
            else
            {
                throw new ArgumentException(
                    string.Format("{0}: producerBusinessItem must be of type companyType or partnershipType",
                        producer.tradingName));
            }

            // abusing law of demeter here, but schema requires all these fields to be present and correct
            if (!ukCountries.Contains(officeContactDetails.contactDetails.address.country))
            {
                return
                    RuleResult.Fail(
                        string.Format(
                            "You have entered {0} {1} as an authorised representative with a non-UK address. Authorised representatives must be based in the UK. Review your file.",
                            producer.GetProducerName(), producer.registrationNo));
            }
            else
            {
                return RuleResult.Pass();
            }
        }
        public void Insert_RegistrationNumberIsNotNullOrEmpty_FailsValidation_AndIncludesProducerNameInMessage_AndErrorLevelIsError()
        {
            const string validRegistrationNumber = "ABC12345";
            const string validTradingName = "MyCompany";

            var producer = new producerType
            {
                tradingName = validTradingName,
                status = statusType.I,
                registrationNo = validRegistrationNumber
            };

            var result = Rule().Evaluate(producer);

            Assert.False(result.IsValid);
            Assert.Contains(producer.GetProducerName(), result.Message);
            Assert.Equal(ErrorLevel.Error, result.ErrorLevel);
        }
        public void GetProducerName_ProducerIsCompanyTypeAndNameExists_ReturnsCompanyName()
        {
            const string companyName = "some company name";

            var producer = new producerType
            {
                tradingName = "some trading name",
                producerBusiness = new producerBusinessType
                {
                    Item = new companyType
                    {
                        companyName = companyName
                    }
                }
            };

            Assert.Equal(companyName, producer.GetProducerName());
        }
        public void GetProducerName_ProducerIsCompanyTypeButNameIsNull_ReturnsTradingName()
        {
            const string tradingName = "some trading name";

            var producer = new producerType
            {
                tradingName = tradingName,
                producerBusiness = new producerBusinessType
                {
                    Item = new companyType
                    {
                        companyName = null
                    }
                }
            };

            Assert.Equal(tradingName, producer.GetProducerName());
        }
        public RuleResult Evaluate(producerType element)
        {
            var result = RuleResult.Pass();

            if (element.status == statusType.I &&
                element.producerBusiness != null)
            {
                var company = element.producerBusiness.Item as companyType;
                if (company != null)
                {
                    var companyNumber = CompanyRegistrationNumberFormatter
                        .FormatCompanyRegistrationNumber(company.companyNumber);

                    if (!string.IsNullOrEmpty(companyNumber) &&
                        (producerQuerySet.GetLatestCompanyProducers().Any(p =>
                            {
                                var existingCompanyRegistrationNumber = CompanyRegistrationNumberFormatter
                                .FormatCompanyRegistrationNumber(p.ProducerBusiness.CompanyDetails.CompanyNumber);

                                return !string.IsNullOrEmpty(existingCompanyRegistrationNumber) &&
                                    existingCompanyRegistrationNumber == companyNumber;
                            })
                         ||
                         migratedProducerQuerySet.GetAllMigratedProducers().Any(m =>
                             {
                                 var migratedProducerCompanyNumber = CompanyRegistrationNumberFormatter
                                 .FormatCompanyRegistrationNumber(m.CompanyNumber);

                                 return !string.IsNullOrEmpty(migratedProducerCompanyNumber) &&
                                     migratedProducerCompanyNumber == companyNumber;
                             })))
                    {
                        result = RuleResult.Fail(
                            string.Format(@"We have previously issued a producer registration number (PRN) to {0} with company registration number (CRN) {1}. To register this producer, provide its existing PRN and use the status 'A' in the XML file.",
                                element.GetProducerName(), company.companyNumber),
                            Core.Shared.ErrorLevel.Error);
                    }
                }
            }

            return result;
        }
        public RuleResult Evaluate(producerType producer)
        {
            if (producer.status == statusType.A && !string.IsNullOrEmpty(producer.registrationNo))
            {
                var validRegistrationNumbers = producerQuerySet.GetAllRegistrationNumbers()
                    .Union(migratedProducerQuerySet.GetAllRegistrationNumbers())
                    .Select(prn => prn.ToLowerInvariant());

                if (!validRegistrationNumbers.Contains(producer.registrationNo.ToLowerInvariant()))
                {
                    return
                        RuleResult.Fail(
                            string.Format(
                                "We cannot recognise the producer registration number (PRN) you have entered for {0} {1}. Enter the correct PRN for this producer.",
                                producer.GetProducerName(), producer.registrationNo));
                }
            }

            return RuleResult.Pass();
        }
            ProducerAlreadyRegisteredForSameComplianceYearAndObligationType_ValidationFails_AndMessageIncludesPrnAndObligationType_AndErrorLevelIsError
            (obligationTypeType existingObligationType, obligationTypeType xmlObligationType)
        {
            var schemeId = Guid.NewGuid();

            A.CallTo(() => producerQuerySet.GetProducerForOtherSchemeAndObligationType(A<string>._, A<string>._, schemeId, A<ObligationType>._))
                .Returns(FakeProducer.Create(existingObligationType.ToDomainObligationType(), "ABC12345"));

            const string complianceYear = "2016";
            const string registrationNumber = "ABC12345";

            var producer = new producerType()
            {
                tradingName = "Test Trader",
                obligationType = xmlObligationType,
                registrationNo = registrationNumber,
                status = statusType.A,
                producerBusiness = new producerBusinessType
                {
                    Item = new partnershipType
                    {
                        partnershipName = "New Producer Name"
                    }
                }
            };

            schemeType scheme = new schemeType()
            {
                complianceYear = complianceYear,
                producerList = new[]
                    {
                       producer
                    }
            };
            var result = Rule().Evaluate(scheme, producer, schemeId);

            Assert.False(result.IsValid);
            Assert.Contains(registrationNumber, result.Message);
            Assert.Contains(existingObligationType.ToDomainObligationType().ToString(), result.Message);
            Assert.Equal(Core.Shared.ErrorLevel.Error, result.ErrorLevel);
        }
        public RuleResult Evaluate(schemeType scheme, producerType producer, Guid organisationId)
        {
            if (producer.status == statusType.A)
            {
                string existingProducerName = string.Empty;

                var existingProducer =
                    producerQuerySet.GetLatestProducerForComplianceYearAndScheme(producer.registrationNo,
                        scheme.complianceYear, organisationId) ??
                    producerQuerySet.GetLatestProducerFromPreviousComplianceYears(producer.registrationNo);

                if (existingProducer != null)
                {
                    existingProducerName = existingProducer.OrganisationName;
                }
                else
                {
                    var existingMigratedProducer = migratedProducerQuerySet.GetMigratedProducer(producer.registrationNo);

                    if (existingMigratedProducer == null)
                    {
                        // Producer doesn't exist so no warning
                        return RuleResult.Pass();
                    }

                    existingProducerName = existingMigratedProducer.ProducerName;
                }

                if (existingProducerName != producer.GetProducerName())
                {
                    var errorMessage = string.Format("The producer name of {0} {1} will change from {0} to {2}.",
                        existingProducerName, producer.registrationNo, producer.GetProducerName());

                    return RuleResult.Fail(errorMessage, Core.Shared.ErrorLevel.Warning);
                }
            }

            return RuleResult.Pass();
        }