public static NavSalesOrderItem GetSalesOrderItemForNAV(string navAPIUrl, string navAPIUserName, string navAPIPassword, string soNumber, int lineNo)
        {
            NavSalesOrderItem navSalesOrderItemResponse = null;
            string            serviceCall = string.Format("{0}/SalesLine('Order', '{1}', {2})", navAPIUrl, soNumber, lineNo);

            try
            {
                NetworkCredential myCredentials = new NetworkCredential(navAPIUserName, navAPIPassword);
                HttpWebRequest    request       = (HttpWebRequest)WebRequest.Create(serviceCall);
                request.Credentials = myCredentials;
                request.KeepAlive   = false;
                request.ContentType = "application/json";
                WebResponse response = request.GetResponse();

                using (Stream navSalesOrderItemResponseStream = response.GetResponseStream())
                {
                    using (TextReader navSalesOrderItemReader = new StreamReader(navSalesOrderItemResponseStream))
                    {
                        string responceString = navSalesOrderItemReader.ReadToEnd();

                        using (var stringReader = new StringReader(responceString))
                        {
                            navSalesOrderItemResponse = Newtonsoft.Json.JsonConvert.DeserializeObject <NavSalesOrderItem>(responceString);
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                _logger.Log(exp, string.Format("Error is occuring while Getting the Sales order item: Request Url is: {0}", serviceCall), string.Format("Sales order item get for Sales Order: {0} and Line number {1}.", soNumber, lineNo), LogType.Error);
            }

            return(navSalesOrderItemResponse);
        }
        public static NavSalesOrderItem UpdateSalesOrderItemForNAV(ActiveUser activeUser, NavSalesOrderItemRequest navSalesOrderItemRequest, string navAPIUrl, string navAPIUserName, string navAPIPassword, List <long> jobIdList, out bool isRecordUpdated)
        {
            NavSalesOrderItem navSalesOrderItemResponse = null;
            string            navSalesOrderItemJson     = string.Empty;
            string            dataToRemove = string.Format("{0}:{1},", "\"M4PLItemId\"", navSalesOrderItemRequest.M4PLItemId);
            string            serviceCall  = string.Format("{0}/SalesLine('Order', '{1}', {2})", navAPIUrl, navSalesOrderItemRequest.Document_No, navSalesOrderItemRequest.Line_No);

            try
            {
                NavSalesOrderItem existingNavSalesOrderItem = GetSalesOrderItemForNAV(navAPIUrl, navAPIUserName, navAPIPassword, navSalesOrderItemRequest.Document_No, navSalesOrderItemRequest.Line_No);
                NetworkCredential myCredentials             = new NetworkCredential(navAPIUserName, navAPIPassword);
                HttpWebRequest    salesOrderItemrequest     = (HttpWebRequest)WebRequest.Create(serviceCall);
                salesOrderItemrequest.Credentials = myCredentials;
                salesOrderItemrequest.KeepAlive   = false;
                salesOrderItemrequest.ContentType = "application/json";
                salesOrderItemrequest.Method      = "PATCH";
                salesOrderItemrequest.Headers.Add(HttpRequestHeader.IfMatch, existingNavSalesOrderItem.DataETag);
                using (var navSalesOrderItemStreamWriter = new StreamWriter(salesOrderItemrequest.GetRequestStream()))
                {
                    navSalesOrderItemJson = JsonConvert.SerializeObject(navSalesOrderItemRequest);
                    navSalesOrderItemJson = navSalesOrderItemJson.Replace(dataToRemove, string.Empty);
                    navSalesOrderItemStreamWriter.Write(navSalesOrderItemJson);
                }

                WebResponse response = salesOrderItemrequest.GetResponse();

                using (Stream navSalesOrderItemResponseStream = response.GetResponseStream())
                {
                    using (TextReader navSalesOrderItemSyncReader = new StreamReader(navSalesOrderItemResponseStream))
                    {
                        string navSalesOrderItemResponseString = navSalesOrderItemSyncReader.ReadToEnd();

                        using (var stringReader = new StringReader(navSalesOrderItemResponseString))
                        {
                            navSalesOrderItemResponse = JsonConvert.DeserializeObject <NavSalesOrderItem>(navSalesOrderItemResponseString);
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                _logger.Log(exp, string.Format("Error is occuring while Updating the Sales order Item: Request Url is: {0}, Request body json was {1}", serviceCall, navSalesOrderItemJson), string.Format("Sales order Item updation for JobId: {0}, Line number: {1}", navSalesOrderItemRequest.M4PL_Job_ID, navSalesOrderItemRequest.Line_No), LogType.Error);
            }

            isRecordUpdated = navSalesOrderItemResponse != null ? true : false;

            if (navSalesOrderItemResponse != null)
            {
                _commands.UpdateJobOrderItemMapping(navSalesOrderItemRequest.M4PLItemId, activeUser, jobIdList, Entities.EntitiesAlias.ShippingItem.ToString(), navSalesOrderItemRequest.Line_No, navSalesOrderItemRequest.Document_No);
            }

            return(navSalesOrderItemResponse);
        }
        private static void UpdateSalesOrderItemDetails(ActiveUser activeUser, List <long> jobIdList, string navAPIUrl, string navAPIUserName, string navAPIPassword, string dimensionCode, string divisionCode, string soNumber, ref bool allLineItemsUpdated, ref string proFlag, bool isElectronicInvoice, List <SalesOrderItem> salesOrderItemRequest)
        {
            List <NavSalesOrderItemRequest> navSalesOrderItemRequest = null;

            if (salesOrderItemRequest != null && salesOrderItemRequest.Count > 0)
            {
                navSalesOrderItemRequest = new List <NavSalesOrderItemRequest>();
                salesOrderItemRequest.ToList().ForEach(x => navSalesOrderItemRequest.Add(new NavSalesOrderItemRequest()
                {
                    No                        = x.No,
                    M4PLItemId                = x.M4PLItemId,
                    Qty_to_Invoice            = x.Qty_to_Invoice,
                    Qty_to_Ship               = x.Qty_to_Ship,
                    Quantity                  = x.Quantity,
                    Planned_Delivery_Date     = x.Planned_Delivery_Date,
                    Shipment_Date             = x.Shipment_Date,
                    Planned_Shipment_Date     = x.Planned_Shipment_Date,
                    M4PL_Job_ID               = x.M4PL_Job_ID,
                    FilteredTypeField         = x.FilteredTypeField,
                    Document_No               = x.Document_No,
                    Line_No                   = x.Line_No,
                    Type                      = x.Type,
                    Shortcut_Dimension_1_Code = x.Shortcut_Dimension_1_Code,
                    Shortcut_Dimension_2_Code = x.Shortcut_Dimension_2_Code
                }));
            }

            List <JobOrderItemMapping> jobOrderItemMapping       = _commands.GetJobOrderItemMapping(jobIdList, Entities.EntitiesAlias.SalesOrder, isElectronicInvoice);
            NavSalesOrderItem          navSalesOrderItemResponse = null;
            string deleteProFlag       = null;
            bool   allLineItemsDeleted = true;
            bool   isRecordUpdated     = true;
            bool   isRecordDeleted     = true;

            if (jobOrderItemMapping != null && jobOrderItemMapping.Count > 0)
            {
                DeleteNAVSalesOrderItem(activeUser, jobIdList, navAPIUrl, navAPIUserName, navAPIPassword, isElectronicInvoice, allLineItemsUpdated, navSalesOrderItemRequest, jobOrderItemMapping, soNumber, ref deleteProFlag, ref allLineItemsDeleted, ref isRecordDeleted);
            }

            if (navSalesOrderItemRequest != null && navSalesOrderItemRequest.Count > 0)
            {
                foreach (var navSalesOrderItemRequestItem in navSalesOrderItemRequest)
                {
                    navSalesOrderItemRequestItem.Shortcut_Dimension_2_Code = dimensionCode;
                    navSalesOrderItemRequestItem.Shortcut_Dimension_1_Code = divisionCode;
                    if (jobOrderItemMapping != null && jobOrderItemMapping.Count > 0 && jobOrderItemMapping.Where(x => x.EntityName == Entities.EntitiesAlias.ShippingItem.ToString() && x.LineNumber == navSalesOrderItemRequestItem.Line_No && x.Document_Number == navSalesOrderItemRequestItem.Document_No).Any())
                    {
                        navSalesOrderItemResponse = UpdateSalesOrderItemForNAV(activeUser, navSalesOrderItemRequestItem, navAPIUrl, navAPIUserName, navAPIPassword, jobIdList, out isRecordUpdated);
                    }
                    else
                    {
                        navSalesOrderItemResponse = GenerateSalesOrderItemForNAV(activeUser, navSalesOrderItemRequestItem, navAPIUrl, navAPIUserName, navAPIPassword, jobIdList, out isRecordUpdated);
                    }

                    allLineItemsUpdated       = !allLineItemsUpdated ? allLineItemsUpdated : isRecordUpdated;
                    isRecordUpdated           = true;
                    navSalesOrderItemResponse = null;
                }

                proFlag = allLineItemsUpdated ? deleteProFlag : Entities.ProFlag.I.ToString();
                _commands.UpdateJobProFlag(activeUser, proFlag, jobIdList, Entities.EntitiesAlias.SalesOrder);
            }
        }