123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- using OOO_WriteAndClear.DBModels;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Controls;
- namespace OOO_WriteAndClear.MVP.Models.OrderFormerer
- {
- public class OrderFormerer
- {
- public OrderFormerer()
- {
- _order = new Order();
- _order.OrderProducts = new List<OrderProduct>();
- }
- /// <summary>
- /// Формируемый заказ
- /// </summary>
- public Order Order => _order;
- /// <summary>
- /// Добавляет продукт в заказ в количестве 1 штуки, если уже существует то ничего не делает
- /// </summary>
- /// <param name="product">Продукт для добавления</param>
- public bool AddProductIntoOrder(Product product)
- {
- if (CheckAvailabilityOfProductInOrder(product))
- return false;
- _order.OrderProducts.Add(new OrderProduct()
- {
- Order = _order,
- OrderId = _order.OrderId,
- ProductArticleNumberNavigation = product,
- ProductArticleNumber = product.ProductArticleNumber,
- ProductAmount = 1
- });
- return true;
- }
- /// <summary>
- /// Удаляет продукт из заказа
- /// </summary>
- /// <param name="product">удаляемый продукт</param>
- public bool RemoveProductFromOrder(Product product)
- {
- if (!CheckAvailabilityOfProductInOrder(product))
- return false;
- OrderProduct orderItem = GetOrderItem(product);
- _order.OrderProducts.Remove(orderItem);
- return true;
- }
- /// <summary>
- /// Добавить один продукт в заказ
- /// </summary>
- /// <param name="product"></param>
- public void AddProductUnitIntoOrder(Product product)
- {
- if(AddProductIntoOrder(product)) return;
- OrderProduct orderItem = GetOrderItem(product);
- orderItem.ProductAmount++;
- }
- /// <summary>
- /// Убрать один продукт из заказа
- /// </summary>
- /// <param name="product">продукт</param>
- public void RemoveProductUnitFromOrder(Product product)
- {
- if (!CheckAvailabilityOfProductInOrder(product))
- return;
- OrderProduct orderItem = GetOrderItem(product);
- orderItem.ProductAmount--;
- if (orderItem.ProductAmount == 0)
- _order.OrderProducts.Remove(orderItem);
- }
- /// <summary>
- /// Проверяет наличие продукта в заказе
- /// </summary>
- /// <param name="product">продукт</param>
- /// <returns>true - есть в заказе; false - нет в заказе</returns>
- public bool CheckAvailabilityOfProductInOrder(Product product) =>
- _order.OrderProducts.Where(a => a.ProductArticleNumber
- == product.ProductArticleNumber).ToList().Count > 0;
- public Order PrepareOrderForAdd()
- {
- int DeliveryDelay = GenerateDeliveryDelay();
- Order order = new Order()
- {
- OrderReceiveCode = GenerateReceiveCode(),
- OrderCustomer = Order.OrderCustomer,
- OrderStatusId = 1,
- OrderCreateDate = DateTime.Now,
- OrderDeliveryDate = DateTime.Now.AddDays(DeliveryDelay),
- OrderPickupPointId = Order.OrderPickupPoint.PickupPointId,
- OrderProducts = new List<OrderProduct>()
- };
- Order.OrderCreateDate = order.OrderCreateDate;
- Order.OrderDeliveryDate = order.OrderDeliveryDate;
- Order.OrderReceiveCode = order.OrderReceiveCode;
- foreach(var OrderProduct in Order.OrderProducts)
- {
- order.OrderProducts.Add(new OrderProduct()
- {
- ProductArticleNumber = OrderProduct.ProductArticleNumber,
- ProductAmount = OrderProduct.ProductAmount
- });
- }
- return order;
- }
- private Order _order;
- /// <summary>
- /// Получение строки заказа по продукту
- /// </summary>
- /// <param name="product">продукт</param>
- /// <returns>null - если заказа не существует; OrderProduct - если существует</returns>
- private OrderProduct? GetOrderItem(Product product) =>
- _order.OrderProducts.Where(a => a.ProductArticleNumber == product.ProductArticleNumber).FirstOrDefault();
- private int GenerateReceiveCode()
- => new Random().Next(100, 1000);
- private int GenerateDeliveryDelay()
- {
- bool IsShortageInStock = false;
- foreach (var product in Order.OrderProducts)
- {
- if(product.ProductArticleNumberNavigation.ProductQuantityInStock < 3)
- {
- return 6;
- }
- }
- return 3;
- }
- }
- }
|