示例#1
0
        //ChangeTable - Change Order From Table to Table
        void _buttonKeyChangeTable_Clicked(object sender, EventArgs e)
        {
            PosTablesDialog dialog   = new PosTablesDialog(this.SourceWindow, DialogFlags.DestroyWithParent, TableFilterMode.OnlyFreeTables);
            ResponseType    response = (ResponseType)dialog.Run();

            if (response == ResponseType.Ok || response == ResponseType.Cancel || response == ResponseType.DeleteEvent)
            {
                if (response == ResponseType.Ok)
                {
                    OrderMain currentOrderMain            = GlobalFramework.SessionApp.OrdersMain[GlobalFramework.SessionApp.CurrentOrderMainOid];
                    POS_ConfigurationPlaceTable xOldTable = (POS_ConfigurationPlaceTable)FrameworkUtils.GetXPGuidObject(typeof(POS_ConfigurationPlaceTable), currentOrderMain.Table.Oid);
                    POS_ConfigurationPlaceTable xNewTable = (POS_ConfigurationPlaceTable)FrameworkUtils.GetXPGuidObject(typeof(POS_ConfigurationPlaceTable), dialog.CurrentTableOid);
                    //Require to Prevent A first chance exception of type 'DevExpress.Xpo.DB.Exceptions.LockingException' occurred in DevExpress.Xpo.v13.2.dll when it is Changed in Diferent Session ex UnitOfWork
                    //TODO: Confirm working with Reload Commented
                    //xOldTable.Reload();
                    //xNewTable.Reload();

                    if (xNewTable.TableStatus != TableStatus.Free)
                    {
                        Utils.ShowMessageTouch(
                            GlobalApp.WindowPos, DialogFlags.Modal, MessageType.Warning, ButtonsType.Ok, Resx.global_error,
                            Resx.dialog_message_table_is_not_free
                            );
                    }
                    else
                    {
                        //Put Old table Status to Free
                        xOldTable.TableStatus = TableStatus.Free;
                        xOldTable.Save();
                        FrameworkUtils.Audit("TABLE_OPEN", string.Format(Resx.audit_message_table_open, xOldTable.Designation));

                        //Put New table Status to Open
                        xNewTable.TableStatus = TableStatus.Open;
                        xNewTable.Save();
                        FrameworkUtils.Audit("TABLE_CLOSE", string.Format(Resx.audit_message_table_close, xNewTable.Designation));

                        //Change DocumentOrderMain table, If OpenOrder Exists in That table
                        Guid documentOrderMainOid = currentOrderMain.GetOpenTableFieldValueGuid(xOldTable.Oid, "Oid");
                        FIN_DocumentOrderMain xDocumentOrderMain = (FIN_DocumentOrderMain)FrameworkUtils.GetXPGuidObject(typeof(FIN_DocumentOrderMain), documentOrderMainOid);
                        if (xDocumentOrderMain != null)
                        {
                            xDocumentOrderMain.PlaceTable = xNewTable;
                            xDocumentOrderMain.UpdatedAt  = FrameworkUtils.CurrentDateTimeAtomic();
                            xDocumentOrderMain.Save();
                        }
                        //Assign Session Data
                        currentOrderMain.Table.Oid       = xNewTable.Oid;
                        currentOrderMain.Table.Name      = xNewTable.Designation;
                        currentOrderMain.Table.PriceType = (PriceType)xNewTable.Place.PriceType.EnumValue;
                        currentOrderMain.OrderTickets[currentOrderMain.CurrentTicketId].PriceType = (PriceType)xNewTable.Place.PriceType.EnumValue;
                        currentOrderMain.Table.PlaceId = xNewTable.Place.Oid;
                        GlobalFramework.SessionApp.Write();
                        //Finally Update Status Bar, Table Name, Totals Etc
                        UpdateOrderStatusBar();
                    }
                }
                dialog.Destroy();
            }
            ;
        }
