private bool HasAllShipmentsShipped(OrderOverview order)
        {
            var orderCountPerArticle = order.SalesOrder.Rows.Where(x => x.OrderRowType == Sales.OrderRowType.Product)
                                       .GroupBy(r => r.ArticleNumber).ToDictionary(g => g.Key, g => g.Sum(t => t.Quantity));
            var shippedCountPerArticle = order.Shipments.Where(x => _stateTransitionsService.GetState <Sales.Shipment>(x.SystemId) == ShipmentState.Shipped)
                                         .SelectMany(x => x.Rows.Where(r => r.OrderRowType == Sales.OrderRowType.Product))
                                         .GroupBy(r => r.ArticleNumber).ToDictionary(g => g.Key, g => g.Sum(t => t.Quantity));

            return(shippedCountPerArticle.Sum(x => x.Value) == orderCountPerArticle.Sum(x => x.Value) &&
                   orderCountPerArticle.All(x => shippedCountPerArticle.TryGetValue(x.Key, out var value) && value == x.Value));
        }
        internal OrderDetailsViewModel Build(OrderOverview orderOverview)
        {
            var order = orderOverview.SalesOrder;

            if (order == null)
            {
                return(new OrderDetailsViewModel());
            }
            var includeVat = IncludeVat(order);
            var currency   = _currencyService.Get(order.CurrencyCode);

            var            paymentOptionName  = string.Empty;
            var            shippingOptionName = string.Empty;
            DateTimeOffset?deliveryDate       = null;

            if (order.ChannelSystemId.HasValue)
            {
                var paymentOption = _orderHelperService.GetPaymentOption(order);
                paymentOptionName = paymentOption?.Name.NullIfWhiteSpace() ?? paymentOption?.Id?.ToString();

                var shippingOption = _orderHelperService.GetShippingOption(order);
                shippingOptionName = shippingOption?.Name.NullIfWhiteSpace() ?? shippingOption?.Id?.ToString();
            }

            var shippingInfo = order.ShippingInfo.FirstOrDefault();

            if (shippingInfo != null)
            {
                var shippingOption = _shippingProviderService.Get(shippingInfo.ShippingOption.ProviderId)?.Options.FirstOrDefault(x => x.Id == shippingInfo.ShippingOption.OptionId);
                if (shippingOption != null)
                {
                    deliveryDate = order.OrderDate.AddDays(shippingOption.DeliveryTimeInDays);
                }
            }

            var    orderState               = _stateTransitionsService.GetState <SalesOrder>(order.SystemId);
            var    statusTranslation        = ("sales.order.status." + orderState).AsWebsiteText();
            var    orderTotalFee            = includeVat ? order.TotalFeesIncludingVat : order.TotalFeesExcludingVat;
            var    orderTotalDiscountAmount = includeVat ? order.TotalPromotionsAndDiscountsIncludingVat : order.TotalPromotionsAndDiscountsExcludingVat;
            var    orderTotalDeliveryCost   = includeVat ? order.ShippingCostIncludingVat : order.ShippingCostExcludingVat;
            var    totalVat         = order.TotalVat;
            var    grandTotal       = order.GrandTotal;
            string organizationName = string.Empty;

            if (order.CustomerInfo.OrganizationSystemId.HasValue)
            {
                var organization = _organizationService.Get(order.CustomerInfo.OrganizationSystemId.Value);
                organizationName = organization != null ? organization.Name : order.ShippingInfo.FirstOrDefault()?.ShippingAddress.OrganizationName;
            }
            var shippingAddress = order.ShippingInfo.First()?.ShippingAddress;
            var orderDetails    = new OrderDetailsViewModel
            {
                OrderId                  = order.SystemId,
                ExternalOrderID          = order.Id,
                OrderDate                = order.OrderDate,
                OrderStatus              = orderState,
                Status                   = statusTranslation,
                OrderTotalFee            = currency.Format(orderTotalFee, true, CultureInfo.CurrentUICulture),
                OrderTotalDiscountAmount = orderTotalDiscountAmount < 0 ? currency.Format(orderTotalDiscountAmount, true, CultureInfo.CurrentUICulture) : string.Empty,
                OrderTotalDeliveryCost   = currency.Format(orderTotalDeliveryCost, true, CultureInfo.CurrentUICulture),
                OrderTotalVat            = currency.Format(totalVat, true, CultureInfo.CurrentUICulture),
                OrderGrandTotal          = currency.Format(grandTotal, true, CultureInfo.CurrentUICulture),
                OrderRows                = order.Rows.Where(x => x.OrderRowType == OrderRowType.Product).Select(x => BuildOrderRow(x, includeVat, currency, order)).ToList(),
                PaymentMethod            = paymentOptionName,
                DeliveryMethod           = shippingOptionName,
                ActualDeliveryDate       = deliveryDate,
                Deliveries               = order.ShippingInfo.Select(x => BuildDeliveryRow(orderOverview, x, includeVat, currency)).ToList(),
                CustomerInfo             = new OrderDetailsViewModel.CustomerInfoModel
                {
                    CustomerNumber = order.CustomerInfo?.CustomerNumber,
                    FirstName      = order.CustomerInfo?.FirstName,
                    LastName       = order.CustomerInfo?.LastName,
                    Address1       = shippingAddress?.Address1,
                    Zip            = shippingAddress?.ZipCode,
                    City           = shippingAddress?.City,
                    Country        = string.IsNullOrEmpty(shippingAddress?.Country) ? string.Empty : new RegionInfo(shippingAddress.Country).DisplayName
                },
                MerchantOrganizationNumber = _personStorage.CurrentSelectedOrganization?.Id,
                CompanyName = organizationName
            };

            return(orderDetails);
        }