public void ensureTableEntryIsntEqualToNull()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());

            Assert.False(instance.Equals(null));
        }
コード例 #2
0
        /// <summary>
        /// Calculates the price of all child customized products of a given customized product
        /// </summary>
        /// <param name="customizedProduct">Parent Customized Product</param>
        /// <param name="fetchCustomizedProductPrice">Information about currency/area conversion</param>
        /// <param name="materialPriceTableRepository">MaterialPriceTableRepository instance to fetch current material prices</param>
        /// <param name="finishPriceTableRepository">FinishPriceTableRepository instance to fetch current finish prices</param>
        /// <param name="clientFactory">Injected HTTP Client Factory</param>
        /// <returns>IEnumerable containing the prices of all child customized products</returns>
        private static async Task <IEnumerable <CustomizedProductPriceModelView> > calculatePricesOfChildCustomizedProducts(List <CustomizedProductPriceModelView> childCustomizedProductPrices, CustomizedProduct customizedProduct, FetchCustomizedProductPriceModelView fetchCustomizedProductPrice,
                                                                                                                            MaterialPriceTableRepository materialPriceTableRepository, FinishPriceTableRepository finishPriceTableRepository, IHttpClientFactory clientFactory)
        {
            foreach (Slot slot in customizedProduct.slots)
            {
                foreach (CustomizedProduct childCustomizedProduct in slot.customizedProducts)
                {
                    MaterialPriceTableEntry materialPriceTableEntry =
                        getCurrentMaterialPrice(materialPriceTableRepository, childCustomizedProduct.customizedMaterial.material.Id);

                    FinishPriceTableEntry finishPriceTableEntry = null;

                    if (childCustomizedProduct.customizedMaterial.finish != null)
                    {
                        finishPriceTableEntry = getCurrentFinishPrice(finishPriceTableRepository,
                                                                      childCustomizedProduct.customizedMaterial.material.Finishes.Where(f => f.Equals(childCustomizedProduct.customizedMaterial.finish)).SingleOrDefault().Id);
                    }

                    CustomizedProductPriceModelView childCustomizedProductPriceModelView =
                        await buildCustomizedProductPriceModelView(childCustomizedProduct, fetchCustomizedProductPrice,
                                                                   materialPriceTableEntry, finishPriceTableEntry, clientFactory);

                    childCustomizedProductPrices.Add(childCustomizedProductPriceModelView);

                    if (childCustomizedProduct.hasCustomizedProducts())
                    {
                        await calculatePricesOfChildCustomizedProducts(childCustomizedProductPrices, childCustomizedProduct,
                                                                       fetchCustomizedProductPrice, materialPriceTableRepository, finishPriceTableRepository, clientFactory);
                    }
                }
            }

            return(childCustomizedProductPrices);
        }
        public void ensureTableEntryIsntEqualToInstanceOfOtherType()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());

            Assert.False(instance.Equals("bananas"));
        }
        public void ensureSameAsReturnsFalseForDifferentEntityIds()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());

            Assert.False(instance.sameAs("bananas"));
        }
        public void ensureTableEntryIsEqualToItself()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());

            Assert.True(instance.Equals(instance));
        }
        public void ensureSameAsReturnsTrueForEqualEntityIds()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());

            Assert.True(instance.sameAs(instance.id()));
        }
        public void ensureInstanceIsCreated()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(20),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());

            Assert.NotNull(instance);
        }