示例#2
0
        //Change and Persist TableStatus
        public void ChangeTableStatus(Guid pTableOid, TableStatus pTableStatus)
        {
            //Get Target Table
            POS_ConfigurationPlaceTable xTable = (POS_ConfigurationPlaceTable)FrameworkUtils.GetXPGuidObject(typeof(POS_ConfigurationPlaceTable), pTableOid);

            //_log.Debug(string.Format("1 pTableStatus: [{0}] [{1}]", xTable.Designation, pTableStatus));

            if (pTableStatus == TableStatus.Reserved)
            {
                _labelTotalOrStatus.Text             = Resx.global_reserved_table;
                _eventBoxTotalOrStatus.VisibleWindow = true;
                SetBackgroundColor(_colorPosTablePadTableTableStatusReservedButtonBackground, _eventBoxTotalOrStatus);
                xTable.TableStatus = TableStatus.Reserved;
                FrameworkUtils.Audit("TABLE_RESERVED", string.Format(Resx.audit_message_table_reserved, xTable.Designation));
            }
            else
            {
                _labelTotalOrStatus.Text             = string.Empty;
                _eventBoxTotalOrStatus.VisibleWindow = false;
                SetBackgroundColor(_buttonColor, _eventBoxTotalOrStatus);
                xTable.TableStatus = TableStatus.Free;
                FrameworkUtils.Audit("TABLE_UNRESERVED", string.Format(Resx.audit_message_table_unreserved, xTable.Designation));
            }
            //_log.Debug(string.Format("1 pTableStatus: [{0}] [{1}]", xTable.Designation, pTableStatus));
            //Update Status State
            _tableStatus = pTableStatus;
            //Persist in DB
            xTable.Save();
        }
示例#3
0
 //Constructor without Json.NET Load, With Defaults
 public OrderMainTable(Guid pOrderMainOid, Guid pTableOid)
 {
     _orderMainOid = pOrderMainOid;
     _oid          = pTableOid;
     try
     {
         POS_ConfigurationPlaceTable table = (POS_ConfigurationPlaceTable)FrameworkUtils.GetXPGuidObject(typeof(POS_ConfigurationPlaceTable), pTableOid);
         _name = table.Designation;
         //Enum is not Zero Indexed
         _priceType = (PriceType)table.Place.PriceType.EnumValue;
         _placeId   = table.Place.Oid;
     }
     catch (Exception ex)
     {
         _log.Error(ex.Message, ex);
     }
 }
        //XpoMode
        public TreeViewConfigurationPlaceTable(Window pSourceWindow, XPGuidObject pDefaultValue, CriteriaOperator pXpoCriteria, Type pDialogType, GenericTreeViewMode pGenericTreeViewMode = GenericTreeViewMode.Default, GenericTreeViewNavigatorMode pGenericTreeViewNavigatorMode = GenericTreeViewNavigatorMode.Default)
        {
            //Init Vars
            Type xpoGuidObjectType = typeof(POS_ConfigurationPlaceTable);
            //Override Default Value with Parameter Default Value, this way we can have diferent Default Values for GenericTreeView
            POS_ConfigurationPlaceTable defaultValue = (pDefaultValue != null) ? pDefaultValue as POS_ConfigurationPlaceTable : null;
            //Override Default DialogType with Parameter Dialog Type, this way we can have diferent DialogTypes for GenericTreeView
            Type typeDialogClass = (pDialogType != null) ? pDialogType : typeof(DialogConfigurationPlaceTable);

            //Configure columnProperties
            List <GenericTreeViewColumnProperty> columnProperties = new List <GenericTreeViewColumnProperty>();

            columnProperties.Add(new GenericTreeViewColumnProperty("Code")
            {
                Title = Resx.global_record_code, MinWidth = 100
            });
            columnProperties.Add(new GenericTreeViewColumnProperty("Designation")
            {
                Title = Resx.global_designation, Expand = true
            });
            columnProperties.Add(new GenericTreeViewColumnProperty("Place")
            {
                Title = Resx.global_ConfigurationPlaceTablePlace, ChildName = "Designation", MinWidth = 150
            });
            columnProperties.Add(new GenericTreeViewColumnProperty("UpdatedAt")
            {
                Title = Resx.global_record_date_updated, MinWidth = 150, MaxWidth = 150
            });

            //Configure Criteria/XPCollection/Model
            //CriteriaOperator.Parse("Code >= 100 and Code <= 9999");
            CriteriaOperator criteria      = pXpoCriteria;
            XPCollection     xpoCollection = new XPCollection(GlobalFramework.SessionXpo, xpoGuidObjectType, criteria);

            //Call Base Initializer
            base.InitObject(
                pSourceWindow,                 //Pass parameter
                defaultValue,                  //Pass parameter
                pGenericTreeViewMode,          //Pass parameter
                pGenericTreeViewNavigatorMode, //Pass parameter
                columnProperties,              //Created Here
                xpoCollection,                 //Created Here
                typeDialogClass                //Created Here
                );
        }
