public static Order SaveOrderToDB(int Status, int userID, int? orderID, int facilityID, int paymentType,
                                       int modeID, string remarks, string letterNumber, string contactPerson,
                                       DataView _dvOrderTable)
        {
            MyGeneration.dOOdads.TransactionMgr mgr = MyGeneration.dOOdads.TransactionMgr.ThreadTransactionMgr();
            try
            {
                mgr.BeginTransaction();
                BLL.Order or = new BLL.Order();
                if (orderID == null)
                {
                    or.AddNew();
                    or.RefNo = Order.GetNextOrderReference();
                    or.OrderTypeID = OrderType.CONSTANTS.STANDARD_ORDER;
                    or.FiscalYearID = FiscalYear.Current.ID;
                }
                else
                {
                    or.LoadByPrimaryKey(orderID.Value);
                }

                var oldOrderStatus = or.IsColumnNull("OrderStatusID") ? (int?)null : or.OrderStatusID;
                or.OrderStatusID = Status;
                or.RequisitionTypeID = RequisitionType.CONSTANTS.DEMAND;
                or.Remark = remarks;

                or.EurDate = or.Date = DateTimeHelper.ServerDateTime; //Both fields are assigned dates.
                or.RequestedBy = facilityID;
                or.FilledBy = userID;
                or.LetterNo = letterNumber;
                or.PaymentTypeID = paymentType;
                or.ContactPerson = contactPerson;
                or.FromStore = modeID;

                or.Save();
                or.LogRequisitionStatus(or.ID, oldOrderStatus, Status, CurrentContext.UserId); //Log OrderStatus Change

                // this is a kind of initializing the data table.
                OrderDetail ord = new OrderDetail();
                foreach (DataRowView r in _dvOrderTable)
                {
                    int itemID = Convert.ToInt32(r["ItemID"]);
                    int unitID = Convert.ToInt32(r["UnitID"]);

                    ord.LoadByItemUnit(or.ID, itemID, unitID);
                    if (ord.RowCount == 0)
                    {
                        ord.AddNew();
                    }
                    ord.OrderID = or.ID;
                    ord.ItemID = itemID;
                    if (r["Pack"] != DBNull.Value)
                    {
                        ord.Pack = Convert.ToDecimal(r["Pack"]);
                    }
                    if (r["QtyPerPack"] != DBNull.Value)
                    {
                        ord.QtyPerPack = Convert.ToInt32(r["QtyPerPack"]);
                    }

                    if (r["StockOnHand"] != DBNull.Value)
                    {
                        ord.StockOnHand = Convert.ToDecimal(r["StockOnHand"]);
                    }

                    //if (r["ExpiredStock"] != DBNull.Value)
                    //{
                    //    ord.ExpiredStock = Convert.ToDecimal(r["ExpiredStock"]);
                    //}

                    //if (r["DamagedStock"] != DBNull.Value)
                    //{
                    //    ord.DamagedStock = Convert.ToDecimal(r["DamagedStock"]);
                    //}
                    ord.Quantity = Convert.ToDecimal(r["Quantity"]);
                    ord.UnitID = unitID;
                    //ord.StoreID = or.FromStore;
                    ord.Save();
                }
                //this.LogActivity("Save-Requisition", ord.ID);
                mgr.CommitTransaction();

                return or;
            }
            catch (Exception exp)
            {
                mgr.RollbackTransaction();
                throw;
            }
            //ResetOrder();
        }
        public static int SavePLITSApprovedOrderToDatabase(int Status, int userID, int? plitsOrderID, int facilityID, int paymentType,
                                              int modeID, string remarks, string letterNumber, string contactPerson,
                                              BLL.OrderDetail _PLITSOrderDetail)
        {
            int hcmisorderid;
            MyGeneration.dOOdads.TransactionMgr mgr = MyGeneration.dOOdads.TransactionMgr.ThreadTransactionMgr();
            try
            {
                mgr.BeginTransaction();
                BLL.Order or = new BLL.Order();

                or.AddNew();
                or.RefNo = Order.GetNextOrderReference();
                or.OrderTypeID = OrderType.CONSTANTS.PLITS;
                or.HCTSReferenceID = plitsOrderID.Value;

                or.OrderStatusID = Status;

                or.RequisitionTypeID = RequisitionType.CONSTANTS.DEMAND;
                or.Remark = remarks;

                or.EurDate = or.Date = DateTimeHelper.ServerDateTime; //Both fields are assigned dates.
                var institution = new Institution();
                institution.LoadBySN(facilityID);
                or.RequestedBy = institution.ID;
                or.FilledBy = userID;
                or.LetterNo = letterNumber;
                or.PaymentTypeID = paymentType;
                or.ContactPerson = contactPerson;
                or.FromStore = modeID;
                or.FiscalYearID = FiscalYear.Current.ID;
                or.Save();
                or.LogRequisitionStatus(or.ID,null,Status, CurrentContext.UserId); //Log OrderStatus change

                _PLITSOrderDetail.Rewind();
                while (!_PLITSOrderDetail.EOF)
                {
                    _PLITSOrderDetail.OrderID = or.ID;

                    _PLITSOrderDetail.MoveNext();
                }
                _PLITSOrderDetail.Save();

                hcmisorderid = or.ID;
                //this.LogActivity("Save-Requisition", ord.ID);
                mgr.CommitTransaction();

            }
            catch (Exception exp)
            {
                mgr.RollbackTransaction();
                return 0;
                throw (exp);
            }
            //ResetOrder();
            return hcmisorderid;
        }
        //~ This Method is Obsoleted ~//
        public static bool SaveBackOrderToDatabase(BLL.Order _order)
        {
            var _orderDetail = new OrderDetail();
            _orderDetail.LoadAllByOrderID(_order.ID);

            MyGeneration.dOOdads.TransactionMgr mgr = MyGeneration.dOOdads.TransactionMgr.ThreadTransactionMgr();
            try
            {
                mgr.BeginTransaction();
                var or = new BLL.Order();

                or.AddNew();
                or.RefNo = Order.GetNextOrderReference();
                or.SetColumn("OrderTypeID", _order.GetColumn("OrderTypeID"));
                or.SetColumn("HCTSReferenceID", _order.GetColumn("HCTSReferenceID"));

                or.OrderStatusID = OrderStatus.Constant.DRAFT_WISHLIST;
                or.RequisitionTypeID = RequisitionType.CONSTANTS.DEMAND;
                or.Remark = _order.ID.ToString(); //Store the Original ID here for the backorder.  We need to have a standard way of marking backorders.

                or.EurDate = or.Date = DateTimeHelper.ServerDateTime; //Both fields are assigned dates.
                or.RequestedBy = _order.RequestedBy;
                or.FilledBy = _order.FilledBy;
                or.LetterNo = _order.LetterNo;
                or.PaymentTypeID = _order.PaymentTypeID;
                or.ContactPerson = _order.ContactPerson;
                or.FromStore = _order.FromStore;
                or.FiscalYearID = FiscalYear.Current.ID;
                or.OrderTypeID = _order.OrderTypeID == OrderType.CONSTANTS.PLITS
                                     ? _order.OrderTypeID
                                     : OrderType.CONSTANTS.BACK_ORDER;

                or.Save();
                or.LogRequisitionStatus(or.ID,null,OrderStatus.Constant.DRAFT_WISHLIST,CurrentContext.UserId);
                _orderDetail.Rewind();
                var orderDetail = new OrderDetail();

                while (!_orderDetail.EOF)
                {
                    if (_orderDetail.ApprovedQuantity >= _orderDetail.Quantity)
                    {
                        _orderDetail.MoveNext();
                        continue; //Backorder is only for those with approved quantity less than the requested quantity.
                    }
                    orderDetail.AddNew();
                    orderDetail.ItemID = _orderDetail.ItemID;
                    orderDetail.OrderID = or.ID;
                    orderDetail.Pack = (_orderDetail.Quantity - _orderDetail.ApprovedQuantity) /
                                       _orderDetail.QtyPerPack;
                    orderDetail.QtyPerPack = _orderDetail.QtyPerPack;
                    orderDetail.Quantity = orderDetail.Pack * orderDetail.QtyPerPack;
                    orderDetail.SetColumn("HACTOrderDetailID", _orderDetail.GetColumn("HACTOrderDetailID"));
                    orderDetail.UnitID = _orderDetail.UnitID;

                    _orderDetail.MoveNext();
                }

                orderDetail.Save();
                mgr.CommitTransaction();
                return true;
            }
            catch (Exception exp)
            {
                mgr.RollbackTransaction();
                return false;
            }
        }