public void SetUp()
        {
            Moqer = new AutoMoqer();
            LevySchemeDeclaration = new LevySchemeDeclarationUpdatedMessage
            {
                SubmissionId        = 443,
                AccountId           = 123456,
                PayrollMonth        = 1,
                PayrollYear         = "18-19",
                LevyDeclaredInMonth = 10000,
                EmpRef      = "abcdef",
                CreatedDate = DateTime.Now
            };

            var payrollDateService = Moqer.GetMock <IPayrollDateService>();

            payrollDateService
            .Setup(x => x.GetPayrollDate(LevySchemeDeclaration.PayrollYear, (byte)LevySchemeDeclaration.PayrollMonth))
            .Returns(DateTime.UtcNow);

            var repo = Moqer.GetMock <ILevyDeclarationRepository>();

            repo.Setup(x => x.Get(It.Is <LevyDeclarationModel>(c => c.SubmissionId.Equals(LevySchemeDeclaration.SubmissionId))))
            .ReturnsAsync(new LevyDeclaration(payrollDateService.Object, new LevyDeclarationModel()));
        }
Exemplo n.º 2
0
        public static async Task <GenerateAccountProjectionCommand> Run(
            [QueueTrigger(QueueNames.AllowProjection)] LevySchemeDeclarationUpdatedMessage message,
            TraceWriter writer, ExecutionContext executionContext)
        {
            return(await FunctionRunner.Run <LevyDeclarationAllowProjectionFunction, GenerateAccountProjectionCommand>(writer, executionContext,
                                                                                                                       async (container, logger) =>
            {
                logger.Debug("Getting levy declaration handler from container.");
                var handler = container.GetInstance <AllowAccountProjectionsHandler>();
                if (handler == null)
                {
                    throw new InvalidOperationException("Faild to get levy handler from container.");
                }
                var allowProjections = await handler.Allow(message);
                if (!allowProjections)
                {
                    logger.Debug($"Cannot generate the projections, still handling levy declarations. Employer: {message.AccountId}");
                    return null;
                }

                logger.Info($"Now sending message to trigger the account projections for employer '{message.AccountId}'");
                return new GenerateAccountProjectionCommand
                {
                    EmployerAccountId = message.AccountId,
                    ProjectionSource = ProjectionSource.LevyDeclaration
                };
            }));
        }
 public static async Task <LevySchemeDeclarationUpdatedMessage> Run(
     [ServiceBusTrigger("LevyPeriod", "mysubscription", AccessRights.Manage)] LevySchemeDeclarationUpdatedMessage levySchemeUpdatedMessage,
     TraceWriter writer)
 {
     return(await FunctionRunner.Run <LevyDeclarationEventValidatorFunction, LevySchemeDeclarationUpdatedMessage>(writer,
                                                                                                                  async (container, logger) =>
     {
         logger.Info($"Added {nameof(LevySchemeDeclarationUpdatedMessage)} to queue: {QueueNames.ValidateDeclaration},  for EmployerAccountId: {levySchemeUpdatedMessage?.AccountId}");
         return await Task.FromResult(levySchemeUpdatedMessage);
     }));
 }
Exemplo n.º 4
0
        public async Task Handle(LevySchemeDeclarationUpdatedMessage levySchemeDeclaration)
        {
            _logger.Debug($"Now generating account projections for id: {levySchemeDeclaration.AccountId} in response to Levy event.");
            var accountProjections = await _accountProjectionRepository.InitialiseProjection(levySchemeDeclaration.AccountId);

            accountProjections.BuildLevyTriggeredProjections(DateTime.Today, _applicationConfiguration.NumberOfMonthsToProject);
            foreach (var accountProjectionReadModel in accountProjections.Projections)
            {
                _logger.Debug($"Generated projection: {accountProjectionReadModel.ToJson()}");
            }
            await _accountProjectionRepository.Store(accountProjections);

            _logger.Info($"Finished generating account projections for account: {levySchemeDeclaration.AccountId}.");
        }
 public void SetUp()
 {
     Moqer = new AutoMoqer();
     LevySchemeDeclarationUpdatedMessage = new LevySchemeDeclarationUpdatedMessage
     {
         SubmissionId        = 123,
         LevyDeclaredInMonth = 1000,
         AccountId           = 123456,
         PayrollYear         = "18/19",
         PayrollMonth        = 1,
         EmpRef      = "ABCD",
         CreatedDate = DateTime.Today
     };
 }
        private static LevyDeclarationModel MapLevySchemeDeclarationUpdatedMessageToLevyDeclarationModel(
            LevySchemeDeclarationUpdatedMessage levySchemeDeclaration)
        {
            var declaration = new LevyDeclarationModel
            {
                EmployerAccountId  = levySchemeDeclaration.AccountId,
                TransactionDate    = levySchemeDeclaration.CreatedDate,
                LevyAmountDeclared = levySchemeDeclaration.LevyDeclaredInMonth,
                SubmissionId       = levySchemeDeclaration.SubmissionId,
                PayrollMonth       = (byte)levySchemeDeclaration.PayrollMonth,
                PayrollYear        = levySchemeDeclaration.PayrollYear,
                Scheme             = levySchemeDeclaration.EmpRef
            };

            return(declaration);
        }
