public static double ToBaseUnit(MeasureUnitEnum from, decimal quantity, MeasureUnitTypeEnum type) { if (type == MeasureUnitTypeEnum.Mass) { return from switch { MeasureUnitEnum.Grama => UnitsNet.Mass.FromGrams(quantity).Grams, MeasureUnitEnum.Kilo => UnitsNet.Mass.FromKilograms(quantity).Grams, MeasureUnitEnum.Libra => UnitsNet.Mass.FromPounds(quantity).Grams, MeasureUnitEnum.Miligrama => UnitsNet.Mass.FromMilligrams(quantity).Grams, MeasureUnitEnum.Onca => UnitsNet.Mass.FromOunces(quantity).Grams, _ => 0, } } ; if (type == MeasureUnitTypeEnum.Volume) { return from switch { MeasureUnitEnum.Litro => UnitsNet.Volume.FromLiters(quantity).Milliliters, MeasureUnitEnum.Mililitro => UnitsNet.Volume.FromMilliliters(quantity).Milliliters, _ => 0, } } ; return(0); }
private async Task CalculateItem(NewOrderItem item, MeasureUnitEnum prodMeasureUnit, MeasureUnitTypeEnum pType, MeasureUnitTypeEnum qType, int corpClientId) { item.OriginalPrice = pricingApp.CalculatePricePerTotalWeight(new PriceRequest { ProductMeasureUnit = prodMeasureUnit, ProductPrice = item.ProductPrice, Quantity = item.Quantity, QuantityMeasureUnit = item.MeasureUnitId }, pType, qType); var prodSummary = await dataSheetService.CalculateProduction(item.ProductId, item.MeasureUnitId, item.Quantity, corpClientId); item.Cost = prodSummary.ProductionItems.Any() ? prodSummary.ProductionCost : new decimal?(); item.Profit = prodSummary.ProductionItems.Any() ? (item.PriceAfterDiscount - prodSummary.ProductionCost) : new decimal?(); }
public async Task <ProductionSummary> CalculateProduction(long productId, MeasureUnitEnum measureId, decimal quantity, int corpClientId) { var items = new List <ProductionItem>(); var dataSheet = await dataSheetApp.Get(productId, corpClientId); var units = await measureUnitApp.GetAll(); var sourceUnit = units.FirstOrDefault(u => u.MeasureUnitId == measureId); var p = await productApp.Get(corpClientId, productId); var pType = units.FirstOrDefault(u => u.MeasureUnitId == p.MeasureUnitId).MeasureUnitTypeId; var price = pricingApp.CalculatePricePerTotalWeight(new PriceRequest { ProductMeasureUnit = p.MeasureUnitId, ProductPrice = p.Price, Quantity = quantity, QuantityMeasureUnit = measureId, ResultPrecision = 2 }, pType, sourceUnit.MeasureUnitTypeId); if (dataSheet == null) { return new ProductionSummary { SalePrice = price, ProductionItems = items } } ; var q = Convert.ToDecimal(UnitConverter.ToBaseUnit(measureId, quantity, sourceUnit.MeasureUnitTypeId)); foreach (var di in dataSheet.DataSheetItems) { var item = new ProductionItem { AdditionalInfo = di.AdditionalInfo, DataSheetId = di.DataSheetId, DataSheetItemId = di.DataSheetItemId, IsBaseItem = di.IsBaseItem, RawMaterial = di.RawMaterial, Percentage = di.Percentage, RawMaterialId = di.RawMaterialId }; if (dataSheet.IncreaseWeight) { item.Quantity = q / (1 + (dataSheet.WeightVariationPercentage / 100)) * item.Percentage / 100; } else { item.Quantity = q / (1 - (dataSheet.WeightVariationPercentage / 100)) * item.Percentage / 100; } var rmSourceUnit = units.FirstOrDefault(u => u.MeasureUnitId == di.RawMaterial.MeasureUnitId); var rmQuantity = Convert.ToDecimal(UnitConverter.ToBaseUnit(rmSourceUnit.MeasureUnitId, 1, rmSourceUnit.MeasureUnitTypeId)); var rmPrice = di.RawMaterial.Price / rmQuantity; item.Cost = rmPrice * item.Quantity; switch (rmSourceUnit.MeasureUnitTypeId) { case MeasureUnitTypeEnum.Mass: item.MeasureUnit = units.FirstOrDefault(u => u.MeasureUnitId == MeasureUnitEnum.Grama); break; case MeasureUnitTypeEnum.Volume: item.MeasureUnit = units.FirstOrDefault(u => u.MeasureUnitId == MeasureUnitEnum.Mililitro); break; case MeasureUnitTypeEnum.Lenght: break; default: break; } items.Add(item); } return(new ProductionSummary { SalePrice = price, ProductionItems = items }); } }