212 lines
7.1 KiB
C#
212 lines
7.1 KiB
C#
using Netina.Common.Models.Api;
|
|
using Netina.Common.Models.Exception;
|
|
|
|
namespace Netina.Domain.Entities.Orders;
|
|
|
|
public partial class Order
|
|
{
|
|
public static Order Create(Guid userId)
|
|
{
|
|
var factorNumber = StringExtensions.GetId(10).ToUpper();
|
|
return new Order(factorNumber, 0, 0, 0, 0, 0, 0, 0, false, OrderStatus.OrderBag, DateTime.MinValue, DateTime.Now, 0, string.Empty, userId, OrderPaymentMethod.OnlinePayment);
|
|
|
|
}
|
|
|
|
public void AddToOrderBag(Guid productId, double cost, double costWithDiscount, bool hasDiscount, double packingCost,
|
|
Guid categoryId,
|
|
Guid brandId,
|
|
int count)
|
|
{
|
|
var orderProduct = OrderProducts.FirstOrDefault(op => op.ProductId == productId);
|
|
if (orderProduct == null)
|
|
{
|
|
orderProduct = OrderProduct.Create(count,
|
|
cost,
|
|
costWithDiscount,
|
|
hasDiscount,
|
|
packingCost,
|
|
OrderStatus.OrderBag,
|
|
productId,
|
|
categoryId,
|
|
brandId,
|
|
this.Id);
|
|
OrderProducts.Add(orderProduct);
|
|
}
|
|
else
|
|
{
|
|
orderProduct.SetCount(count,cost,costWithDiscount,packingCost);
|
|
}
|
|
}
|
|
public void RemoveFromOrderBag(Guid productId, int count)
|
|
{
|
|
var orderProduct = OrderProducts.FirstOrDefault(op => op.ProductId == productId);
|
|
if (orderProduct != null)
|
|
{
|
|
orderProduct.SetCount(count);
|
|
if (orderProduct.Count == 0)
|
|
OrderProducts.Remove(orderProduct);
|
|
}
|
|
}
|
|
|
|
public void ChangeOrderBag(Guid productId, double cost, double costWithDiscount, bool hasDiscount, double packingCost,
|
|
Guid categoryId,
|
|
Guid brandId,
|
|
int count)
|
|
{
|
|
var orderProduct = OrderProducts.FirstOrDefault(op => op.ProductId == productId);
|
|
if (orderProduct != null)
|
|
{
|
|
if (orderProduct.Count > count)
|
|
RemoveFromOrderBag(productId, count);
|
|
else
|
|
AddToOrderBag(productId, cost, costWithDiscount, hasDiscount, packingCost, categoryId,brandId, count);
|
|
}
|
|
else
|
|
AddToOrderBag(productId, cost, costWithDiscount, hasDiscount, packingCost, categoryId, brandId, count);
|
|
|
|
}
|
|
|
|
public void SetDiscount(string discountCode)
|
|
=> DiscountCode = discountCode;
|
|
public void RemoveDiscount()
|
|
=> DiscountCode = string.Empty;
|
|
public void AddOrderProduct(OrderProduct orderProduct)
|
|
=> OrderProducts.Add(orderProduct);
|
|
|
|
public void SetOrderPayment(OrderPaymentMethod paymentMethod)
|
|
{
|
|
switch (paymentMethod)
|
|
{
|
|
case OrderPaymentMethod.OnlinePayment:
|
|
OrderStatus = OrderStatus.Paid;
|
|
IsPayed = true;
|
|
PayedAt = DateTime.Now;
|
|
OrderAt = DateTime.Now;
|
|
PaymentMethod = paymentMethod;
|
|
break;
|
|
case OrderPaymentMethod.CardTransfer:
|
|
OrderStatus = OrderStatus.Submitted;
|
|
IsPayed = false;
|
|
OrderAt = DateTime.Now;
|
|
PaymentMethod = paymentMethod;
|
|
break;
|
|
case OrderPaymentMethod.PayOnDoor:
|
|
OrderStatus = OrderStatus.Submitted;
|
|
IsPayed = false;
|
|
OrderAt = DateTime.Now;
|
|
PaymentMethod = paymentMethod;
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void SetOrderStatus(OrderStatus orderStatus)
|
|
{
|
|
switch (orderStatus)
|
|
{
|
|
case OrderStatus.OrderBag:
|
|
throw new AppException("Order is in cart so you cant change it", ApiResultStatusCode.BadRequest);
|
|
break;
|
|
case OrderStatus.Submitted:
|
|
break;
|
|
case OrderStatus.Paid:
|
|
throw new AppException("use set payment method", ApiResultStatusCode.BadRequest);
|
|
break;
|
|
case OrderStatus.Processing:
|
|
break;
|
|
case OrderStatus.Delivered:
|
|
DeliveredAt = DateTime.Now;
|
|
break;
|
|
case OrderStatus.Done:
|
|
DoneAt = DateTime.Now;
|
|
break;
|
|
case OrderStatus.Canceled:
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException(nameof(orderStatus), orderStatus, null);
|
|
}
|
|
OrderStatus = orderStatus;
|
|
}
|
|
|
|
public void AddOrderDelivery(Guid addressId, double deliveryCost, Guid shippingId, Guid orderId)
|
|
{
|
|
var orderDelivery = OrderDelivery.Create(addressId, deliveryCost, shippingId, orderId);
|
|
if (OrderDelivery != null)
|
|
orderDelivery.Id = OrderDelivery.Id;
|
|
OrderDelivery = orderDelivery;
|
|
}
|
|
|
|
public void AddOrderDelivery(Guid addressId, double deliveryCost, Guid shippingId, Guid orderId, Guid orderDeliveryId)
|
|
{
|
|
var orderDelivery = OrderDelivery.Create(addressId, deliveryCost, shippingId, orderId);
|
|
orderDelivery.Id = orderDeliveryId;
|
|
OrderDelivery = orderDelivery;
|
|
}
|
|
public void SetTotalPrice(double totalProductPrice,
|
|
double packingPrice,
|
|
double servicePrice,
|
|
double deliveryPrice,
|
|
double productDiscountPrice,
|
|
double discountCodePrice,
|
|
double taxesPrice)
|
|
{
|
|
TotalProductsPrice = totalProductPrice;
|
|
PackingPrice = packingPrice;
|
|
ServicePrice = servicePrice;
|
|
DeliveryPrice = deliveryPrice;
|
|
TaxesPrice = taxesPrice;
|
|
DiscountCodePrice = discountCodePrice;
|
|
ProductDiscountPrice = productDiscountPrice;
|
|
DiscountPrice = productDiscountPrice + discountCodePrice;
|
|
TotalPrice = (totalProductPrice + packingPrice + servicePrice + deliveryPrice + taxesPrice) - DiscountPrice;
|
|
}
|
|
|
|
}
|
|
|
|
public partial class OrderProduct
|
|
{
|
|
public static OrderProduct Create(int count,
|
|
double productFee,
|
|
double productFeeWithDiscount,
|
|
bool hasDiscount,
|
|
double packingFee,
|
|
OrderStatus orderProductStatus,
|
|
Guid productId,
|
|
Guid productCategoryId,
|
|
Guid brandId,
|
|
Guid orderId)
|
|
{
|
|
var productCost = count * productFeeWithDiscount;
|
|
var packingCost = count * packingFee;
|
|
return new OrderProduct(count, productFee,
|
|
productFeeWithDiscount, hasDiscount,
|
|
productCost, packingFee, packingCost,
|
|
orderProductStatus, productId,
|
|
productCategoryId, orderId,brandId);
|
|
}
|
|
|
|
public void SetCount(int count)
|
|
{
|
|
Count = count;
|
|
}
|
|
public void SetCount(int count,double productFee,double costWithDiscount,double packingFee)
|
|
{
|
|
Count = count;
|
|
ProductFee = productFee;
|
|
PackingFee = packingFee;
|
|
ProductFeeWithDiscount = costWithDiscount;
|
|
ProductCost = ProductFeeWithDiscount * Count;
|
|
}
|
|
}
|
|
|
|
public partial class OrderDelivery
|
|
{
|
|
public static OrderDelivery Create(Guid addressId, double deliveryCost, Guid shippingId, Guid orderId)
|
|
{
|
|
return new OrderDelivery(addressId, deliveryCost, shippingId, orderId);
|
|
}
|
|
|
|
public void SetTrackingCode(string code)
|
|
{
|
|
this.TrackingCode = code;
|
|
}
|
|
} |