private async Task <List <ArrangementRequest> > AddAbstractProduct(OfferApplication application, BundledProductInfo bundleInfo, int numberOfInstances) { // If abstract product contains product which is singleton and is already added earlier before, // it will be skipped but not some other product will be added instead of it in order to fulfill number of instances // Get product data var productData = await _productService.GetProductData(bundleInfo.ProductCode, "documentation", application.CustomerNumber); if (productData.Kind != ProductKinds.AbstractProduct) { return(null); } var response = new List <ArrangementRequest>(); var variants = productData.Variants?.Split(",") ?? new string[0]; var instancesToCreate = Math.Min(numberOfInstances, variants.Count()); var parameters = new ArrangementRequestInitializationParameters { IsAbstractOrigin = true }; int i; for (i = 0; i < instancesToCreate; i++) { var resolved = await AddBundleComponentToApplication(application, variants[i], bundleInfo, bundleInfo.ProductCode, parameters); if (resolved != null) { response.AddRange(resolved); } } if (variants.Count() > i) { for (; i < variants.Count(); i++) { var resolved = await AddBundleComponentToApplication(application, variants[i], bundleInfo, bundleInfo.ProductCode, parameters); if (resolved != null) { foreach (var item in resolved) { item.Enabled = false; } } if (resolved != null) { response.AddRange(resolved); } } } return(response); }
public async Task <List <ArrangementRequest> > AddBundleComponentToApplication(OfferApplication application, string productCode, BundledProductInfo bundleInfo, string parentProductCode, ArrangementRequestInitializationParameters parameters = null) { application.ArrangementRequests = application.ArrangementRequests ?? new List <ArrangementRequest>(); // Get product data ProductSnapshot productData; try { productData = await _productService.GetProductData(productCode, "documentation", application.CustomerNumber); } catch { productData = null; } if (!ShouldAddProduct(application, productData)) { _logger.LogInformation("Bundled product not added because it doesn't satisfies all conditions"); return(null); } if (bundleInfo.ProductKind != ProductKinds.AbstractProduct && productData.Kind != bundleInfo.ProductKind) { var e = new Exception("Product Kinds on Bundle Info and on Product Data are different."); _logger.LogError(e, "Error occurred while adding bundle component " + bundleInfo.ProductCode + " from parent product " + parentProductCode + " to application"); throw e; } var response = new List <ArrangementRequest>(); // Bootstrap arr request var arrangementRequest = await BootstrapArrangementRequest(parameters, productData, application); arrangementRequest.ProductName = arrangementRequest.IsAbstractOrigin ? arrangementRequest.ProductName : (bundleInfo.ProductName ?? arrangementRequest.ProductName); arrangementRequest.ParentProductCode = parentProductCode; arrangementRequest.BundleInfo = bundleInfo; arrangementRequest.ProductCode = productData.ProductCode; application.ArrangementRequests.Add(arrangementRequest); arrangementRequest.IsOptional = IsOptional(bundleInfo); response.Add(arrangementRequest); // Resolve bundle if (!(arrangementRequest is AbstractArrangementRequest)) { // TODO Reconsider snapshoting unresolved nested bundles instead of ignoring them (how they wil be solved afterwards?) var resolveNestedBundles = (await _configurationService.GetEffective("offer/bundled-products/resolve-nested", "false")) .Equals("true"); if (resolveNestedBundles) { var resolved = await ResolveBundleComponents(application, productData); if (resolved != null) { response.AddRange(resolved); } } } PerformCalculation(application, arrangementRequest); return(response); }
public bool IsOptional(BundledProductInfo bundledProductInfo) { return(bundledProductInfo == null || bundledProductInfo.MinimalNumberOfInstances == 0); }