示例#5
0
        /// <summary>
        /// Get Total of All Persistent Tickets (Without PartialPayments), Used to Update StatusBar, And Update OrderMain main Object
        /// </summary>
        public void UpdateTotals()
        {
            try
            {
                /* METHOD #2 : From Article Bag
                 * //OrderMain orderMain = GlobalFramework.SessionApp.OrdersMain[GlobalFramework.SessionApp.CurrentOrderMainOid];
                 */
                ArticleBag articleBag = ArticleBag.TicketOrderToArticleBag(this);

                //sqlTotalTickets
                string sqlTotalTickets = string.Format(@"
                    SELECT 
                        COUNT(*) AS TotalTickets    
                    FROM 
                        fin_documentorderticket
                    WHERE 
                        OrderMain = '{0}'
                ;"
                                                       , this.PersistentOid
                                                       );
                var totalTickets = GlobalFramework.SessionXpo.ExecuteScalar(sqlTotalTickets);

                //Assign Totals
                _globalTotalTickets  = (totalTickets != null) ? Convert.ToInt32(totalTickets) : 0;
                _globalTotalGross    = articleBag.TotalFinal;
                _globalTotalDiscount = articleBag.TotalDiscount;
                _globalTotalTax      = articleBag.TotalTax;
                _globalTotalFinal    = articleBag.TotalFinal;
                _globalTotalQuantity = articleBag.TotalQuantity;
                //Persist Final TotalOpen
                POS_ConfigurationPlaceTable currentTable = (POS_ConfigurationPlaceTable)FrameworkUtils.GetXPGuidObject(typeof(POS_ConfigurationPlaceTable), _table.Oid);
                //Required Reload, after ProcessFinanceDocument uowSession, else we get cached object, and apply changes to old object, ex we get a OpenedTable vs a ClosedTable by uowSession
                currentTable.Reload();
                currentTable.TotalOpen = _globalTotalFinal;
                currentTable.Save();
            }
            catch (Exception ex)
            {
                _log.Error(ex.Message, ex);
            }

            /* METHOD 3 : When we Change table it dont Update GlobalDiscounts
             * //Get Total Order (Payed/Invoiced and NonPayed)
             * string sqlTotalViewOrders = string.Format(@"
             * SELECT
             *  SUM(ddTotalGross) AS TotalGross,
             *  SUM(ddTotalDiscount) AS TotalDiscount,
             *  SUM(ddTotalTax) AS TotalTax,
             *  SUM(ddTotalFinal) AS TotalFinal,
             *  SUM(ddQuantity) AS TotalQuantity
             * FROM
             *  view_orders
             * WHERE
             *  dmOid = '{0}'
             * ORDER BY
             *  dtTicketId,ddOrd;
             * ;"
             * , this.PersistentOid
             * );
             *
             * string sqlTotalViewDocumentFinance = string.Format(@"
             * SELECT
             *    SUM(fdTotalGross) AS TotalGross,
             *  SUM(fdTotalDiscount) AS TotalDiscount,
             *  SUM(fdTotalTax) AS TotalTax,
             *  SUM(fdTotalFinal) AS TotalFinal,
             *  SUM(fdQuantity) AS TotalQuantity
             * FROM
             *    view_documentfinance
             * WHERE
             *    fmSourceOrderMain = '{0}'
             * ;"
             * , this.PersistentOid
             * );
             *
             * string sqlTotalTickets = string.Format(@"
             * SELECT
             *  COUNT(*) AS TotalTickets
             * FROM
             *  fin_documentorderticket
             * WHERE
             *  OrderMain = '{0}'
             * ;"
             * , this.PersistentOid
             * );
             *
             * try
             * {
             * XPSelectData sdTotalViewOrders = FrameworkUtils.GetSelectedDataFromQuery(sqlTotalViewOrders);
             * XPSelectData sdTotalViewDocumentFinance = FrameworkUtils.GetSelectedDataFromQuery(sqlTotalViewDocumentFinance);
             *
             * if (sdTotalViewOrders.Data.Length > 0 && sdTotalViewDocumentFinance.Data.Length > 0)
             * {
             *  //TotalGross
             *  _globalTotalGross =
             *    Convert.ToDecimal(sdTotalViewOrders.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalGross")]) -
             *    Convert.ToDecimal(sdTotalViewDocumentFinance.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalGross")]);
             *  //TotalDiscount
             *  _globalTotalDiscount =
             *    Convert.ToDecimal(sdTotalViewOrders.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalDiscount")]) -
             *    Convert.ToDecimal(sdTotalViewDocumentFinance.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalDiscount")]);
             *  //TotalTax
             *  _globalTotalTax =
             *    Convert.ToDecimal(sdTotalViewOrders.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalTax")]) -
             *    Convert.ToDecimal(sdTotalViewDocumentFinance.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalTax")]);
             *  //TotalFinal
             *  _globalTotalFinal =
             *    Convert.ToDecimal(sdTotalViewOrders.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalFinal")]) -
             *    Convert.ToDecimal(sdTotalViewDocumentFinance.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalFinal")]);
             *  //TotalQuantity
             *  _globalTotalQuantity =
             *    Convert.ToDecimal(sdTotalViewOrders.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalQuantity")]) -
             *    Convert.ToDecimal(sdTotalViewDocumentFinance.Data[0].Values[sdTotalViewOrders.GetFieldIndex("TotalQuantity")]);
             * }
             *
             * //sqlTotalTickets
             * var totalTickets = GlobalFramework.SessionXpo.ExecuteScalar(sqlTotalTickets);
             * _globalTotalTickets = (totalTickets != null) ? Convert.ToInt32(totalTickets) : 0;
             *
             * //Persist Final TotalOpen
             * ConfigurationPlaceTable currentTable = (ConfigurationPlaceTable)FrameworkUtils.GetXPGuidObjectFromSession(typeof(ConfigurationPlaceTable), _table.Oid);
             * currentTable.TotalOpen = _globalTotalFinal;
             * currentTable.Save();
             * }
             * catch (Exception ex)
             * {
             * _log.Error(ex.Message, ex);
             * }
             */

            /* OLD DEPRECATED METHOD #1 : Bugged In Orders with PartialPayments
             * bool debug = false;
             *
             * //Settings
             *
             * //Always Reset Totals, With Persistent and Non Persistent Orders
             * _globalNumOfTickets = 0;
             * _globalTotalGross = 0;
             * _globalTotalDiscount = 0;
             * _globalTotalTax = 0;
             * _globalTotalFinal = 0;
             *
             * //Get Current _persistentOid and _orderStatus from Database
             * _persistentOid = GetOpenTableFieldValueGuid(_table.Oid, "Oid");
             * _orderStatus = (OrderStatus)GetOpenTableFieldValue(_table.Oid, "OrderStatus");
             *
             * if (_persistentOid != Guid.Empty)
             * {
             * CriteriaOperator binaryOperator = new BinaryOperator("OrderMain", _persistentOid, BinaryOperatorType.Equal);
             * XPCollection _xpcDocumentOrderTicket = new XPCollection(GlobalFramework.SessionXpo, typeof(DocumentOrderTicket), binaryOperator);
             *
             * //Required to ByPass Cache
             * _xpcDocumentOrderTicket.Reload();
             *
             * //Process DocumentOrderTickets Totals
             * if (_xpcDocumentOrderTicket.Count > 0)
             * {
             *  foreach (DocumentOrderTicket ticket in _xpcDocumentOrderTicket)
             *  {
             *    //Required to ByPass Cache
             *    ticket.OrderDetail.Reload();
             *
             *    //Increase Ticket
             *    _globalNumOfTickets++;
             *
             *    foreach (DocumentOrderDetail line in ticket.OrderDetail)
             *    {
             *      _globalTotalGross += line.TotalGross;
             *      _globalTotalDiscount += line.TotalDiscount;
             *      _globalTotalTax += line.TotalTax;
             *      _globalTotalFinal += line.TotalFinal;
             *      if (debug) _log.Debug(string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}", line.Article.Oid, line.Designation, line.Price, line.Quantity, line.Discount, line.Vat));
             *    }
             *    _globalLastUser = ticket.UpdatedBy;
             *    _globalLastTerminal = ticket.UpdatedWhere;
             *  }
             * }
             *
             * //Process PartialPayed Items and Discount its Totals
             * CriteriaOperator binaryOperatorDocumentFinanceMaster = new BinaryOperator("SourceOrderMain", _persistentOid, BinaryOperatorType.Equal);
             * XPCollection _xpcDocumentFinanceMaster = new XPCollection(GlobalFramework.SessionXpo, typeof(DocumentFinanceMaster), binaryOperatorDocumentFinanceMaster);
             * if (_xpcDocumentFinanceMaster.Count > 0)
             * {
             *  foreach (DocumentFinanceMaster master in _xpcDocumentFinanceMaster)
             *  {
             *    //SEARCH#001 - Change here and in Other Search, to SYNC RESULTS
             *    //Only Discount items from ArticleBag if is NOT a TableConsult, in TableConsult keep Full ArticleBag From OrderMain
             *    if (master.DocumentType.Oid != new Guid(xpoOidDocumentFinanceTypeConferenceDocument))
             *    {
             *      foreach (DocumentFinanceDetail line in master.DocumentDetail)
             *      {
             *        _globalTotalGross -= line.TotalGross;
             *        _globalTotalDiscount -= line.TotalDiscount;
             *        _globalTotalTax -= line.TotalTax;
             *        _globalTotalFinal -= line.TotalFinal;
             *      }
             *    }
             *  }
             * }
             *
             * //Persist Final TotalOpen
             * ConfigurationPlaceTable currentTable = (ConfigurationPlaceTable)FrameworkUtils.GetXPGuidObjectFromSession(typeof(ConfigurationPlaceTable), _table.Oid);
             * currentTable.TotalOpen = _globalTotalFinal;
             * currentTable.Save();
             *
             * //Debug
             * //_log.Debug(string.Format("GetGlobalOrderSummary(): _table.Id:[{0}], _table.Name:[{1}]", _table.Id, _table.Name));
             * //_log.Debug(string.Format("GetGlobalOrderSummary(): _globalTotalGross [{0}]", _globalTotalGross));
             * //_log.Debug(string.Format("GetGlobalOrderSummary(): _globalTotalTax [{0}]", _globalTotalTax));
             * //_log.Debug(string.Format("GetGlobalOrderSummary(): _globalTotalDiscount [{0}]", _globalTotalDiscount));
             * //_log.Debug(string.Format("GetGlobalOrderSummary(): _globalTotalFinal [{0}]", _globalTotalFinal));
             * //_log.Debug(string.Format("GetGlobalOrderSummary(): _globalNumOfTickets [{0}]", _globalNumOfTickets));
             * //if (_globalLastUser != null) _log.Debug(string.Format("GetGlobalOrderSummary(): _globalLastUser.Name [{0}]", _globalLastUser.Name));
             * //if (_globalLastTerminal != null) _log.Debug(string.Format("GetGlobalOrderSummary(): _globalLastTerminal.Designation [{0}]", _globalLastTerminal.Designation));
             * }
             */
        }