コード例 #8
0
        public static GetCurrentMaterialFinishPriceModelView fromMaterialFinish(GetCurrentMaterialFinishPriceModelView modelView, IHttpClientFactory clientFactory)
        {
            Material material = PersistenceContext.repositories().createMaterialRepository().find(modelView.finish.materialId);

            if (material == null)
            {
                throw new ResourceNotFoundException(string.Format(MATERIAL_NOT_FOUND, modelView.finish.materialId));
            }

            MaterialPriceTableEntry currentMaterialPrice = PersistenceContext.repositories().createMaterialPriceTableRepository().fetchCurrentMaterialPrice(modelView.finish.materialId);

            if (currentMaterialPrice == null)
            {
                throw new ResourceNotFoundException(string.Format(NO_CURRENT_MATERIAL_PRICE, modelView.finish.materialId));
            }

            foreach (Finish finish in material.Finishes)
            {
                if (finish.Id == modelView.finish.id)
                {
                    FinishPriceTableEntry currentMaterialFinishPrice = PersistenceContext.repositories().createFinishPriceTableRepository().fetchCurrentMaterialFinishPrice(modelView.finish.id);

                    if (currentMaterialFinishPrice == null)
                    {
                        throw new ResourceNotFoundException(string.Format(NO_CURRENT_FINISH_PRICE, modelView.finish.id, modelView.finish.materialId));
                    }

                    GetCurrentMaterialFinishPriceModelView currentMaterialFinishPriceModelView = new GetCurrentMaterialFinishPriceModelView();
                    currentMaterialFinishPriceModelView.finish                  = new GetMaterialFinishModelView();
                    currentMaterialFinishPriceModelView.currentPrice            = new PriceModelView();
                    currentMaterialFinishPriceModelView.timePeriod              = new TimePeriodModelView();
                    currentMaterialFinishPriceModelView.tableEntryId            = currentMaterialFinishPrice.Id;
                    currentMaterialFinishPriceModelView.finish.materialId       = material.Id;
                    currentMaterialFinishPriceModelView.finish.id               = finish.Id;
                    currentMaterialFinishPriceModelView.finish.description      = finish.description;
                    currentMaterialFinishPriceModelView.finish.shininess        = finish.shininess;
                    currentMaterialFinishPriceModelView.timePeriod.startingDate = LocalDateTimePattern.GeneralIso.Format(currentMaterialFinishPrice.timePeriod.startingDate);
                    currentMaterialFinishPriceModelView.timePeriod.endingDate   = LocalDateTimePattern.GeneralIso.Format(currentMaterialFinishPrice.timePeriod.endingDate);
                    if (modelView.currentPrice.currency == null || modelView.currentPrice.area == null)
                    {
                        currentMaterialFinishPriceModelView.currentPrice.value    = currentMaterialFinishPrice.price.value;
                        currentMaterialFinishPriceModelView.currentPrice.area     = CurrencyPerAreaConversionService.getBaseArea();
                        currentMaterialFinishPriceModelView.currentPrice.currency = CurrencyPerAreaConversionService.getBaseCurrency();
                    }
                    else
                    {
                        Task <double> convertedValueTask =
                            new CurrencyPerAreaConversionService(clientFactory)
                            .convertDefaultCurrencyPerAreaToCurrencyPerArea(currentMaterialFinishPrice.price.value, modelView.currentPrice.currency, modelView.currentPrice.area);
                        convertedValueTask.Wait();
                        currentMaterialFinishPriceModelView.currentPrice.value    = convertedValueTask.Result;
                        currentMaterialFinishPriceModelView.currentPrice.currency = modelView.currentPrice.currency;
                        currentMaterialFinishPriceModelView.currentPrice.area     = modelView.currentPrice.area;
                    }
                    return(currentMaterialFinishPriceModelView);
                }
            }
            throw new ResourceNotFoundException(string.Format(FINISH_NOT_FOUND, modelView.finish.id, modelView.finish.materialId));
        }
        public void ensureTableEntriesWithDifferentMaterialsArentEqual()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());
            MaterialPriceTableEntry other = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                        timePeriod: createTimePeriod(), material: createOtherMaterial());

            Assert.False(instance.Equals(other));
        }
コード例 #10
0
        public void ensureEqualTableEntriesHaveEqualHashCodes()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());
            MaterialPriceTableEntry other = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                        timePeriod: createTimePeriod(), material: createMaterial());

            Assert.Equal(instance.GetHashCode(), other.GetHashCode());
        }
コード例 #11
0
        public void ensureTableEntriesWithDifferentMaterialsHaveDifferentHashCodes()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());
            MaterialPriceTableEntry other = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                        timePeriod: createTimePeriod(), material: createOtherMaterial());

            Assert.NotEqual(instance.GetHashCode(), other.GetHashCode());
        }
コード例 #12
0
        public void ensureTableEntriesWithEqualPropertiesAreEqual()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());
            MaterialPriceTableEntry other = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                        timePeriod: createTimePeriod(), material: createMaterial());

            Assert.True(instance.Equals(other));
        }
