예제 #1
0
        public void RenameCalculation(string oldName,
                                      string newName,
                                      string fundingStreamId,
                                      CalculationNamespace calculationNamespace,
                                      string originalSource,
                                      string expectedSource)
        {
            Calculation calculation = new Calculation
            {
                FundingStreamId = fundingStreamId,
                Current         = new CalculationVersion
                {
                    SourceCode = originalSource,
                    Namespace  = calculationNamespace
                }
            };

            string actualSource = new CalculationCodeReferenceUpdate()
                                  .ReplaceSourceCodeReferences(calculation.Current.SourceCode, oldName, newName, calculation.Namespace);

            actualSource
            .Should()
            .Be(expectedSource);
        }
        public CalculationBuilder WithCalculationNamespaceType(CalculationNamespace namespaceType)
        {
            _namespace = namespaceType;

            return this;
        }
        public FundingLineCalculationBuilder WithCalculationNamespaceType(CalculationNamespace namespaceType)
        {
            _namespace = namespaceType;

            return(this);
        }
예제 #4
0
        public async Task <CreateCalculationResponse> CreateCalculation(string specificationId,
                                                                        CalculationCreateModel model,
                                                                        CalculationNamespace calculationNamespace,
                                                                        CalculationType calculationType,
                                                                        Reference author,
                                                                        string correlationId,
                                                                        CalculationDataType calculationDataType = CalculationDataType.Decimal,
                                                                        bool initiateCalcRun = true,
                                                                        IEnumerable <string> allowedEnumTypeValues = null)
        {
            Guard.ArgumentNotNull(model, nameof(model));
            Guard.ArgumentNotNull(author, nameof(author));

            if (string.IsNullOrWhiteSpace(model.Id))
            {
                model.Id = Guid.NewGuid().ToString();
            }

            model.SpecificationId = specificationId;
            model.CalculationType = calculationType;

            ValidationResult validationResult = await _calculationCreateModelValidator.ValidateAsync(model);

            if (!validationResult.IsValid)
            {
                return(new CreateCalculationResponse
                {
                    ValidationResult = validationResult,
                    ErrorType = CreateCalculationErrorType.InvalidRequest
                });
            }

            Calculation calculation = new Calculation
            {
                Id = model.Id,
                FundingStreamId = model.FundingStreamId,
                SpecificationId = model.SpecificationId
            };

            CalculationVersion calculationVersion = new CalculationVersion
            {
                CalculationId          = calculation.Id,
                PublishStatus          = PublishStatus.Draft,
                Author                 = author,
                Date                   = DateTimeOffset.Now.ToLocalTime(),
                Version                = 1,
                SourceCode             = model.SourceCode,
                Description            = model.Description,
                ValueType              = model.ValueType.Value,
                CalculationType        = calculationType,
                WasTemplateCalculation = false,
                Namespace              = calculationNamespace,
                Name                   = model.Name,
                DataType               = calculationDataType,
                AllowedEnumTypeValues  = allowedEnumTypeValues != null ? new List <string>(allowedEnumTypeValues) : Enumerable.Empty <string>()
            };

            calculation.Current = calculationVersion;

            bool?nameValidResult = await _calculationNameInUseCheck.IsCalculationNameInUse(calculation.SpecificationId, calculation.Name, null);

            if (nameValidResult == true)
            {
                string error =
                    $"Calculation with the same generated source code name already exists in this specification. Calculation Name {calculation.Name} and Specification {calculation.SpecificationId}";

                _logger.Error(error);

                return(new CreateCalculationResponse
                {
                    ErrorMessage = error,
                    ErrorType = CreateCalculationErrorType.InvalidRequest
                });
            }

            calculation.Current.SourceCodeName = _typeIdentifierGenerator.GenerateIdentifier(calculation.Name);

            HttpStatusCode result = await _calculationRepositoryPolicy.ExecuteAsync(() => _calculationsRepository.CreateDraftCalculation(calculation));

            if (result.IsSuccess())
            {
                await _calculationVersionsRepositoryPolicy.ExecuteAsync(() => _calculationVersionRepository.SaveVersion(calculationVersion));

                await UpdateSearch(calculation, model.SpecificationName, model.FundingStreamName);

                string cacheKey = $"{CacheKeys.CalculationsMetadataForSpecification}{specificationId}";

                await _cachePolicy.ExecuteAsync(() => _cacheProvider.RemoveAsync <List <CalculationMetadata> >(cacheKey));

                if (!initiateCalcRun)
                {
                    return(new CreateCalculationResponse
                    {
                        Succeeded = true,
                        Calculation = calculation
                    });
                }

                try
                {
                    Job job = await SendInstructAllocationsToJobService(calculation.SpecificationId, author.Id, author.Name, new Trigger
                    {
                        EntityId   = calculation.Id,
                        EntityType = nameof(Calculation),
                        Message    = $"Saving calculation: '{calculation.Id}' for specification: '{calculation.SpecificationId}'"
                    }, correlationId);

                    if (job != null)
                    {
                        _logger.Information($"New job of type '{JobConstants.DefinitionNames.CreateInstructAllocationJob}' created with id: '{job.Id}'");

                        return(new CreateCalculationResponse
                        {
                            Succeeded = true,
                            Calculation = calculation
                        });
                    }
                    else
                    {
                        string errorMessage = $"Failed to create job of type '{JobConstants.DefinitionNames.CreateInstructAllocationJob}' on specification '{calculation.SpecificationId}'";

                        _logger.Error(errorMessage);

                        return(new CreateCalculationResponse
                        {
                            ErrorType = CreateCalculationErrorType.Exception,
                            ErrorMessage = errorMessage
                        });
                    }
                }
                catch (Exception ex)
                {
                    return(new CreateCalculationResponse
                    {
                        ErrorMessage = ex.Message,
                        ErrorType = CreateCalculationErrorType.Exception
                    });
                }
            }
            else
            {
                string errorMessage = $"There was problem creating a new calculation with name {calculation.Name} in Cosmos Db with status code {(int)result}";

                _logger.Error(errorMessage);

                return(new CreateCalculationResponse
                {
                    ErrorMessage = errorMessage,
                    ErrorType = CreateCalculationErrorType.Exception
                });
            }
        }