示例#6
0
        public FIN_DocumentOrderTicket FinishOrder(Session pSession, bool pPrintTicket)
        {
            //Local Vars
            DateTime currentDateTime = DateTime.Now;
            FIN_DocumentOrderMain xOrderMain;
            Session _sessionXpo = pSession;
            bool    isInUOW     = (_sessionXpo.GetType() == typeof(UnitOfWork));
            //Result
            FIN_DocumentOrderTicket xOrderTicket = null;

            //Get current Working Order from SessionApp
            OrderMain   currentOrderMain   = GlobalFramework.SessionApp.OrdersMain[GlobalFramework.SessionApp.CurrentOrderMainOid];
            OrderTicket currentOrderTicket = currentOrderMain.OrderTickets[currentOrderMain.CurrentTicketId];

            //Get Place Object to extract TaxSellType Normal|TakeWay
            POS_ConfigurationPlace configurationPlace = (POS_ConfigurationPlace)GlobalFramework.SessionXpo.GetObjectByKey(typeof(POS_ConfigurationPlace), currentOrderMain.Table.PlaceId);
            //Use VatDirectSelling if in Retail or in TakeWay mode
            TaxSellType taxSellType = (configurationPlace.MovementType.VatDirectSelling || SettingsApp.AppMode == AppOperationMode.Retail) ? TaxSellType.TakeAway : TaxSellType.Normal;

            //Open Table on First Finish OrderTicket
            POS_ConfigurationPlaceTable xTable = (POS_ConfigurationPlaceTable)FrameworkUtils.GetXPGuidObject(_sessionXpo, typeof(POS_ConfigurationPlaceTable), _table.Oid);

            xTable.Reload();
            if (xTable.TableStatus != TableStatus.Open)
            {
                xTable.TableStatus = TableStatus.Open;
                FrameworkUtils.Audit("TABLE_OPEN", string.Format(Resx.audit_message_table_open, xTable.Designation));
                xTable.DateTableOpen = FrameworkUtils.CurrentDateTimeAtomic();
                if (!isInUOW)
                {
                    xTable.Save();
                }
            }

            //Get Current _persistentOid and _from Database
            _persistentOid = GetOpenTableFieldValueGuid(_table.Oid, "Oid");
            _orderStatus   = (OrderStatus)GetOpenTableFieldValue(_table.Oid, "OrderStatus");
            _UpdatedAt     = FrameworkUtils.CurrentDateTimeAtomic();

            //Insert
            if (_persistentOid == Guid.Empty)
            {
                //OrderMain
                xOrderMain = new FIN_DocumentOrderMain(_sessionXpo)
                {
                    //Always assign New date to Persistent Date
                    DateStart   = currentDateTime,//currentOrderMain.DateStart,
                    OrderStatus = OrderStatus.Open,
                    PlaceTable  = xTable,
                    UpdatedAt   = FrameworkUtils.CurrentDateTimeAtomic()
                };
                if (!isInUOW)
                {
                    xOrderMain.Save();
                }
                //After Save, Get Oid
                _persistentOid = xOrderMain.Oid;
                //Change to Open Status
                _orderStatus = OrderStatus.Open;
            }
            //Update
            else
            {
                xOrderMain = (FIN_DocumentOrderMain)FrameworkUtils.GetXPGuidObject(_sessionXpo, typeof(FIN_DocumentOrderMain), _persistentOid);
                if (xOrderMain.PlaceTable != xTable)
                {
                    xOrderMain.PlaceTable = xTable;
                }
                //Force Changes in Record, else UpdatedAt dont Update
                xOrderMain.UpdatedAt = FrameworkUtils.CurrentDateTimeAtomic();
                //TODO: Check if User was Automatically Updated
                //if (xOrderMain.UpdatedBy != GlobalFramework.LoggedUser) xOrderMain.UpdatedBy = GlobalFramework.LoggedUser;
                if (!isInUOW)
                {
                    xOrderMain.Save();
                }
            }

            //Create OrderTicket
            xOrderTicket = new FIN_DocumentOrderTicket(_sessionXpo)
            {
                TicketId   = currentOrderMain.CurrentTicketId,
                DateStart  = currentOrderTicket.DateStart,
                PriceType  = currentOrderTicket.PriceType,
                Discount   = xTable.Discount,
                OrderMain  = xOrderMain,
                PlaceTable = xTable
            };
            if (!isInUOW)
            {
                xOrderTicket.Save();
            }

            //Create OrderDetail
            FIN_DocumentOrderDetail xOrderDetailLine;
            FIN_Article             xArticle;
            uint    itemOrd  = 0;
            decimal priceTax = 0;

            foreach (OrderDetailLine line in currentOrderTicket.OrderDetails.Lines)
            {
                //Use Order in print tickets etc
                itemOrd++;
                xArticle = (FIN_Article)FrameworkUtils.GetXPGuidObject(_sessionXpo, typeof(FIN_Article), line.ArticleOid);
                //Get PriceTax from TaxSellType
                priceTax = (taxSellType == TaxSellType.Normal) ? xArticle.VatOnTable.Value : xArticle.VatDirectSelling.Value;

                xOrderDetailLine = new FIN_DocumentOrderDetail(_sessionXpo)
                {
                    //Values
                    Ord           = itemOrd,
                    Code          = xArticle.Code,
                    Designation   = line.Designation,
                    Quantity      = line.Properties.Quantity,
                    UnitMeasure   = xArticle.UnitMeasure.Acronym,
                    Price         = line.Properties.PriceNet,
                    Discount      = (xArticle.Discount > 0) ? xArticle.Discount : 0.0m,
                    TotalGross    = line.Properties.TotalGross,
                    TotalDiscount = line.Properties.TotalDiscount,
                    TotalTax      = line.Properties.TotalTax,
                    TotalFinal    = line.Properties.TotalFinal,
                    //Use PriceTax Normal|TakeAway
                    Vat = priceTax,
                    //XPGuidObjects
                    Article     = xArticle,
                    OrderTicket = xOrderTicket
                };

                //Detect VatExemptionReason
                if (line.Properties.VatExemptionReason != Guid.Empty)
                {
                    xOrderDetailLine.VatExemptionReason = line.Properties.VatExemptionReason;
                }

                if (!isInUOW)
                {
                    xOrderDetailLine.Save();
                }
            }
            ;

            //Clean Details and Open a New Blank Ticket in Session
            //Increment Terminal SessionApp CurrentTicketId
            _currentTicketId += 1;
            currentOrderMain.OrderTickets = new Dictionary <int, OrderTicket>();
            currentOrderMain.OrderTickets.Add(currentOrderMain.CurrentTicketId, new OrderTicket(this, _table.PriceType));

            //Finish Writing Session
            GlobalFramework.SessionApp.Write();

            return(xOrderTicket);

            //Debug
            //_log.Debug(string.Format("FinishOrder(): xOrderMain.Oid [{0}]", xOrderMain.Oid));
            //_log.Debug(string.Format("FinishOrder(): _table.OrderMainId [{0}], _currentTicketId [{1}], _table.Name [{2}]", _table.OrderMainId, _currentTicketId, _table.Name));
        }