コード例 #13
0
        public void ensureToStringWorks()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());
            MaterialPriceTableEntry other = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                        timePeriod: createTimePeriod(), material: createMaterial());

            Assert.Equal(instance.ToString(), other.ToString());
        }
コード例 #14
0
        public void ensureChangeTimePeriodDoesntChangeTimePeriodIfNewTimePeriodIsNull()
        {
            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(20),
                                                                           timePeriod: createTimePeriod(), material: createMaterial());

            Action act = () => instance.changeTimePeriod(null);

            Assert.Throws <ArgumentException>(act);
        }
コード例 #15
0
        public void ensureChangeTimePeriodChangesTimePeriod()
        {
            TimePeriod oldTimePeriod = createTimePeriod();
            TimePeriod newTimePeriod = createOtherTimePeriod();

            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: Price.valueOf(10),
                                                                           timePeriod: oldTimePeriod, material: createMaterial());

            instance.changeTimePeriod(newTimePeriod);

            Assert.NotEqual(oldTimePeriod, instance.timePeriod);
        }
コード例 #16
0
        public void ensureChangePriceChangesPrice()
        {
            Price oldPrice = Price.valueOf(20);
            Price newPrice = Price.valueOf(30);

            MaterialPriceTableEntry instance = new MaterialPriceTableEntry(price: oldPrice,
                                                                           timePeriod: createTimePeriod(), material: createMaterial());

            instance.changePrice(newPrice);

            Assert.NotEqual(oldPrice, instance.price);
        }
コード例 #17
0
        /// <summary>
        /// Creates a model view with a material price information
        /// </summary>
        /// <param name="materialPriceTableEntry">MaterialPriceTableEntry with the material price</param>
        /// <returns>GetMaterialPriceModelView with the material price information model view</returns>
        public static GetMaterialPriceModelView fromMaterialEntity(MaterialPriceTableEntry materialPriceTableEntry, string currency, string area)
        {
            GetMaterialPriceModelView getMaterialPriceModelView = new GetMaterialPriceModelView();

            getMaterialPriceModelView.materialId   = materialPriceTableEntry.entity.Id;
            getMaterialPriceModelView.id           = materialPriceTableEntry.Id;
            getMaterialPriceModelView.value        = materialPriceTableEntry.price.value;
            getMaterialPriceModelView.currency     = currency;
            getMaterialPriceModelView.area         = area;
            getMaterialPriceModelView.startingDate = LocalDateTimePattern.GeneralIso.Format(materialPriceTableEntry.timePeriod.startingDate);
            getMaterialPriceModelView.endingDate   = LocalDateTimePattern.GeneralIso.Format(materialPriceTableEntry.timePeriod.endingDate);
            return(getMaterialPriceModelView);
        }
コード例 #18
0
        /// <summary>
        /// Checks if a material from a customized product has a current price
        /// </summary>
        /// <param name="materialPriceTableRepository">Material Price Table Repository</param>
        /// <param name="materialId">Material's PID</param>
        /// <returns>MaterialPriceTableEntry with the material's current price</returns>
        private static MaterialPriceTableEntry getCurrentMaterialPrice(MaterialPriceTableRepository materialPriceTableRepository, long materialId)
        {
            MaterialPriceTableEntry materialPriceTableEntry =
                materialPriceTableRepository.fetchCurrentMaterialPrice(materialId);

            if (materialPriceTableEntry == null)
            {
                throw new ResourceNotFoundException
                      (
                          string.Format(MATERIAL_HAS_NO_CURRENT_PRICE, materialId)
                      );
            }

            return(materialPriceTableEntry);
        }
