/// <summary>
        /// Get Customer
        /// </summary>
        /// <param name="customerID"></param>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public Customer GetCustomer(Guid customerID, out TransactionalInformation transaction)
        {
            transaction = new TransactionalInformation();

            Customer customer = new Customer();

            try
            {
                customersDataService.CreateSession();
                customer = customersDataService.GetCustomer(customerID);
                transaction.ReturnStatus = true;
            }
            catch (Exception ex)
            {
                transaction.ReturnMessage = new List<string>();
                string errorMessage = ex.Message;
                transaction.ReturnStatus = false;
                transaction.ReturnMessage.Add(errorMessage);
            }
            finally
            {
                customersDataService.CloseSession();
            }

            return customer;

        }
 public OrdersApiModel()
 {
     Order = new Order();
     OrderDetail = new OrderDetail();
     Customer = new Customer();
     Orders = new List<OrderInquiry>();
     Shippers = new List<Shipper>();
     OrderDetails = new List<OrderDetails>();
 }
        /// <summary>
        /// Create Customer
        /// </summary>
        /// <param name="customer"></param>
        public void CreateCustomer(Customer customer)
        {
            customer.CustomerID = Guid.NewGuid();
            DateTime now = DateTime.Now;
            customer.DateCreated = now;
            customer.DateUpdated = now;

            dbConnection.Customers.Add(customer);

        }
        public void ValidateCustomerUpdate(Customer customer, ICustomersDataService dataService)
        {
            customersDataService = dataService;

            InitializeValidationRules(customer);

            ValidateRequired("CustomerCode", "Customer Code");
            ValidateRequired("CompanyName", "Company Name");

            ValidateUniqueCustomerCode(customer.CustomerID, customer.CustomerCode);


        }
 public CustomersApiModel()
 {
     Customer = new Customer();
     Customers = new List<Customer>();
 }
        /// <summary>
        /// Import Customer
        /// </summary>
        /// <param name="columns"></param>
        /// <returns></returns>
        private Boolean ImportCustomer(string[] columns)
        {

            Customer customer = new Customer();
            
            customer.CustomerCode = columns[0].Trim();
            customer.CompanyName = columns[1].Trim();
            customer.Address = columns[4].Trim();
            customer.City = columns[5].Trim();
            customer.Region = columns[6].Trim();
            customer.PostalCode = columns[7].Trim();
            customer.Country = columns[8].Trim();
            customer.PhoneNumber = columns[9].Trim();

            Boolean valid = customersDataService.ValidateDuplicateCustomer(customer.CustomerCode);
            if (valid)
            {
                customersDataService.CreateCustomer(customer);
            }

            return valid;

        }
        /// <summary>
        /// Update Customer
        /// </summary>
        /// <param name="customerID"></param>
        /// <param name="customerCode"></param>
        /// <param name="companyName"></param>
        /// <param name="address"></param>
        /// <param name="city"></param>
        /// <param name="region"></param>
        /// <param name="postalCode"></param>
        /// <param name="country"></param>
        /// <param name="phoneNumber"></param>
        /// <param name="webSiteUrl"></param>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public Customer UpdateCustomer(Guid customerID, string customerCode, string companyName, string address, string city, string region, string postalCode, string country, string phoneNumber, string webSiteUrl, out TransactionalInformation transaction)
        {

            transaction = new TransactionalInformation();

            CustomersBusinessRules customersBusinessRules = new CustomersBusinessRules();

            Customer customer = new Customer();

            try
            {

                customersDataService.CreateSession();

                customer = customersDataService.GetCustomer(customerID);
                customer.CustomerCode = customerCode;
                customer.CompanyName = companyName;
                customer.Address = address;
                customer.City = city;
                customer.Region = region;
                customer.PostalCode = postalCode;
                customer.Country = country;
                customer.PhoneNumber = phoneNumber;
                customer.WebSiteUrl = webSiteUrl;

                customersBusinessRules.ValidateCustomerUpdate(customer, customersDataService);

                if (customersBusinessRules.ValidationStatus == true)
                {
                    customersDataService.BeginTransaction();
                    customersDataService.UpdateCustomer(customer);
                    customersDataService.CommitTransaction(true);
                    transaction.ReturnStatus = true;
                    transaction.ReturnMessage.Add("Customer successfully updated at " + customer.DateUpdated.ToString());
                }
                else
                {
                    transaction.ReturnStatus = customersBusinessRules.ValidationStatus;
                    transaction.ReturnMessage = customersBusinessRules.ValidationMessage;
                    transaction.ValidationErrors = customersBusinessRules.ValidationErrors;
                }

            }
            catch (Exception ex)
            {
                transaction.ReturnMessage = new List<string>();
                string errorMessage = ex.Message;
                transaction.ReturnStatus = false;
                transaction.ReturnMessage.Add(errorMessage);
            }
            finally
            {
                customersDataService.CloseSession();
            }

            return customer;


        }        
        /// <summary>
        /// Initialize user Business Rules
        /// </summary>
        /// <param name="user"></param>
        /// <param name="dataService"></param>
        public void InitializeCustomersBusinessRules(Customer customer, ICustomersDataService dataService)
        {
            customersDataService = dataService;
            InitializeValidationRules(customer);

        }
        /// <summary>
        /// Customer Inquiry
        /// </summary>
        /// <param name="customerCode"></param>
        /// <param name="companyName"></param>
        /// <param name="paging"></param>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public List<Customer> CustomerInquiry(string customerCode, string companyName, DataGridPagingInformation paging, out TransactionalInformation transaction)
        {

            transaction = new TransactionalInformation();

            string sortExpression = paging.SortExpression;

            if (paging.SortDirection != string.Empty)
                sortExpression = sortExpression + " " + paging.SortDirection;

            List<Customer> customerInquiry = new List<Customer>();

            int numberOfRows = 0;

            var customerQuery = dbConnection.Customers.AsQueryable();

            if (customerCode != null && customerCode.Trim().Length > 0)
            {
                customerQuery = customerQuery.Where(c => c.CustomerCode.StartsWith(customerCode));
            }

            if (companyName != null && companyName.Trim().Length > 0)
            {
                customerQuery = customerQuery.Where(c => c.CompanyName.StartsWith(companyName));
            }

            var customers = from c in customerQuery
                            select new { c.CustomerID, c.CustomerCode, c.CompanyName, c.WebSiteUrl, c.City, c.Country, c.Address, c.Region, c.PostalCode };

            numberOfRows = customers.Count();

            customers = customers.OrderBy(sortExpression);

            var customerList = customers.Skip((paging.CurrentPageNumber - 1) * paging.PageSize).Take(paging.PageSize);

            paging.TotalRows = numberOfRows;
            paging.TotalPages = AngularJSUtilities.Utilities.CalculateTotalPages(numberOfRows, paging.PageSize);

            foreach (var customer in customerList)
            {
                Customer customerData = new Customer();
                customerData.CustomerID = customer.CustomerID;
                customerData.CustomerCode = customer.CustomerCode;
                customerData.CompanyName = customer.CompanyName;
                customerData.City = customer.City;
                customerData.Address = customer.Address;
                customerData.WebSiteUrl = customer.WebSiteUrl;

                if (customer.Region == "NULL")
                    customerData.Region = "NA";
                else 
                    customerData.Region = customer.Region;

                customerData.PostalCode = customer.PostalCode;

                customerInquiry.Add(customerData);
            }


            transaction.TotalPages = paging.TotalPages;
            transaction.TotalRows = paging.TotalRows;
            transaction.ReturnStatus = true;
            transaction.ReturnMessage.Add(numberOfRows.ToString() + " customer records found.");

            return customerInquiry;

        }
        /// <summary>
        /// Update Customer
        /// </summary>
        /// <param name="customer"></param>
        public void UpdateCustomer(Customer customer)
        {           
            DateTime now = DateTime.Now;          
            customer.DateUpdated = now;

        }