public List<Guid> SaveToLocal(OrderExportDocument document,TransactionType type)
        {
            var savedIds = new List<Guid>();
            var result = 0;
            using (var db=new AlidiLocalImportDatabaseContext())
            {
                //Find if the ExternalRef is present in local db so that we can mark it as exported in hq,
                //So that it is never exported again
                if(db.TransactionImports.Any(p=>p.ExternalRef==document.ExternalRef))
                {
                    var confirmListBypass = new List<Guid>();
                    confirmListBypass.Add(Guid.NewGuid());
                    return confirmListBypass;
                }
                foreach (var lineItem in document.LineItems)
                {
                    var id = Guid.NewGuid();
                    var transactionImport = new TransactionImport();
                    transactionImport.Id = id;
                    transactionImport.OutletCode = document.OutletCode;
                    transactionImport.OutletName = document.OutletName;
                    transactionImport.ExternalRef = document.ExternalRef;
                    transactionImport.GenericRef = document.OrderRef;
                    //var date = Convert.ToDateTime(document.OrderDate);
                    //var date2 = DateTime.Parse(document.OrderDate);
                    transactionImport.TransactionIssueDate = document.OrderDate;
                    transactionImport.TransactionDueDate = document.OrderDueDate;
                    transactionImport.TransactionType = (int)type;

                    //LineItems
                    transactionImport.ProductCode = lineItem.ProductCode;
                    transactionImport.Quantity = lineItem.Quantity;
                    transactionImport.TotalNet = lineItem.LineItemTotalNet;
                    transactionImport.TotalVat = lineItem.VatPerUnit;
                    transactionImport.VatClass = lineItem.VatClass;
                    transactionImport.SalesmanCode = document.SalesmanCode;
                    transactionImport.LineItemValue = lineItem.Price;

                    transactionImport.ExportStatus=(int)ExportStatus.New;

                    db.TransactionImports.Add(transactionImport);
                    savedIds.Add(id);
                }
                result=db.SaveChanges();
            } 

            if (result > 0)
            {
                return savedIds;
            }
            return null;
        }
        public void MarkExportedLocal(string externalDocRef, string qbOrderTransactionId)
        {
            using (var db = new AlidiLocalImportDatabaseContext())
            {
                try
                    {
                        var orderImport = db.OrderImportLocal.FirstOrDefault(p => p.OrderExternalRef == externalDocRef);
                        if (orderImport != null)
                        {
                            orderImport.QbOrderTransactionId = qbOrderTransactionId;
                            orderImport.ExportStatus = (int) ExportStatus.Exported;
                            orderImport.DateOfExport = DateTime.Now;
                        }
                        db.SaveChanges();

                        var orderLineItems = db.OrderLineItemLocal.Where(p => p.OrderExternalRef == externalDocRef);
                        foreach (var orderLineItem in orderLineItems)
                        {
                            orderLineItem.ExportStatus = (int)ExportStatus.Exported;
                            orderLineItem.DateOfExport = DateTime.Now;
                            db.SaveChanges();
                        }

                    }
                    catch (Exception ex)
                    {

                        throw;
                    }
            }
        }
        public List<QuickBooksOrderDocLineItem> GetLineItems(string externalReference)
        {
            var docList = new List<QuickBooksOrderDocLineItem>();
            using (var db = new AlidiLocalImportDatabaseContext())
            {
                var lineItems= db.OrderLineItemLocal.Where(p => p.OrderExternalRef == externalReference).ToList();

                return lineItems.Select(MapLineItem).ToList();
            }

        }
 public List<OrderExportDocument> LoadFromDB(OrderType type)
 {
     using(var db=new AlidiLocalImportDatabaseContext())
     {
         var orders = db.OrderImportLocal.Where(p => p.OrderType == (int)type && p.ExportStatus == (int)ExportStatus.New).ToList();
         return orders.Select(Map).ToList();
         
     }
 }
        public List<Guid> SaveToLocal(OrderExportDocument document, OrderType orderType)
        {
            var savedIds = new List<Guid>();
            var result = 0;

            using (var db=new AlidiLocalImportDatabaseContext())
            {
                //Find if the ExternalRef is present in local db so that we can mark it as exported in hq,
                //So that it is never exported again
                if (db.OrderImportLocal.Any(p => p.OrderExternalRef == document.ExternalRef))
                {
                    var confirmListBypass = new List<Guid>();
                    confirmListBypass.Add(Guid.NewGuid());
                    return confirmListBypass;
                }

                var orderImport = new OrderImportLocal();
                orderImport.OrderExternalRef = document.ExternalRef;
                orderImport.OrderRef = document.OrderRef;
                orderImport.OrderType =(int) orderType;
                orderImport.OutletCode = document.OutletCode;
                orderImport.OutletName = document.OutletName;
                orderImport.OrderDate = document.OrderDate;
                orderImport.OrderDueDate = document.OrderDueDate;
                orderImport.RouteName = document.RouteName;

                orderImport.TotalDiscount = document.TotalDiscount;
                orderImport.TotalGross = document.TotalGross;
                orderImport.TotalNet = document.TotalNet;
                orderImport.TotalVat = document.TotalVat;
                orderImport.ShipToAddress = document.ShipToAddress;
                
                orderImport.DateOfImport = DateTime.Now;
                orderImport.ExportStatus = (int) ExportStatus.New;

                db.OrderImportLocal.Add(orderImport);
                db.SaveChanges();

                foreach (var item in document.LineItems)
                {
                    var id = Guid.NewGuid();
                    var orderItem = new OrderLineItemLocal();
                    orderItem.LineItemId=id;
                    orderItem.OrderExternalRef = document.ExternalRef;
                    orderItem.LineItemTotalGross = item.LineItemTotalGross;
                    orderItem.LineItemTotalNet = item.LineItemTotalNet;
                    orderItem.LineItemTotalVat = item.LineItemTotalVat;
                    orderItem.Price = item.Price;
                    orderItem.ProductCode = item.ProductCode;
                    orderItem.VatClass = item.VatClass;
                    orderItem.VatPerUnit = item.VatPerUnit;

                    orderItem.DateOfImport = DateTime.Now;
                    orderItem.ExportStatus = (int) ExportStatus.New;

                    db.OrderLineItemLocal.Add(orderItem);
                    savedIds.Add(id);
                }
                result = db.SaveChanges();
                
            }
            if(result>0)
            {
                return savedIds;
            }
            return null;
        }
        private string GetNextExternalRef(TransactionType type)
        {
            using (var db=new AlidiLocalImportDatabaseContext())
            {
//                var query = string.Format(@"SELECT top 1 ExternalRef FROM tblTransactionImports 
//                WHERE (TransactionType={0} 
//                AND ExportStatus ={1} )",
//              (int)type, (int)ExportStatus.New);

                var externalRef =db.TransactionImports.Where(p =>  p.TransactionType == (int) type && p.ExportStatus == (int)ExportStatus.New).Select(p=>p.ExternalRef).FirstOrDefault();
                return externalRef;
            }
        }
        //public List<OrderExportDocument> LoadFromDB(TransactionType type)
        //{
        //    var listOfDocs = new List<OrderExportDocument>();
        //    using (var db = new AlidiLocalDatabaseContext())
        //    {
        //        var nextRef = GetNextExternalRef(type);
        //        var docs = db.TransactionImports.Where(p => p.ExternalRef == nextRef);//.GroupBy(p=>p.ExternalRef).ToList();
        //       listOfDocs = docs.Select(Map).ToList();
        //    }

        //}

        public List<TransactionImport> LoadFromDB(TransactionType type)
        {
            List<TransactionImport> listOfDocs;
            using (var db = new AlidiLocalImportDatabaseContext())
            {
                var nextRef = GetNextExternalRef(type);
                listOfDocs = db.TransactionImports.Where(p => p.ExportStatus == (int)ExportStatus.New && p.TransactionType == (int)type).ToList();
                return listOfDocs;
                //listOfDocs = docs.Select(Map).ToList();
            }
        }
 public void MarkExportedLocal(string externalDocRef)
 {
     using (var db=new AlidiLocalImportDatabaseContext())
     {
         try
         {
             var transactions = db.TransactionImports.Where(p => p.ExternalRef == externalDocRef);
             foreach (var transactionImport in transactions)
             {
                 transactionImport.ExportStatus =(int) ExportStatus.Exported;
                 db.SaveChanges();
             }
            
         }
         catch (Exception ex)
         {
             
             throw;
         }
     }
 }