public OrderWithItemsModel(GetOrderResponseModel order, GetOrderItemsResponseModel orderItems)
        {
            var data = order.data;

            BuyerName      = data.shipping.address.name.full;
            UserName       = data.buyer_name;
            ShippingMethod = PostageHelper.FriendlyPostageName(data.shipping.method);
            OrderTotal     = data.cost.subtotal;

            Buyer            = new Buyer(data.shipping.address);
            OrderNumber      = data.order_id.ToString();
            OrderDate        = data.date_ordered.ToString("yyyy-MM-dd");
            OrderPaid        = data.payment.date_paid.ToString("yyyy-MM-dd");
            SubTotal         = StaticFunctions.FormatCurrencyStr(data.cost.subtotal);
            ServiceCharge    = StaticFunctions.FormatCurrencyStr(data.cost.etc1);
            Coupon           = StaticFunctions.FormatCurrencyStr(data.cost.coupon);
            PostagePackaging = StaticFunctions.FormatCurrencyStr(data.cost.shipping);
            Total            = StaticFunctions.FormatCurrencyStr(data.cost.grand_total);

            Items = orderItems.data
                    .SelectMany(x => x)
                    .Select(x => new OrderItemModel(x))
                    .OrderBy(x => x.Condition)
                    .ThenBy(x => x.RemarkLetter3)
                    .ThenBy(x => x.RemarkLetter2)
                    .ThenBy(x => x.RemarkLetter1)
                    .ThenBy(x => x.RemarkNumber)
                    .ThenBy(x => x.Colour)
                    .ThenBy(x => x.Name);

            Messages = new List <BricklinkMessage>();
        }
        /// <summary>
        /// Adds an order into the DB. If it already exists, return it.
        /// </summary>
        /// <param name="order">Order response model from API</param>
        /// <param name="orderItems">Order items response model from API</param>
        /// <returns>A BL Order entity</returns>
        public Data.Entities.BricklinkOrder AddOrder(GetOrderResponseModel order, GetOrderItemsResponseModel orderItems, int id = 0)
        {
            var orderEntity = (id != 0 ?
                               _orderRepo.FindOne(id) :
                               _orderRepo.FindOne(x => x.OrderId == order.data.order_id.ToString()))
                              as Data.Entities.BricklinkOrder;

            if (orderEntity == null)
            {
                throw new Exception("Order doesn't exist!!");                 // todo: do something about this
            }

            if (orderEntity.OrderItems.Any())
            {
                return(orderEntity);
            }

            orderEntity.Weight         = order.data.total_weight;
            orderEntity.ShippingMethod = order.data.shipping?.method;
            orderEntity.BuyerRealName  = order.data.shipping.address.name.full;
            orderEntity.BuyerEmail     = order.data.buyer_email;
            orderEntity.Subtotal       = decimal.Parse(order.data.cost.subtotal);
            orderEntity.Deductions     = decimal.Parse(order.data.cost.credit) + decimal.Parse(order.data.cost.coupon);
            orderEntity.Shipping       = decimal.Parse(order.data.cost.shipping);
            orderEntity.ExtraCosts     = decimal.Parse(order.data.cost.salesTax) + decimal.Parse(order.data.cost.vat_amount) +
                                         decimal.Parse(order.data.cost.etc1) + decimal.Parse(order.data.cost.etc2) + decimal.Parse(order.data.cost.insurance);
            orderEntity.GrandTotal = decimal.Parse(order.data.cost.grand_total);
            orderEntity.Status     = order.data.status == "CANCELLED" ? OrderStatus.Cancelled : OrderStatus.InProgress;

            var orderItemEntities = orderItems.data
                                    .SelectMany(x => x)
                                    .Select(x => new BricklinkOrderItem
            {
                Order     = orderEntity,
                Name      = x.item.name,
                Quantity  = x.quantity,
                UnitPrice = decimal.Parse(x.unit_price_final),
                Part      = GetPartInv(x, order)
            }).ToList();

            orderEntity = _orderRepo.AddOrderWithItems(orderEntity, orderItemEntities);

            return(_orderRepo.FindOne(x => x.Id == orderEntity.Id) as Data.Entities.BricklinkOrder);

            PartInventory GetPartInv(OrderItemResponseModel item, GetOrderResponseModel ord)
            {
                var model = GetPartModel(item.inventory_id, updateInvDate: order.data.date_ordered);

                if (model != null)
                {
                    return(model.PartInventory);
                }

                model = GetPartModel(item.item.no, item.color_id, item.item.type, item.new_or_used, description: item.description);
                if (!model.InvIsPlaceHolder)
                {
                    return(model.PartInventory);
                }

                model = AddInventoryFromOrderItem(item, model);
                return(model.PartInventory);
            }
        }