コード例 #19
0
        /// <summary>
        /// Builds a CustomizedProductPriceModelView out of a Customized Product
        /// </summary>
        /// <param name="customizedProduct">Customized Product to build the model view out of</param>
        /// <param name="fetchCustomizedProductPriceModelView">ModelView to know if currency/area conversion is needed</param>
        /// <returns>CustomizedProductPriceModelView</returns>
        private static async Task <CustomizedProductPriceModelView> buildCustomizedProductPriceModelView(CustomizedProduct customizedProduct, FetchCustomizedProductPriceModelView fetchCustomizedProductPriceModelView,
                                                                                                         MaterialPriceTableEntry materialPriceTableEntry, FinishPriceTableEntry finishPriceTableEntry, IHttpClientFactory clientFactory)
        {
            CustomizedProductPriceModelView customizedProductPriceModelView = new CustomizedProductPriceModelView();

            string defaultCurrency        = CurrencyPerAreaConversionService.getBaseCurrency();
            string defaultArea            = CurrencyPerAreaConversionService.getBaseArea();
            bool   convertCurrencyPerArea = fetchCustomizedProductPriceModelView.currency != null && fetchCustomizedProductPriceModelView.area != null;

            customizedProductPriceModelView.customizedProductId = customizedProduct.Id;
            customizedProductPriceModelView.reference           = customizedProduct.reference;
            customizedProductPriceModelView.productId           = customizedProduct.product.Id;
            string requestedMeasurementUnit = null;

            if (convertCurrencyPerArea)
            {
                requestedMeasurementUnit = new String(fetchCustomizedProductPriceModelView.area.Where(c => Char.IsLetter(c)).ToArray());
            }
            else
            {
                requestedMeasurementUnit = new String(CurrencyPerAreaConversionService.getBaseArea().Where(c => Char.IsLetter(c)).ToArray());
            }
            customizedProductPriceModelView.customizedDimensions       = new GetCustomizedDimensionsModelView();
            customizedProductPriceModelView.customizedDimensions.unit  = requestedMeasurementUnit;
            customizedProductPriceModelView.customizedDimensions.width =
                MeasurementUnitService.convertToUnit(customizedProduct.customizedDimensions.width, requestedMeasurementUnit);
            customizedProductPriceModelView.customizedDimensions.height =
                MeasurementUnitService.convertToUnit(customizedProduct.customizedDimensions.height, requestedMeasurementUnit);
            customizedProductPriceModelView.customizedDimensions.depth =
                MeasurementUnitService.convertToUnit(customizedProduct.customizedDimensions.depth, requestedMeasurementUnit);

            customizedProductPriceModelView.customizedMaterial = new CustomizedMaterialPriceModelView();
            customizedProductPriceModelView.customizedMaterial.customizedMaterialId = customizedProduct.customizedMaterial.Id;
            customizedProductPriceModelView.customizedMaterial.materialId           = customizedProduct.customizedMaterial.material.Id;
            if (customizedProduct.customizedMaterial.finish != null)
            {
                customizedProductPriceModelView.customizedMaterial.finish             = new FinishPriceModelView();
                customizedProductPriceModelView.customizedMaterial.finish.finishId    = customizedProduct.customizedMaterial.finish.Id;
                customizedProductPriceModelView.customizedMaterial.finish.description = customizedProduct.customizedMaterial.finish.description;
                customizedProductPriceModelView.customizedMaterial.finish.shininess   = customizedProduct.customizedMaterial.finish.shininess;
                customizedProductPriceModelView.customizedMaterial.finish.price       = new PriceModelView();
                if (convertCurrencyPerArea)
                {
                    customizedProductPriceModelView.customizedMaterial.finish.price.currency =
                        fetchCustomizedProductPriceModelView.currency;
                    customizedProductPriceModelView.customizedMaterial.finish.price.area =
                        fetchCustomizedProductPriceModelView.area;
                    customizedProductPriceModelView.customizedMaterial.finish.price.value =
                        await convertPriceValue(
                            finishPriceTableEntry.price.value, fetchCustomizedProductPriceModelView.currency,
                            fetchCustomizedProductPriceModelView.area, clientFactory
                            );
                }
                else
                {
                    customizedProductPriceModelView.customizedMaterial.finish.price.currency = defaultCurrency;
                    customizedProductPriceModelView.customizedMaterial.finish.price.area     = defaultArea;
                    customizedProductPriceModelView.customizedMaterial.finish.price.value    = finishPriceTableEntry.price.value;
                }
            }
            if (customizedProduct.customizedMaterial.color != null)
            {
                customizedProductPriceModelView.customizedMaterial.color = ColorModelViewService.fromEntity(customizedProduct.customizedMaterial.color);
            }
            customizedProductPriceModelView.customizedMaterial.price = new PriceModelView();
            if (convertCurrencyPerArea)
            {
                customizedProductPriceModelView.customizedMaterial.price.currency =
                    fetchCustomizedProductPriceModelView.currency;
                customizedProductPriceModelView.customizedMaterial.price.area =
                    fetchCustomizedProductPriceModelView.area;
                customizedProductPriceModelView.customizedMaterial.price.value =
                    await convertPriceValue(
                        materialPriceTableEntry.price.value, fetchCustomizedProductPriceModelView.currency,
                        fetchCustomizedProductPriceModelView.area, clientFactory
                        );
            }
            else
            {
                customizedProductPriceModelView.customizedMaterial.price.currency = defaultCurrency;
                customizedProductPriceModelView.customizedMaterial.price.area     = defaultArea;
                customizedProductPriceModelView.customizedMaterial.price.value    = materialPriceTableEntry.price.value;
            }

            customizedProductPriceModelView.price     = new PriceModelView();
            customizedProductPriceModelView.totalArea = new AreaModelView();

            if (convertCurrencyPerArea)
            {
                customizedProductPriceModelView.price.currency = fetchCustomizedProductPriceModelView.currency;
                customizedProductPriceModelView.totalArea.area = fetchCustomizedProductPriceModelView.area;
            }
            else
            {
                customizedProductPriceModelView.price.currency = defaultCurrency;
                customizedProductPriceModelView.totalArea.area = defaultArea;
            }

            calculateTotalAreaAndPriceOfCustomizedMaterial(customizedProductPriceModelView, customizedProduct);

            return(customizedProductPriceModelView);
        }
        /// <summary>
        /// Transforms an AddMaterialPriceTableEntry into a MaterialPriceTableEntry and saves it to the database
        /// </summary>
        /// <param name="modelView">material price table entry to transform and persist</param>
        /// <returns>created instance or null in case the creation wasn't successfull</returns>
        public static GetMaterialPriceModelView create(AddPriceTableEntryModelView modelView, IHttpClientFactory clientFactory)
        {
            string defaultCurrency = CurrencyPerAreaConversionService.getBaseCurrency();
            string defaultArea     = CurrencyPerAreaConversionService.getBaseArea();
            long   materialId      = modelView.entityId;

            Material material = PersistenceContext.repositories().createMaterialRepository().find(materialId);

            if (material == null)
            {
                throw new ResourceNotFoundException(MATERIAL_NOT_FOUND);
            }

            string startingDateAsString = modelView.priceTableEntry.startingDate;
            string endingDateAsString   = modelView.priceTableEntry.endingDate;

            LocalDateTime startingDate;
            LocalDateTime endingDate;
            LocalDateTime currentTime = NodaTime.LocalDateTime.FromDateTime(SystemClock.Instance.GetCurrentInstant().ToDateTimeUtc());

            try
            {
                startingDate = LocalDateTimePattern.GeneralIso.Parse(startingDateAsString).GetValueOrThrow();

                if (startingDate.CompareTo(currentTime) < 0)
                {
                    throw new InvalidOperationException(PAST_DATE);
                }
            }
            catch (UnparsableValueException)
            {
                throw new UnparsableValueException(DATES_WRONG_FORMAT + LocalDateTimePattern.GeneralIso.PatternText);
            }

            TimePeriod timePeriod = null;

            if (endingDateAsString != null)
            {
                try
                {
                    endingDate = LocalDateTimePattern.GeneralIso.Parse(endingDateAsString).GetValueOrThrow();

                    if (endingDate.CompareTo(currentTime) < 0)
                    {
                        throw new InvalidOperationException(PAST_DATE);
                    }

                    timePeriod = TimePeriod.valueOf(startingDate, endingDate);
                }
                catch (UnparsableValueException)
                {
                    throw new UnparsableValueException(DATES_WRONG_FORMAT + LocalDateTimePattern.GeneralIso.PatternText);
                }
            }
            else
            {
                timePeriod = TimePeriod.valueOf(startingDate);
            }

            CurrenciesService.checkCurrencySupport(modelView.priceTableEntry.price.currency);
            AreasService.checkAreaSupport(modelView.priceTableEntry.price.area);

            Price price = null;

            try
            {
                if (defaultCurrency.Equals(modelView.priceTableEntry.price.currency) && defaultArea.Equals(modelView.priceTableEntry.price.area))
                {
                    price = Price.valueOf(modelView.priceTableEntry.price.value);
                }
                else
                {
                    Task <double> convertedValueTask = new CurrencyPerAreaConversionService(clientFactory)
                                                       .convertCurrencyPerAreaToDefaultCurrencyPerArea(
                        modelView.priceTableEntry.price.currency,
                        modelView.priceTableEntry.price.area,
                        modelView.priceTableEntry.price.value);
                    convertedValueTask.Wait();
                    double convertedValue = convertedValueTask.Result;
                    price = Price.valueOf(convertedValue);
                }
            }
            catch (HttpRequestException)
            {
                price = Price.valueOf(modelView.priceTableEntry.price.value);
            }

            MaterialPriceTableEntry materialPriceTableEntry      = new MaterialPriceTableEntry(material, price, timePeriod);
            MaterialPriceTableEntry savedMaterialPriceTableEntry =
                PersistenceContext.repositories().createMaterialPriceTableRepository().save(materialPriceTableEntry);

            if (savedMaterialPriceTableEntry == null)
            {
                throw new InvalidOperationException(PRICE_TABLE_ENTRY_NOT_CREATED);
            }

            GetMaterialPriceModelView createdPriceModelView = new GetMaterialPriceModelView();

            createdPriceModelView.materialId   = material.Id;
            createdPriceModelView.startingDate = LocalDateTimePattern.GeneralIso.Format(savedMaterialPriceTableEntry.timePeriod.startingDate);
            createdPriceModelView.endingDate   = LocalDateTimePattern.GeneralIso.Format(savedMaterialPriceTableEntry.timePeriod.endingDate);
            createdPriceModelView.value        = savedMaterialPriceTableEntry.price.value;
            createdPriceModelView.currency     = defaultCurrency;
            createdPriceModelView.area         = defaultArea;
            createdPriceModelView.id           = savedMaterialPriceTableEntry.Id;

            return(createdPriceModelView);
        }
