private void CreateWoIssueByDetail(woPoTotal wpTotal, Session session)
        {
            XPCollection<SalesOrderLine> soLines = new XPCollection<SalesOrderLine>(session);
            soLines.Criteria = CriteriaOperator.Parse(string.Format("Item.Oid == '{0}' AND OrderStatus = '{1}' ", wpTotal.Item.Oid, SalesOrderLine.SalesOrderStatus.Active));

            SortingCollection sCollection = new SortingCollection();
            sCollection.Add(new SortProperty("PoDate", DevExpress.Xpo.DB.SortingDirection.Descending));
            sCollection.Add(new SortProperty("LineNo", DevExpress.Xpo.DB.SortingDirection.Descending));

            soLines.Sorting = sCollection;

            float remainQty = wpTotal.Wo_Po * -1;
            woIssue woIssue;

            foreach (SalesOrderLine soLine in soLines)
            {
                woIssue = new woIssue();
                woIssue.Item = soLine.Item;
                woIssue.WoNeedDate = soLine.NeedDate;

                if (soLine.NeedQty > remainQty)
                {
                    woIssue.WoNeedQty = remainQty;
                    remainQty = 0;
                }
                else
                {
                    woIssue.WoNeedQty = soLine.NeedQty;
                    remainQty = remainQty - soLine.NeedQty;
                }
                woIssue.SalesOrderLine = soLine;
                _woIssues.Add(woIssue);

                if (remainQty == 0)
                    return;
            }

            woIssue = new woIssue();
            woIssue.Item = wpTotal.Item;
            woIssue.WoNeedDate = DateTime.Today.AddDays(woIssue.Item.LeadTime);
            woIssue.WoNeedQty = remainQty;

            _woIssues.Add(woIssue);
        }
        private BindingList<woPoTotal> CalcWoPoTotal(Session session)
        {
            Dictionary<Item, woPoTotal> dictWoPo = new Dictionary<Item, woPoTotal>();
            woPoTotal woPo;

            XPCollection<SalesOrderLine> soLines = new XPCollection<SalesOrderLine>(session);

            var soList = from s in soLines
                         where (s.SalesOrder.OrderType == SalesOrder.SalesOrderType.Normal && s.OrderStatus == SalesOrderLine.SalesOrderStatus.Active && s.IgnorePlanningReport == false )
                         group s by s.Item
                         into ss
                         select new
                         { Item = ss.Key, Total = ss.Sum(s => s.NeedQty), Shipped = ss.Sum(s => s.ShipQty) };

            foreach (var sLine in soList)
            {
                woPo = new woPoTotal();  //new woPoTotal(session);
                woPo.Item = sLine.Item;
                woPo.poTotal = sLine.Total;
                woPo.poShipped = sLine.Shipped;
                dictWoPo.Add(woPo.Item, woPo);
            }

            var sstkList = from s in soLines
                           where s.SalesOrder.OrderType == SalesOrder.SalesOrderType.SSTK && s.OrderStatus == SalesOrderLine.SalesOrderStatus.Active && s.IgnorePlanningReport == false
                           group s by s.Item
                           into ss
                           select new
                           { Item = ss.Key, Total = ss.Sum(s => s.NeedQty) };

            foreach (var sLine in sstkList)
            {
                if (dictWoPo.ContainsKey(sLine.Item))
                {
                    woPo = dictWoPo[sLine.Item];
                    woPo.sstkQty = sLine.Total;
                }
                else
                {
                    woPo = new woPoTotal();  // new woPoTotal(session);
                    woPo.Item = sLine.Item;
                    woPo.sstkQty = sLine.Total;
                    dictWoPo.Add(woPo.Item, woPo);
                }
            }

            XPCollection<WorkOrder> wos = new XPCollection<WorkOrder>(session);

            var woList = from s in wos
                         group s by s.Item
                         into ss
                         select new
                         { Item = ss.Key, Total = ss.Sum(s => s.NeedQty) };

            foreach (var woLine in woList)
            {
                if (dictWoPo.ContainsKey(woLine.Item))
                {
                    woPo = dictWoPo[woLine.Item];
                    woPo.woTotal = woLine.Total;
                }
                else
                {
                    woPo = new woPoTotal();  // new woPoTotal(session);
                    woPo.Item = woLine.Item;
                    woPo.woTotal = woLine.Total;
                    dictWoPo.Add(woPo.Item, woPo);
                }
            }

            BindingList<woPoTotal> woPoTotals = new BindingList<woPoTotal>();
            _woIssues = new BindingList<woIssue>();

            foreach (KeyValuePair<Item, woPoTotal> woPoTotal in dictWoPo)
            {
                woPoTotals.Add(woPoTotal.Value);

                woPoTotal wpTotal = (woPoTotal)woPoTotal.Value;

                if (wpTotal.Wo_Po < 0)
                {
                    if (PostByPO)
                    {
                        this.CreateWoIssueByDetail(wpTotal, session);
                    }
                    else
                    {
                        this.CreateWoIssue(wpTotal);
                    }
                }
            }

            foreach (woPoTotal woPoTotal in woPoTotals)
            {
                WHTotal whTotal = WHTotal.Find(woPoTotal.Item, Warehouse, session);

                if (whTotal != null)
                    woPoTotal.WarehouseQty = whTotal.AvailQty;

            }

            return woPoTotals;
        }
        private void CreateWoIssue(woPoTotal wpTotal)
        {
            woIssue woIssue = new woIssue();
            woIssue.Item = wpTotal.Item;
            woIssue.WoNeedDate = DateTime.Today.AddDays(woIssue.Item.LeadTime);
            woIssue.WoNeedQty = wpTotal.Wo_Po * -1;

            _woIssues.Add(woIssue);
        }
        private BindingList<PurchOrderReturn> CalcPurchOrderReturn(Session session)
        {
            Dictionary<Item, woPoTotal> dictWoPo = new Dictionary<Item, woPoTotal>();
            woPoTotal woPo;

            BindingList<PurchOrderReturn> poReturns = new BindingList<PurchOrderReturn>();
            XPCollection<SalesOrderLine> soLines = new XPCollection<SalesOrderLine>(session);

            var soList = from s in soLines
                         where (s.SalesOrder.OrderType == SalesOrder.SalesOrderType.Normal && s.OrderStatus == SalesOrderLine.SalesOrderStatus.Active && s.IgnorePlanningReport == false)
                         group s by s.Item
                         into ss
                         select new
                         { Item = ss.Key, Total = ss.Sum(s => s.NeedQty), Shipped = ss.Sum(s => s.ShipQty) };

            foreach (var sLine in soList)
            {
                //woPo = new woPoTotal(session);
                woPo = new woPoTotal();
                woPo.Item = sLine.Item;
                woPo.poTotal = sLine.Total;
                woPo.poShipped = sLine.Shipped;
                dictWoPo.Add(woPo.Item, woPo);
            }

            return poReturns;
        }