private void SubscribeToChanges(ProductInOrder newProductInOrder) { newProductInOrder.WhenAnyValue(x => x.SelectedDiscount, x => x.SelectedQuantity) .Subscribe(a => { int newSelectedDiscount = a.Item1; int newSelectedQuantity = a.Item2; //-UnitPrice или +UnitPrice к TotalSum и цене товара в заказке decimal newValue = (newSelectedQuantity - (short)newProductInOrder.SourceProductOnStore.UnitsOnOrder) * (decimal)newProductInOrder.UnitPrice; //-1% или +1% скидки от товара decimal percentageOff = (decimal)(newSelectedDiscount - newProductInOrder.PreviousSelectedDiscount) / 100; //Запускается когда меняется SelectedDiscount if (percentageOff != 0) { newProductInOrder.Sum -= newProductInOrder.SelectedQuantity * (decimal)newProductInOrder.UnitPrice * percentageOff; TotalSum -= newProductInOrder.SelectedQuantity * (decimal)newProductInOrder.UnitPrice * percentageOff; } //Запускается когда меняется SelectedQuantity и при этом SelectedDiscount больше нуля else if (newSelectedDiscount != 0) { // decimal sumOff = ((decimal)newProductInOrder.PreviousSelectedDiscount / 100) * newProductInOrder.SelectedQuantity * (decimal)newProductInOrder.UnitPrice; decimal sumToAdd = sumOff - newProductInOrder.Sum; newProductInOrder.Sum = sumOff; TotalSum += sumToAdd; return; } newProductInOrder.PreviousSelectedDiscount = newSelectedDiscount; newProductInOrder.Sum += newValue; TotalSum += newValue; }); newProductInOrder.WhenAnyValue(x => x.SelectedQuantity) .Select(newSelectedQuantity => { short?unitsOnOrder = newProductInOrder.SourceProductOnStore.UnitsOnOrder; return(newSelectedQuantity - unitsOnOrder); }) .Subscribe(newValue => { newProductInOrder.SourceProductOnStore.UnitsInStock -= (short)newValue; newProductInOrder.SourceProductOnStore.UnitsOnOrder += (short)newValue; SaveChangesToProducts(newProductInOrder, (int)newValue); }); }
private void SubscribeToChanges(ProductInOrder newProductInOrder) { int previousSelectedQuantity = 0; newProductInOrder.WhenAnyValue(x => x.SelectedDiscount, x => x.SelectedQuantity) .Subscribe(a => { float newSelectedDiscount = a.Item1; int newSelectedQuantity = a.Item2; //Value(price) that will be added(or removed) to(from) TotalPrice decimal newValue = (decimal)newProductInOrder.UnitPrice * (newSelectedQuantity - previousSelectedQuantity); //-1% or +1% discount decimal percentageOff = (decimal)(newSelectedDiscount - newProductInOrder.PreviousSelectedDiscount) / 100; //Executing when the SelectedDiscount has changed if (percentageOff != 0) { newProductInOrder.Sum -= newProductInOrder.SelectedQuantity * (decimal)newProductInOrder.UnitPrice * percentageOff; TotalSum -= newProductInOrder.SelectedQuantity * (decimal)newProductInOrder.UnitPrice * percentageOff; } //Executing when the SelectedQuantity has changed and the SelectedDiscount is greater than zero. else if (newSelectedDiscount != 0) { decimal sumOff = ((decimal)newProductInOrder.PreviousSelectedDiscount / 100) * newProductInOrder.SelectedQuantity * (decimal)newProductInOrder.UnitPrice; decimal sumToAdd = sumOff - newProductInOrder.Sum; newProductInOrder.Sum = sumOff; TotalSum += sumToAdd; TotalSumString = TotalSum.ToString("C2"); return; } newProductInOrder.PreviousSelectedDiscount = newSelectedDiscount; newProductInOrder.Sum += newValue; TotalSum += newValue; TotalSumString = TotalSum.ToString("C2"); }); newProductInOrder.WhenAnyValue(x => x.SelectedQuantity) .Select(newSelectedQuantity => { if (newSelectedQuantity == 0) { return(0); } int deltaQuantity = newSelectedQuantity - previousSelectedQuantity; //Quantity of products that will be added or removed(in case of negative value) from the stock of the current product previousSelectedQuantity = newSelectedQuantity; return(deltaQuantity); }) .Subscribe(newValue => { newProductInOrder.SourceProductOnStore.UnitsInStock -= (short)newValue; Product productToReplace = productsList.First(x => x.ProductID == newProductInOrder.ProductID); productToReplace.UnitsInStock -= (short)newValue; }); }