Ejemplo n.º 1
0
        /// *************************************************************************************************
        /// <summary>
        ///     11/03/2015 10:23 version
        ///     NIS Files process, Xml document mapped to an object and splited into order header/detail
        ///     sections.
        ///     Each section is send to WebServices as a JSON string if header/detail information is complete,
        ///     when detail info. is not included in the xml document, it must have an excel file associated
        ///     with the detail information (Header filename field).
        ///     All errors are send to a Webservice (Error) and included in the Service log.
        /// </summary>
        /// <param name="doc">Imported file content read as an XmlDocument</param>
        /// <param name="fName">File name (excluding path section)</param>
        /// <param name="fName">EtlTimer sync control data)</param>
        /// <returns>Process status true if procees was completed ok, else false</returns>
        /// -------------------------------------------------------------------------------------------------
        bool IXmlFiles.ProcessNisFiles(XmlDocument doc, string fName, EtlTimer syncRow)
        {
            //bool rStatus = false;                    //  WebService return status (default=false)
            ServiceResponse rStatus = new ServiceResponse();

            DAL.SupportServices.SupportServices       wsm = new DAL.SupportServices.SupportServices(); //  Set WebService methods pointer
            DAL.DataValidationServices.DataValidation dvs = new DAL.DataValidationServices.DataValidation();

            ///  Create error message object and initialice it
            ServiceResponse errMsg = new ServiceResponse();

            errMsg.FileType   = "1";    //  Set Nis Type
            errMsg.FileName   = fName + ".xml";
            errMsg.NISOrderId = "0";
            errMsg.Status     = "Not Processed";
            errMsg.Message    = "No items found for this order header";
            /// *********************************************************************************************
            //  Order header section
            /// ---------------------------------------------------------------------------------------------
            XmlNode header = doc.DocumentElement.SelectSingleNode("/Order/OrderHeader");
            Header  head   = new Header();

            ///
            head.HeaderId            = dvs.SingleNodeValidation_Text(header, "ID", 6);
            head.HeaderUserId        = dvs.SingleNodeValidation_Text(header, "userID", 6);
            head.HeaderUserEmail     = dvs.SingleNodeValidation_Text(header, "UserEmail", 60);
            head.HeaderOrderDate     = dvs.SingleNodeValidation_Text(header, "orderDate", 30);
            head.HeaderPO            = dvs.SingleNodeValidation_Text(header, "PO", 25);
            head.HeaderDateRequested = dvs.SingleNodeValidation_Text(header, "dateReq", 30);
            head.HeaderDescription   = dvs.SingleNodeValidation_Text(header, "description", 0);
            head.HeaderShipVia1      = dvs.SingleNodeValidation_Text(header, "shippingViaID", 2);
            head.HeaderShipVia2      = dvs.SingleNodeValidation_Text(header, "shippingViaID2", 2);
            head.HeaderShipToId1     = dvs.SingleNodeValidation_Text(header, "shippingToID", 0);
            head.HeaderShipToId2     = dvs.SingleNodeValidation_Text(header, "shippingToID2", 0);
            head.HeaderComments      = dvs.SingleNodeValidation_Text(header, "comments", 0);
            head.FileName            = dvs.SingleNodeValidation_Text(header, "ItemsFileName", 0);
            head.HeaderSentDate      = dvs.SingleNodeValidation_Text(header, "sentDate", 30);
            ///
            string jsonHead = "{ \"nisOrderSummary\":" + Newtonsoft.Json.JsonConvert.SerializeObject(head);
            /// *********************************************************************************************
            ///  Order Detail Section
            ///  --------------------------------------------------------------------------------------------
            XmlNodeList orders = doc.DocumentElement.SelectNodes("/Order/OrderItems");
            ///
            List <Order> ordList = new List <Order>();
            int          itm     = 1;

            foreach (XmlNode order in orders)
            {
                Order ord = new Order();
                ord.NisOrderId  = itm.ToString();
                ord.Itemid      = dvs.SingleNodeValidation_Text(order, "ID", 6);;
                ord.OrderId     = dvs.SingleNodeValidation_Text(order, "orderID", 6);
                ord.SkuId       = dvs.SingleNodeValidation_Text(order, "SKU_ID", 3);
                ord.LineId      = dvs.SingleNodeValidation_Int(order, "lineID");
                ord.Quantity1   = dvs.SingleNodeValidation_Int(order, "qty1");
                ord.Quantity2   = dvs.SingleNodeValidation_Int(order, "qty2");
                ord.Line1       = dvs.SingleNodeValidation_Text(order, "line1", 40);
                ord.Line2       = dvs.SingleNodeValidation_Text(order, "line2", 40);
                ord.Line3       = dvs.SingleNodeValidation_Text(order, "line3", 40);
                ord.Comment     = dvs.SingleNodeValidation_Text(order, "comment", 100);
                ord.Description = dvs.SingleNodeValidation_Text(order, "description", 0);
                ord.SkuClient   = dvs.SingleNodeValidation_Text(order, "SKU_client", 0);
                ord.SkuWe       = dvs.SingleNodeValidation_Text(order, "SKU_WE", 30);
                ord.AccountCode = dvs.SingleNodeValidation_Text(order, "AccountCode", 0);
                ///
                itm++;
                ordList.Add(ord);
            }
            /// ===========================================================================================
            /// When an Order don't include items, order items must be provided through an xls / xlsx file
            /// indicated in the Header "FileName" field.
            /// If fileName is not indicated/provided, the corresponding order must remain pending in the
            /// problem directory until it can be processed, an entry in the ServiceLog must be generated
            /// to report this situation and a WebService error message is send.
            /// Old system ==> subImportXLSFile
            /// -------------------------------------------------------------------------------------------
            if (ordList.Count == 0)
            {
                if (String.IsNullOrEmpty(head.FileName))
                {
                    /// Incomplete order (No order items included and no xls file Name reported in orderHeader)
                    errMsg.Message = "No items in xml file and no xls file reported in Header (fileName)";
                }
                else
                {
                    /// ===================================================================================================
                    /// read xls file using Header FileName, build order items List and add it to header section.
                    /// ----------------------------------------------------------------------------------------------------
                    //  string path = ConfigurationManager.AppSettings["ExcelFilesDirectory"].ToString() + @"\" + head.FileName;
                    string    path = syncRow.ExcelFileFolder + @"\" + head.FileName;
                    DataTable dt   = ImportProcedure_NIS.ExcelFiles.ImportProcess.ReadExcelFile(path, "Items", "*", head.FileName, false);
                    ///
                    if ((dt == null) || (dt.Rows.Count == 0))
                    {   /// Incomplete order (associated xls file name was not found)
                        errMsg.Message = "Associated xls/xlsx file <" + head.FileName + "> not found";
                        /// -------------------------------------------------------------------------
                    }
                    else
                    {   /// Built items list from xls/xlsx file content
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            string it = Convert.ToString(dt.Rows[i].ItemArray[5]);
                            if (!String.IsNullOrEmpty(it))
                            {
                                /// All empty rows Qty(G) are ignored, when current row is empty the process
                                /// continue. Associated file may have additional filled rows that must be
                                /// included.
                                Order ord = new Order();
                                /// process all existing items
                                ord.NisOrderId = head.HeaderId;         //  Header file name
                                ord.Itemid     = string.Empty;
                                ord.OrderId    = head.HeaderId;
                                ord.SkuId      = (i + 1).ToString();
                                /// Quantity Qty1/Qty2 nodes
                                int  q1;
                                bool n = Int32.TryParse(dt.Rows[i].ItemArray[5].ToString(), out q1);
                                ord.Quantity1 = q1;                                 //  ok
                                ord.Quantity2 = 0;                                  //  ok
                                /// Line Line1-line3 nodes
                                ord.Line1 = dt.Rows[i].ItemArray[2].ToString();     //  ok
                                ord.Line2 = dt.Rows[i].ItemArray[3].ToString();     //  ok
                                ord.Line3 = dt.Rows[i].ItemArray[4].ToString();     //  ok
                                /// This counter must be after storing Line1 .. Line3
                                /// Conts the number of lines included in this row.
                                ord.LineId = 0;
                                if (!string.IsNullOrEmpty(ord.Line1))
                                {
                                    ord.LineId++;
                                }
                                if (!string.IsNullOrEmpty(ord.Line2))
                                {
                                    ord.LineId++;
                                }
                                if (!string.IsNullOrEmpty(ord.Line3))
                                {
                                    ord.LineId++;
                                }
                                ///
                                ord.Comment     = dt.Rows[i].ItemArray[7].ToString(); //  ok
                                ord.Description = "";
                                ord.SkuClient   = dt.Rows[i].ItemArray[1].ToString();
                                ord.SkuWe       = dt.Rows[i].ItemArray[0].ToString();
                                /// Add row in detail list
                                ordList.Add(ord);
                            }
                        }
                    }
                }
            }
            /// ===============================================================================
            /// Send Imported files data content to webServices - information must be complete
            /// Order Header + all related Order Items.
            /// -------------------------------------------------------------------------------
            if (ordList.Count > 0)
            {
                /// Serialize Items list and complete json string for Header and Items
                string json2 = jsonHead + ", \"nisOrderItems\" : " + Newtonsoft.Json.JsonConvert.SerializeObject(ordList) + "}";
                /// ******************************************************************************
                /// Call Web Service
                /// <param name="json2">        Header/detail object Json serialized string.</param>
                /// <param name="fname">        Xml file name </param>
                /// <param name="syncRow.WebServiceOrders">File Type, route to web service(url)</param>
                /// <param name="syncRow">      EtlTimer control data.
                /// <returns>"rStatus" true if WebService was processed, else false</returns>
                /// *** Web service url is defined in the App.Config file key 'NisOrder'.
                /// ------------------------------------------------------------------------------
                /// ==============> save order data through the defined web service
                rStatus = wsm.ConsumeWebService(json2, fName, syncRow.WebServiceOrders, syncRow);   //"OrderData", syncRow);
                //  <==============
            }
            else
            {   /// Incomplete order (No order items included and no xls file Name reported in orderHeader)
                jsonHead = jsonHead + " }";
                /// Send Message to WebService
                rStatus.IsOk = false;
                wsm.WriteErrorFile(errMsg, syncRow);
            }
            return(rStatus.IsOk);
        }