Exemplo n.º 7
0
 public static async Task Run(
     [QueueTrigger(QueueNames.StoreLevyDeclarationNoProjection)] LevySchemeDeclarationUpdatedMessage levySchemeUpdatedMessage, ExecutionContext executionContext,
     TraceWriter writer)
 {
     await FunctionRunner.Run <LevyDeclarationEventNoProjectionStoreFunction>(writer, executionContext,
                                                                              async (container, logger) =>
     {
         logger.Debug("Getting levy declaration handler from container.");
         var handler = container.GetInstance <StoreLevyDeclarationHandler>();
         if (handler == null)
         {
             throw new InvalidOperationException($"Failed to get levy handler from container.");
         }
         await handler.Handle(levySchemeUpdatedMessage, string.Empty);
         logger.Info($"Finished handling past levy declaration for EmployerAccountId: {levySchemeUpdatedMessage.AccountId}, PayrollYear: {levySchemeUpdatedMessage.PayrollYear}, month: {levySchemeUpdatedMessage.PayrollMonth}, scheme: {levySchemeUpdatedMessage.EmpRef}");
     });
 }
Exemplo n.º 8
0
        public static LevySchemeDeclarationUpdatedMessage Run(
            [QueueTrigger(QueueNames.ValidateLevyDeclarationNoProjection)] LevySchemeDeclarationUpdatedMessage message,
            TraceWriter writer, ExecutionContext executionContext)
        {
            return(FunctionRunner.Run <LevyDeclarationEventNoProjectionValidatorFunction, LevySchemeDeclarationUpdatedMessage>(writer, executionContext,
                                                                                                                               (container, logger) =>
            {
                var validationResults = container.GetInstance <LevyDeclarationEventValidator>()
                                        .Validate(message);
                if (!validationResults.IsValid)
                {
                    logger.Warn($"Past levy declaration event failed superficial validation. Employer id: {message.AccountId}, Period: {message.PayrollMonth}, {message.PayrollYear}, Scheme: {message.EmpRef}.");
                    return null;
                }

                logger.Info($"Validated {nameof(LevySchemeDeclarationUpdatedMessage)} for EmployerAccountId: {message.AccountId}");
                return message;
            }));
        }
Exemplo n.º 9
0
        public async Task <bool> Allow(LevySchemeDeclarationUpdatedMessage levySchemeDeclaration)
        {
            Logger.Debug($"Now checking if projections can be generated for levy declaration events: {levySchemeDeclaration.ToDebugJson()}");
            if (levySchemeDeclaration.PayrollMonth == null)
            {
                throw new InvalidOperationException($"Received invalid levy declaration. No month specified. Data: ");
            }
            if (!ApplicationConfiguration.AllowTriggerProjections)
            {
                Logger.Warn("Triggering of projections is disabled.");
                return(false);
            }


            var levyPeriod = await Repository.Get(levySchemeDeclaration.AccountId, levySchemeDeclaration.PayrollYear,
                                                  levySchemeDeclaration.PayrollMonth.Value);

            var lastReceivedTime = levyPeriod.GetLastTimeReceivedLevy();

            if (lastReceivedTime == null)
            {
                Logger.Warn($"No levy recorded for employer: {levySchemeDeclaration.AccountId}, period: {levySchemeDeclaration.PayrollYear}, {levySchemeDeclaration.PayrollMonth.Value}");
                return(false);
            }

            var allowProjections = lastReceivedTime.Value.AddSeconds(ApplicationConfiguration.SecondsToWaitToAllowProjections) <= DateTime.UtcNow;

            Logger.Info($"Allow projections '{allowProjections}' for employer '{levySchemeDeclaration.AccountId}' in response to levy event.");

            if (!allowProjections)
            {
                return(false);
            }

            if (!await AuditService.RecordRunOfProjections(levySchemeDeclaration.AccountId, nameof(ProjectionSource.LevyDeclaration)))
            {
                Logger.Debug($"Triggering of levy projections for employer {levySchemeDeclaration.AccountId} has already been started.");
                return(false);
            }

            return(true);
        }
        public async Task Handle(LevySchemeDeclarationUpdatedMessage levySchemeDeclaration, string allowProjectionsEndpoint)
        {
            Logger.Debug($"Now handling the levy declaration event: {levySchemeDeclaration.AccountId}, {levySchemeDeclaration.EmpRef}");
            if (levySchemeDeclaration.PayrollMonth == null)
            {
                throw new InvalidOperationException($"Received invalid levy declaration. No month specified. Data: ");
            }

            var declaration = MapLevySchemeDeclarationUpdatedMessageToLevyDeclarationModel(levySchemeDeclaration);

            var levyDeclaration = await Repository.Get(declaration);

            Logger.Debug("Now adding levy declaration to levy period.");
            levyDeclaration.RegisterLevyDeclaration(levySchemeDeclaration.LevyDeclaredInMonth, levySchemeDeclaration.CreatedDate);
            Logger.Debug($"Now storing the levy period. Employer: {levySchemeDeclaration.AccountId}, year: {levySchemeDeclaration.PayrollYear}, month: {levySchemeDeclaration.PayrollMonth}");
            await Repository.Store(levyDeclaration);

            Logger.Info($"Finished adding the levy declaration to the levy period. Levy declaration: {levyDeclaration.Id}");

            if (!string.IsNullOrWhiteSpace(allowProjectionsEndpoint))
            {
                _queueService.SendMessageWithVisibilityDelay(levySchemeDeclaration, allowProjectionsEndpoint);
            }
        }