Esempio n. 1
0
        public async Task <Tuple <SmScenario, List <SmProduct> > > GetScenarioData(IMarkdownFunctionSettings settings, int partitionId, IEnumerable <int> specificProductIds = null)
        {
            var isOptional = partitionId > 1;

            // Scenario
            var scenarioPath = SmS3Path.ScenarioPath(SmS3PathName.Scenario, settings);
            var scenario     = await _s3Repository.ReadRecord <Scenario>(scenarioPath);

            var sellThroughPath = SmS3Path.ScenarioPath(SmS3PathName.HierarchySellThrough, settings);
            var sellThrough     = await _s3Repository.ReadRecords <HierarchySellThrough>(sellThroughPath);

            if (!sellThrough.Any())
            {
                _logger.Warning("No sell through targets in partition");
            }

            var priceLadderValuePath = SmS3Path.ScenarioPath(SmS3PathName.PriceLadderValue, settings);
            var priceLadderValue     = await _s3Repository.ReadRecords <PriceLadderValue>(priceLadderValuePath);

            if (!priceLadderValue.Any())
            {
                _logger.Error("No price ladder values in partition");
            }

            // Product
            var productPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.Product, settings);
            var product     = await _s3Repository.ReadRecords <Product>(productPath, isOptional);

            if (specificProductIds != null)
            {
                product = product.Where(x => specificProductIds.Contains(x.ProductId)).ToList();
            }
            if (!product.Any())
            {
                _logger.Error("No products in partition");
            }

            var productHierarchyPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.ProductHierarchy, settings);
            var productHierarchy     = await _s3Repository.ReadRecords <ProductHierarchy>(productHierarchyPath, isOptional);

            if (!productHierarchy.Any())
            {
                _logger.Error("No product hierarchies in partition");
            }

            var productPriceLadderPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.ProductPriceLadder, settings);
            var productPriceLadder     = await _s3Repository.ReadRecords <ProductPriceLadder>(productPriceLadderPath, isOptional);

            if (!productPriceLadder.Any())
            {
                _logger.Error("No product price ladders in partition");
            }

            var productSalesTaxPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.ProductSalesTax, settings);
            var productSalesTax     = await _s3Repository.ReadRecords <ProductSalesTax>(productSalesTaxPath, isOptional);

            if (!productSalesTax.Any())
            {
                _logger.Warning("No product sales tax in partition");
            }

            var productParameterValuesPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.ProductParameterValues, settings);
            var productParameterValues     = await _s3Repository.ReadRecords <ProductParameterValues>(productParameterValuesPath, isOptional);

            if (!productParameterValues.Any())
            {
                _logger.Warning("No product parameter values in partition");
            }

            var productMarkdownConstraintPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.ProductMarkdownConstraint, settings);
            var productMarkdownConstraint     = await _s3Repository.ReadRecords <ProductMarkdownConstraint>(productMarkdownConstraintPath, true);

            if (!productMarkdownConstraint.Any())
            {
                _logger.Warning("No product markdown constraint values in partition");
            }

            var salesFlexFactorPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.SalesFlexFactor, settings);
            var salesFlexFactor     = await _s3Repository.ReadRecords <ProductSalesFlexFactor>(salesFlexFactorPath, isOptional);

            if (!salesFlexFactor.Any())
            {
                _logger.Warning("No sales flex factor values in partition");
            }

            var productMinimumAbsolutePriceChangePath = SmS3Path.ScenarioPartitionPath(SmS3PathName.ProductMinimumAbsolutePriceChange, settings);
            var productMinimumAbsolutePriceChange     = await _s3Repository.ReadRecords <ProductMinimumAbsolutePriceChange>(productMinimumAbsolutePriceChangePath, true);

            if (!productMinimumAbsolutePriceChange.Any())
            {
                _logger.Warning("No product minimum absolute price change values in partition");
            }

            var productWeekParameterValuesPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.ProductWeekParameterValues, settings);
            var productWeekParameterValues     = await _s3Repository.ReadRecords <ProductWeekParameterValues>(productWeekParameterValuesPath, true);

            if (!productWeekParameterValues.Any())
            {
                _logger.Warning("No product week parameter values in partition");
            }

            var productWeekMarkdownTypeParameterValuesPath = SmS3Path.ScenarioPartitionPath(SmS3PathName.ProductWeekMarkdownTypeParameterValues, settings);
            var productWeekMarkdownTypeParameterValues     = await _s3Repository.ReadRecords <ProductWeekMarkdownTypeParameterValues>(productWeekMarkdownTypeParameterValuesPath, true);

            if (!productWeekMarkdownTypeParameterValues.Any())
            {
                _logger.Warning("No product week parameter values in partition");
            }

            // Sell through lookup
            var sellThroughLookup = sellThrough.Any() ? sellThrough.ToDictionary(x => x.HierarchyId, x => x.Value) : new Dictionary <int, decimal>();

            // Sales tax lookup
            var productSalesTaxLookup =
                productSalesTax.Any()
                    ? productSalesTax.ToDictionary(x => x.ProductId, x => Tuple.Create(x.Week, x.Rate))
                    : new Dictionary <int, Tuple <int, decimal> >();

            var products = SmProduct.Build(_logger, product, productHierarchy, productPriceLadder, priceLadderValue,
                                           sellThroughLookup, productSalesTaxLookup, productParameterValues, productMarkdownConstraint, salesFlexFactor, productMinimumAbsolutePriceChange, productWeekParameterValues, productWeekMarkdownTypeParameterValues);

            return(Tuple.Create(SmScenario.Build(scenario), products));
        }