コード例 #21
0
        /// <summary>
        /// Calculates the price
        /// </summary>
        /// <param name="fetchCustomizedProductPrice">FetchCustomizedProductModelView with the necessary information to fetch the customized product's price</param>
        /// <returns>CustomizedProductPriceModelView with the price of the customized product</returns>
        public static async Task <CustomizedProductFinalPriceModelView> calculatePrice(FetchCustomizedProductPriceModelView fetchCustomizedProductPrice, IHttpClientFactory clientFactory)
        {
            if (fetchCustomizedProductPrice.currency != null)
            {
                CurrenciesService.checkCurrencySupport(fetchCustomizedProductPrice.currency);
            }

            if (fetchCustomizedProductPrice.area != null)
            {
                AreasService.checkAreaSupport(fetchCustomizedProductPrice.area);
            }

            CustomizedProduct customizedProduct =
                PersistenceContext.repositories().createCustomizedProductRepository().find(fetchCustomizedProductPrice.id);

            if (customizedProduct == null)
            {
                throw new ResourceNotFoundException
                      (
                          string.Format(CUSTOMIZED_PRODUCT_NOT_FOUND, fetchCustomizedProductPrice.id)
                      );
            }

            if (customizedProduct.status == CustomizationStatus.PENDING)
            {
                throw new ArgumentException
                      (
                          CUSTOMIZED_PRODUCT_NOT_FINISHED
                      );
            }

            //TODO Should the fetching of prices of customized products that aren't base products be allowed?

            MaterialPriceTableRepository materialPriceTableRepository =
                PersistenceContext.repositories().createMaterialPriceTableRepository();
            FinishPriceTableRepository finishPriceTableRepository =
                PersistenceContext.repositories().createFinishPriceTableRepository();

            CustomizedProductFinalPriceModelView   customizedProductTotalPrice = new CustomizedProductFinalPriceModelView();
            List <CustomizedProductPriceModelView> customizedProductPriceList  = new List <CustomizedProductPriceModelView>();

            MaterialPriceTableEntry materialPriceTableEntry =
                getCurrentMaterialPrice(materialPriceTableRepository, customizedProduct.customizedMaterial.material.Id);

            FinishPriceTableEntry finishPriceTableEntry = null;

            if (customizedProduct.customizedMaterial.finish != null)
            {
                finishPriceTableEntry = getCurrentFinishPrice(finishPriceTableRepository,
                                                              customizedProduct.customizedMaterial.material.Finishes.Where(f => f.Equals(customizedProduct.customizedMaterial.finish)).SingleOrDefault().Id);
            }

            //TODO What should we do about doors?
            //TODO Should we consider that every component has a box geometry?
            //!For now the surface area of every product is being calculated as if it the product was a SIX FACED RIGHT RECTANGULAR PRISM

            CustomizedProductPriceModelView parentCustomizedProductModelView =
                await buildCustomizedProductPriceModelView(customizedProduct, fetchCustomizedProductPrice, materialPriceTableEntry, finishPriceTableEntry, clientFactory);

            customizedProductPriceList.Add(parentCustomizedProductModelView);

            if (customizedProduct.hasCustomizedProducts())
            {
                List <CustomizedProductPriceModelView> childCustomizedProducts = new List <CustomizedProductPriceModelView>();
                customizedProductPriceList.AddRange(await
                                                    calculatePricesOfChildCustomizedProducts(childCustomizedProducts, customizedProduct, fetchCustomizedProductPrice,
                                                                                             materialPriceTableRepository, finishPriceTableRepository, clientFactory));
            }

            customizedProductTotalPrice.customizedProducts = customizedProductPriceList;
            customizedProductTotalPrice.finalPrice         = calculateFinalPriceOfCustomizedProduct(customizedProductTotalPrice, fetchCustomizedProductPrice);

            return(customizedProductTotalPrice);
        }
