public static List <DeliveryBlocksProperty> getDelBlockListCZ01(IDataCollectorServer dataCollectorServer, IDataCollectorSap dataCollectorSap, string salesOrg, string id)
        {
            List <ZV04HNProperty>       zvHNList = dataCollectorSap.getZV04HNList(salesOrg, IDAEnum.Task.deliveryBlocks);
            List <CustomerDataProperty> cdList   = dataCollectorServer.getCustomerDataList(salesOrg);

            List <DeliveryBlocksProperty> joinedList = getJoinedList(id, zvHNList, cdList)
                                                       .Where(x => (x.orderStatus.ToLower() == "open order" || x.orderStatus.ToLower() == "credit hold"))
                                                       .ToList();

            List <DeliveryBlocksProperty> blockList = getBlockList(joinedList);

            //get previously blocked orders from log
            List <DeliveryBlocksProperty> prevDelBlockList = dataCollectorServer.getDelBlockLogList(salesOrg);
            List <int> preOrdersBlockedList = prevDelBlockList.Select(x => x.orderNumber).ToList();

            //remove previously blocked orders that have been unblocked by users in order to not reapply blocks
            blockList.RemoveAll(x => preOrdersBlockedList.Contains(x.orderNumber));

            List <DeliveryBlocksProperty> unBlockList = getUnBlockList(joinedList);

            List <DeliveryBlocksProperty> finalList = new List <DeliveryBlocksProperty>();

            finalList.AddRange(blockList);
            finalList.AddRange(unBlockList);

            return(finalList);
        }
        /// <summary>
        /// Delivery blocks in Germany are applied on orders that either dont meet the minimum order value or quantity
        /// Orders on block Y2 & Z9 are ignored
        /// Those orders are blocked wih delivery block code ZF
        /// Exception to this rule is if the order has a display sku. Those sku's had "DP" or "DISPLAY" in the description. ZF block for them is removed
        /// If the order is already blocked with ZF but has had it quantiy or/and value changed to the qualifying amount the delivery block is lifted
        /// Also checks if the block has been lifted previously by user and does not reapply blocks 2nd time
        /// </summary>
        /// <param name="dataCollectorServer"></param>
        /// <param name="dataCollectorSap"></param>
        /// <param name="salesOrg"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public static List <DeliveryBlocksProperty> getDelBlockListDE01(IDataCollectorServer dataCollectorServer, IDataCollectorSap dataCollectorSap, string salesOrg, string id)
        {
            List <ZV04IProperty> zvIList = dataCollectorSap.getZV04IList(salesOrg, IDAEnum.Task.deliveryBlocks);

            List <ZV04HNProperty> zvHNList = dataCollectorSap.getZV04HNList(salesOrg, IDAEnum.Task.deliveryBlocks);

            if (zvIList is null)
            {
                return(null);
            }

            zvHNList = zvHNList
                       .Where(x => (x.status.ToLower() == "open order" || x.status.ToLower() == "credit hold") &&
                              x.delBlock != IDAConsts.DelBlocks.investigationPendingBlock &&
                              x.delBlock != IDAConsts.DelBlocks.leadTimeBlock)
                       .ToList();

            List <CustomerDataProperty> cdList = dataCollectorServer.getCustomerDataList(salesOrg);

            List <DeliveryBlocksProperty> joinedList = getJoinedList(id, zvIList, zvHNList, cdList);

            List <DeliveryBlocksProperty> groupedList = getGroupedList(joinedList);

            List <DeliveryBlocksProperty> blockList = getBlockList(groupedList);

            //get previously blocked orders from log
            List <DeliveryBlocksProperty> blockedOrdersFromFromLogList = dataCollectorServer.getDelBlockLogList(salesOrg);
            List <int> previouslyBlockedOrderList = blockedOrdersFromFromLogList.Select(x => x.orderNumber).ToList();

            //remove previously blocked orders that have been unblocked by users in order to not reapply blocks
            blockList.RemoveAll(x => previouslyBlockedOrderList.Contains(x.orderNumber));

            List <OrderWithDisplays> orderWithDisplaysList = (from zvi in zvIList
                                                              where (zvi.materialDescription.ToUpper().Contains("DP") || zvi.materialDescription.ToUpper().Contains("DISPLAY")) &&
                                                              (zvi.status.ToLower() == "open order" || zvi.status.ToLower() == "credit hold") &&
                                                              zvi.delBlock == IDAConsts.DelBlocks.belowMOQDelBlock
                                                              group zvi by zvi.order into g
                                                              select new OrderWithDisplays(g.Key)
                                                              )
                                                             .Distinct()
                                                             .ToList();

            //remove orders with displays from blocklist
            blockList = blockList.Where(x => orderWithDisplaysList.Any(y => y.orderNumber != x.orderNumber)).ToList();

            List <DeliveryBlocksProperty> unBlockList = getUnBlockList(groupedList, orderWithDisplaysList);

            List <DeliveryBlocksProperty> finalList = new List <DeliveryBlocksProperty>();

            finalList.AddRange(blockList);
            finalList.AddRange(unBlockList);

            return(finalList);
        }