OrderFormerer.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using OOO_WriteAndClear.DBModels;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Controls;
  8. namespace OOO_WriteAndClear.MVP.Models.OrderFormerer
  9. {
  10. public class OrderFormerer
  11. {
  12. public OrderFormerer()
  13. {
  14. _order = new Order();
  15. _order.OrderProducts = new List<OrderProduct>();
  16. }
  17. /// <summary>
  18. /// Формируемый заказ
  19. /// </summary>
  20. public Order Order => _order;
  21. /// <summary>
  22. /// Добавляет продукт в заказ в количестве 1 штуки, если уже существует то ничего не делает
  23. /// </summary>
  24. /// <param name="product">Продукт для добавления</param>
  25. public bool AddProductIntoOrder(Product product)
  26. {
  27. if (CheckAvailabilityOfProductInOrder(product))
  28. return false;
  29. _order.OrderProducts.Add(new OrderProduct()
  30. {
  31. Order = _order,
  32. OrderId = _order.OrderId,
  33. ProductArticleNumberNavigation = product,
  34. ProductArticleNumber = product.ProductArticleNumber,
  35. ProductAmount = 1
  36. });
  37. return true;
  38. }
  39. /// <summary>
  40. /// Удаляет продукт из заказа
  41. /// </summary>
  42. /// <param name="product">удаляемый продукт</param>
  43. public bool RemoveProductFromOrder(Product product)
  44. {
  45. if (!CheckAvailabilityOfProductInOrder(product))
  46. return false;
  47. OrderProduct orderItem = GetOrderItem(product);
  48. _order.OrderProducts.Remove(orderItem);
  49. return true;
  50. }
  51. /// <summary>
  52. /// Добавить один продукт в заказ
  53. /// </summary>
  54. /// <param name="product"></param>
  55. public void AddProductUnitIntoOrder(Product product)
  56. {
  57. if(AddProductIntoOrder(product)) return;
  58. OrderProduct orderItem = GetOrderItem(product);
  59. orderItem.ProductAmount++;
  60. }
  61. /// <summary>
  62. /// Убрать один продукт из заказа
  63. /// </summary>
  64. /// <param name="product">продукт</param>
  65. public void RemoveProductUnitFromOrder(Product product)
  66. {
  67. if (!CheckAvailabilityOfProductInOrder(product))
  68. return;
  69. OrderProduct orderItem = GetOrderItem(product);
  70. orderItem.ProductAmount--;
  71. if (orderItem.ProductAmount == 0)
  72. _order.OrderProducts.Remove(orderItem);
  73. }
  74. /// <summary>
  75. /// Проверяет наличие продукта в заказе
  76. /// </summary>
  77. /// <param name="product">продукт</param>
  78. /// <returns>true - есть в заказе; false - нет в заказе</returns>
  79. public bool CheckAvailabilityOfProductInOrder(Product product) =>
  80. _order.OrderProducts.Where(a => a.ProductArticleNumber
  81. == product.ProductArticleNumber).ToList().Count > 0;
  82. public Order PrepareOrderForAdd()
  83. {
  84. int DeliveryDelay = GenerateDeliveryDelay();
  85. Order order = new Order()
  86. {
  87. OrderReceiveCode = GenerateReceiveCode(),
  88. OrderCustomer = Order.OrderCustomer,
  89. OrderStatusId = 1,
  90. OrderCreateDate = DateTime.Now,
  91. OrderDeliveryDate = DateTime.Now.AddDays(DeliveryDelay),
  92. OrderPickupPointId = Order.OrderPickupPoint.PickupPointId,
  93. OrderProducts = new List<OrderProduct>()
  94. };
  95. Order.OrderCreateDate = order.OrderCreateDate;
  96. Order.OrderDeliveryDate = order.OrderDeliveryDate;
  97. Order.OrderReceiveCode = order.OrderReceiveCode;
  98. foreach(var OrderProduct in Order.OrderProducts)
  99. {
  100. order.OrderProducts.Add(new OrderProduct()
  101. {
  102. ProductArticleNumber = OrderProduct.ProductArticleNumber,
  103. ProductAmount = OrderProduct.ProductAmount
  104. });
  105. }
  106. return order;
  107. }
  108. private Order _order;
  109. /// <summary>
  110. /// Получение строки заказа по продукту
  111. /// </summary>
  112. /// <param name="product">продукт</param>
  113. /// <returns>null - если заказа не существует; OrderProduct - если существует</returns>
  114. private OrderProduct? GetOrderItem(Product product) =>
  115. _order.OrderProducts.Where(a => a.ProductArticleNumber == product.ProductArticleNumber).FirstOrDefault();
  116. private int GenerateReceiveCode()
  117. => new Random().Next(100, 1000);
  118. private int GenerateDeliveryDelay()
  119. {
  120. bool IsShortageInStock = false;
  121. foreach (var product in Order.OrderProducts)
  122. {
  123. if(product.ProductArticleNumberNavigation.ProductQuantityInStock < 3)
  124. {
  125. return 6;
  126. }
  127. }
  128. return 3;
  129. }
  130. }
  131. }