コード例 #22
0
        /// <summary>
        /// Updates a material's price table entry
        /// </summary>
        /// <param name="modelView">model view with the update information</param>
        /// <returns></returns>
        public static GetMaterialPriceModelView update(UpdatePriceTableEntryModelView modelView, IHttpClientFactory clientFactory)
        {
            string             defaultCurrency    = CurrencyPerAreaConversionService.getBaseCurrency();
            string             defaultArea        = CurrencyPerAreaConversionService.getBaseArea();
            MaterialRepository materialRepository = PersistenceContext.repositories().createMaterialRepository();
            long materialId = modelView.entityId;

            bool performedAtLeastOneUpdate = false;

            Material material = materialRepository.find(materialId);

            if (material == null)
            {
                throw new ResourceNotFoundException(MATERIAL_NOT_FOUND);
            }

            MaterialPriceTableRepository materialPriceTableRepository = PersistenceContext.repositories().createMaterialPriceTableRepository();
            long materialPriceTableEntryId = modelView.tableEntryId;

            IEnumerable <MaterialPriceTableEntry> allEntries = materialPriceTableRepository.findAll();

            if (allEntries == null || !allEntries.Any())
            {
                throw new ResourceNotFoundException(NO_ENTRIES_FOUND);
            }

            MaterialPriceTableEntry tableEntryToUpdate = materialPriceTableRepository.find(materialPriceTableEntryId);

            if (tableEntryToUpdate == null)
            {
                throw new ResourceNotFoundException(ENTRY_NOT_FOUND);
            }

            if (tableEntryToUpdate.entity.Id != modelView.entityId)
            {
                throw new InvalidOperationException(ENTRY_DOESNT_BELONG_TO_MATERIAL);
            }

            LocalDateTime currentTime = NodaTime.LocalDateTime.FromDateTime(SystemClock.Instance.GetCurrentInstant().ToDateTimeUtc());

            if (modelView.priceTableEntry.endingDate != null && !LocalDateTimePattern.GeneralIso.Format(tableEntryToUpdate.timePeriod.startingDate).Equals(modelView.priceTableEntry.startingDate))
            {
                if (tableEntryToUpdate.timePeriod.startingDate.CompareTo(currentTime) < 0)
                {
                    throw new InvalidOperationException(PAST_DATE);
                }
            }

            if (modelView.priceTableEntry.startingDate != null && !LocalDateTimePattern.GeneralIso.Format(tableEntryToUpdate.timePeriod.endingDate).Equals(modelView.priceTableEntry.endingDate))
            {
                if (tableEntryToUpdate.timePeriod.endingDate.CompareTo(currentTime) < 0)
                {
                    throw new InvalidOperationException(PAST_DATE);
                }
            }

            if (modelView.priceTableEntry.price != null)
            {
                CurrenciesService.checkCurrencySupport(modelView.priceTableEntry.price.currency);
                AreasService.checkAreaSupport(modelView.priceTableEntry.price.area);

                Price newPrice = null;
                try
                {
                    if (defaultCurrency.Equals(modelView.priceTableEntry.price.currency) && defaultArea.Equals(modelView.priceTableEntry.price.area))
                    {
                        newPrice = Price.valueOf(modelView.priceTableEntry.price.value);
                    }
                    else
                    {
                        Task <double> convertedValueTask = new CurrencyPerAreaConversionService(clientFactory)
                                                           .convertCurrencyPerAreaToDefaultCurrencyPerArea(
                            modelView.priceTableEntry.price.currency,
                            modelView.priceTableEntry.price.area,
                            modelView.priceTableEntry.price.value);
                        convertedValueTask.Wait();
                        double convertedValue = convertedValueTask.Result;
                        newPrice = Price.valueOf(convertedValue);
                    }
                }
                catch (HttpRequestException)
                {
                    newPrice = Price.valueOf(modelView.priceTableEntry.price.value);
                }

                tableEntryToUpdate.changePrice(newPrice);
                performedAtLeastOneUpdate = true;
            }

            if (modelView.priceTableEntry.endingDate != null)
            {
                LocalDateTime newEndingDate;
                try
                {
                    string newEndingDateAsString = modelView.priceTableEntry.endingDate;
                    newEndingDate = LocalDateTimePattern.GeneralIso.Parse(newEndingDateAsString).GetValueOrThrow();
                    tableEntryToUpdate.changeTimePeriod(TimePeriod.valueOf(tableEntryToUpdate.timePeriod.startingDate, newEndingDate));
                    performedAtLeastOneUpdate = true;
                }
                catch (UnparsableValueException)
                {
                    throw new UnparsableValueException(DATES_WRONG_FORMAT + LocalDateTimePattern.GeneralIso.PatternText);
                }
            }

            if (modelView.priceTableEntry.startingDate != null)
            {
                LocalDateTime newStartingDate;
                try
                {
                    string newStartingDateAsString = modelView.priceTableEntry.startingDate;
                    newStartingDate = LocalDateTimePattern.GeneralIso.Parse(newStartingDateAsString).GetValueOrThrow();
                    tableEntryToUpdate.changeTimePeriod(TimePeriod.valueOf(newStartingDate, tableEntryToUpdate.timePeriod.endingDate));
                    performedAtLeastOneUpdate = true;
                }
                catch (UnparsableValueException)
                {
                    throw new UnparsableValueException(DATES_WRONG_FORMAT + LocalDateTimePattern.GeneralIso.PatternText);
                }
            }

            if (performedAtLeastOneUpdate)
            {
                MaterialPriceTableEntry updatedTableEntry = materialPriceTableRepository.update(tableEntryToUpdate);

                if (updatedTableEntry == null)
                {
                    throw new InvalidOperationException(UPDATE_NOT_SUCCESSFUL);
                }

                GetMaterialPriceModelView updatedTableEntryModelView = new GetMaterialPriceModelView();

                updatedTableEntryModelView.id           = updatedTableEntry.Id;
                updatedTableEntryModelView.materialId   = updatedTableEntry.entity.Id;
                updatedTableEntryModelView.value        = updatedTableEntry.price.value;
                updatedTableEntryModelView.currency     = defaultCurrency;
                updatedTableEntryModelView.area         = defaultArea;
                updatedTableEntryModelView.startingDate = LocalDateTimePattern.GeneralIso.Format(updatedTableEntry.timePeriod.startingDate);
                updatedTableEntryModelView.endingDate   = LocalDateTimePattern.GeneralIso.Format(updatedTableEntry.timePeriod.endingDate);

                return(updatedTableEntryModelView);
            }
            throw new InvalidOperationException(UPDATE_NOT_SUCCESSFUL);
        }