namespace prueba2
{
    public partial class Form1 : Form
    {
 
 
        public Form1()
        {
            InitializeComponent();
        }
        private static readonly string cnnStrTPV = 
            ConfigurationManager.ConnectionStrings["xTrelaTPVConnectionString"].ConnectionString;
 
        System.Data.OracleClient.OracleConnection conn =
            new System.Data.OracleClient.OracleConnection();  
 
        int idtabla;
        long Id;
        string sql = "";
 
        //
        System.Collections.ArrayList ListaPedidos =
               new System.Collections.ArrayList();//definimos e instanciamos el objeto ArrayList         CabPedido CPedido 
= new CabPedido
(); 
        System.Collections.ArrayList ListaTickets =
                new System.Collections.ArrayList();         CabTicket CTicket 
= new CabTicket
(); 
        System.Collections.ArrayList ListaOperacionesT =
                new System.Collections.ArrayList();         CabOperac COperac 
= new CabOperac
(); 
 
        //Código encargado de realizar la conexion con la BBDD
        //y de llamar al método que realiza la recogida del XML del campo de la bbdd
        //y de crear el archivo xml en la ruta especificada
 
 
        private void RecogerXML()
        {
 
            XmlDocument doc1 
= new XmlDocument
();            XmlDocument doc2 
= new XmlDocument
();            XmlDocument doc3 
= new XmlDocument
(); 
            SqlConnection cnn 
= new SqlConnection
(cnnStrTPV
); 
            cnn.Open();
 
            LoadXml1(cnn, doc1);
            LoadXml2(cnn, doc2);
            LoadXml3(cnn, doc3);
 
            cnn.Close();
 
            doc1.Save("C:\Users\davidms\Desktop\temp\OutputXml1.xml");
            doc2.Save("C:\Users\davidms\Desktop\temp\OutputXml2.xml");
            doc3.Save("C:\Users\davidms\Desktop\temp\OutputXml3.xml");
 
            MessageBox.Show("Archivo XML importado y creado correctamente", "Info",
                MessageBoxButtons.OK, MessageBoxIcon.Information);
 
        }
      
        
 
        //Método que recoge el campo xml de la bbdd
        protected bool LoadXml1(SqlConnection cnn, XmlDocument doc1)
        {
            //Leemos el campo serialización(XML) de la bbdd. 
 
 
            idtabla = 122;//pedidostiendas
            Id = 10001901982;
 
            sql = @"SELECT Serializacion
                    FROM xTrelaTPV..OPERACIONES
                    WHERE IdOperacion =" + Id +
                   "and idtabla=" + idtabla + "";
 
 
 
            SqlCommand cm 
= new SqlCommand
(sql, cnn
);            /* cm.Parameters.Add(new SqlParameter("@IdOperacion", 10001901982));//id de ejemplo
                 //10009801627));
             //cm.Parameters.Add(new SqlParameter("@Idtabla", 122));//Idtabla PedidosTiendas
                 //127));//id tabla OperacionesTalleresHistorico*/
            using (SqlDataReader dr = cm.ExecuteReader())
            {
                if (dr.Read())
                {
                    SqlXml MiXml = dr.GetSqlXml(dr.GetOrdinal("Serializacion"));
                    doc1.LoadXml(MiXml.Value);
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
 
        protected bool LoadXml2(SqlConnection cnn, XmlDocument doc2)
        {
 
            idtabla = 127;//OperacionesTalleresHistorico
            Id = 1001520165;
 
            sql = @"SELECT Serializacion
                    FROM xTrelaTPV..OPERACIONES
                    WHERE IdOperacion =" + Id +
                   "and idtabla=" + idtabla + "";
 
 
 
            SqlCommand cm 
= new SqlCommand
(sql, cnn
);           
            using (SqlDataReader dr = cm.ExecuteReader())
            {
                if (dr.Read())
                {
                    SqlXml MiXml = dr.GetSqlXml(dr.GetOrdinal("Serializacion"));
                    doc2.LoadXml(MiXml.Value);
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
 
        protected bool LoadXml3(SqlConnection cnn, XmlDocument doc3)
        {
            //Leemos el campo serialización(XML) de la bbdd. 
 
 
 
            idtabla = 135;//tickets
            Id = 100098011891;
 
            sql = @"SELECT Serializacion
                    FROM xTrelaTPV..OPERACIONES
                    WHERE IdOperacion =" + Id +
                   "and idtabla=" + idtabla + "";
 
 
            SqlCommand cm 
= new SqlCommand
(sql, cnn
);           
            using (SqlDataReader dr = cm.ExecuteReader())
            {
                if (dr.Read())
                {
                    SqlXml MiXml = dr.GetSqlXml(dr.GetOrdinal("Serializacion"));
                    doc3.LoadXml(MiXml.Value);
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
 
        //Método encargado de sacar los campos del xml 
        //moviendose por los diferentes nodos del archivo
        public void GetCampos_PedidoTienda()
        {
            XmlDocument xDoc 
= new XmlDocument
();//XmlDocument nos permite editar el XML            //La ruta del documento XML permite rutas relativas 
            //respeto del ejecutable!
 
            xDoc.Load("C:/Users/davidms/Desktop/temp/OutputXml1.xml");//ruta del archivo xml
 
            XmlNodeList pedidostiendas =
                xDoc.GetElementsByTagName("PedidoTienda");//idtabla=122-->PedidosTiendas
 
 
            foreach (XmlElement nodo in pedidostiendas)
            {
 
                int i = 0;
 
 
                CPedido.idPedidoTienda = Convert.ToUInt32(nodo.GetElementsByTagName("IdPedidoTienda")[i].InnerText);
 
                if (CPedido.Pedido == null)
                {
                    CPedido.Pedido = Convert.ToInt32(nodo.GetElementsByTagName("Pedido")[i].InnerText);//nodo xsi.nil
                }
 
                CPedido.IdentidadOrigenPedido = Convert.ToInt32(nodo.GetElementsByTagName("IdEntidadOrigenPedido")[i].InnerText);
                CPedido.FechaPedido = (nodo.GetElementsByTagName("FechaPedido")[i].InnerText);
                CPedido.CodigoBarras = nodo.GetElementsByTagName("CodigoBarras")[i].InnerText;
                CPedido.IdDivisa = Convert.ToInt32(nodo.GetElementsByTagName("IdDivisa")[i].InnerText);
                CPedido.AvisarALaRecepcion = Convert.ToBoolean(nodo.GetElementsByTagName("AvisarAlaRecepcion")[i].InnerText);
                CPedido.SMS = Convert.ToBoolean(nodo.GetElementsByTagName("Sms")[i].InnerText);
                CPedido.AvisarALaRecepcionCompletaDelPedido = Convert.ToBoolean(nodo.GetElementsByTagName("AvisarAlaRecepcionCompletaDelPedido")[i].InnerText);
               
                //Agrego la estructura o objeto CPedido a mi ArrayList
                ListaPedidos.Add(CPedido);
                //    
 
            }
        }
 
        public void GetCampos_Ticket()
        {
            XmlDocument xDoc 
= new XmlDocument
();//XmlDocument nos permite editar el XML            //La ruta del documento XML permite rutas relativas 
            //respeto del ejecutable!
 
            xDoc.Load("C:/Users/davidms/Desktop/temp/OutputXml2.xml");//ruta del archivo xml
 
            XmlNodeList Ptickets =
                xDoc.GetElementsByTagName("Ticket");//idtabla=135-->Tickets
 
 
            foreach (XmlElement nodo in Ptickets)
            {
 
                int i = 0;
 
 
                //CTicket.IdEntidad  =Convert.ToInt32(nodo.GetElementsByTagName("IdEntidad")[i].InnerText);
                CTicket.CodigoBarras = (nodo.GetElementsByTagName("CodigoBarras")[i].InnerText);
                CTicket.NumeroTicket = Convert.ToInt32(nodo.GetElementsByTagName("NumeroTicket")[i].InnerText);
                CTicket.Fecha = (nodo.GetElementsByTagName("Fecha")[i].InnerText);//tabla de pruebas-> DATE ,,cambiado a VARCHAR
 
                ListaTickets.Add(CTicket);
 
            }
        }
 
 
        public void GetCampos_OperacTaller()
        {
            XmlDocument xDoc 
= new XmlDocument
();//XmlDocument nos permite editar el XML            //La ruta del documento XML permite rutas relativas 
            //respeto del ejecutable!
 
            xDoc.Load("C:/Users/davidms/Desktop/temp/OutputXml3.xml");//ruta del archivo xml
 
            XmlNodeList operaciontallerH =
                xDoc.GetElementsByTagName("OperacionTallerHistorico");//idtabla=127-->OperacionTallerHist
 
 
 
            foreach (XmlElement nodo in operaciontallerH)
            {
 
                int i = 0;
 
                COperac.IdOperacionTaller = Convert.ToUInt32(nodo.GetElementsByTagName("IdOperacionTaller")[i].InnerText);
                COperac.DescripcionGeneradaReparacion = nodo.GetElementsByTagName("DescripcionGeneradaReparacion")[i].InnerText;
                COperac.FechaOperacionTaller = nodo.GetElementsByTagName("FechaOperacionTaller")[i].InnerText;
 
                ListaOperacionesT.Add(COperac);
 
            }
        }
 
 
        public void InsertOracle()
        {
 
            // TODO: Modify the connection string and include any
            // additional required properties for your database.
            conn.ConnectionString =
                "Data Source=DEVELOP_ORASRVDEV03;" + //schema bbdd
                "User ID=xxxxx;" +                   //usuario
                "Password=xxxxxxxxx";    //password
 
            conn.Open();//--abrimos conexion
 
 
            //Declaro una variable de tipo command del oracle
            System.Data.OracleClient.OracleCommand MiComando 
= new System.Data.OracleClient.OracleCommand();  
 
            foreach (CabPedido MiPedido in ListaPedidos)
            {
                foreach (CabTicket MiTicket in ListaTickets)
                {
                    foreach (CabOperac MiOperacion in ListaOperacionesT)
                    {
                        System.Data.OracleClient.OracleParameter var1;
                        System.Data.OracleClient.OracleParameter var2;
                        System.Data.OracleClient.OracleParameter var3;
 
                        var1 
= new System.Data.OracleClient.OracleParameter();                        var2 
= new System.Data.OracleClient.OracleParameter();                        var3 
= new System.Data.OracleClient.OracleParameter(); 
                        var1.OracleType = System.Data.OracleClient.OracleType.Int32;
                        var2.OracleType = System.Data.OracleClient.OracleType.VarChar;
                        var3.OracleType = System.Data.OracleClient.OracleType.VarChar;
 
                        var1.Value = CPedido.idPedidoTienda;
                        var2.Value = CTicket.CodigoBarras;
                        var3.Value = COperac.FechaOperacionTaller;
 
                        MiComando.Parameters.Clear();
 
                        try
                        {
 
                            string oracle = "Insert into TO_PRUEBAS" +
                                            "(IDPEDIDO,CODIGOBARRAS,FECHA)" +
                                            "values('" + var2.Value + "'," + var1.Value + ",'" +
                                            (Convert.ToDateTime(var3.Value)) + "')";
 
 
                            MiComando 
= new OracleCommand
(oracle, conn
);                            MiComando.ExecuteNonQuery();
                            MessageBox.Show("Ejecución realizada con éxito", "INFO", 
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
 
                        }
                        catch (Exception err)
                        {
                            MessageBox.Show("Error..." + err.Message, "ERROR", 
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
 
                        }
                        conn.Close();//--cerramos conexión
 
 
                        File.Delete("C:/Users/davidms/Desktop/temp/OutputXml1.xml");
                        File.Delete("C:/Users/davidms/Desktop/temp/OutputXml2.xml");
                        File.Delete("C:/Users/davidms/Desktop/temp/OutputXml3.xml");
                    }
                }
            }
 
        }
 
 
        public class CabPedido //dentro el XML la primera tabla que 
                            //indica en este caso PEDIDOTIENDA
        {
            public long idPedidoTienda;
            public int Pedido;
            public int IdentidadOrigenPedido;
            public string FechaPedido;//si lo pones a String y en el momento del Insert lo conviertes a date,,,mejor
            public string CodigoBarras;
            public int IdDivisa;  //tinyint 
            public bool AvisarALaRecepcion; //bit --> bool¿?
            public bool SMS; //bit 
            public bool AvisarALaRecepcionCompletaDelPedido; //bit 
            public int IdCaja; //tinyint 
            public long IdTicket; //bigint 
            public int Comodin1;
            public int Comodin2;
            public int Comodin3;
            public int Comodin4;
            public bool Comodin5; //bit 
            public bool Comodin6; //bit 
            public string Comodin7; //nvarchar(10) 
            public string Comodin8; //nvarchar(100) 
            public DateTime Comodin9;
            public DateTime Comodin10;
            public long IdEmpleado; //bigint 
            public int IdEntidadDestinoPedido;
            public long Comodin11; //bigint 
            public long Comodin12; //bigint 
            public int Comodin13; //money 
            public int Comodin14; //money 
            public bool Comodin15; //bit 
            public bool Comodin16; //bit 
            public DateTime Comodin17;
            public DateTime Comodin18;
            public string Comodin19;// nvarchar(300) 
            //public string Comodin20 //xml 
            public int Categoria1;
            public int Categoria2;
            public int Categoria3;
            public int Categoria4;
            public int Categoria5;
 
        }
 
        public class CabTicket//XML Tickets
        {
            public long IdTicket;//bigint
            public int IdEntidad;
            public int IdCaja;//tinyint
            public int NumeroTicket;
            public string Fecha;//DateTime
            public int IdTipoTicket;
            public int IdCajaSesion;
            public long IdEmpleado;//bigint
            public decimal PorcentajeDescuentoGlobal;//numeric(6,3)
            public int ImporteDescuentoGlobal;//money
            public bool emitido;//bit
            public int IdEstadoTicket;
            public string CodigoBarras;
            public long IdTicketEnlace;
            public int Comodin1;
            public int Comodin2;
            public int Comodin3;
            public int Comodin4; //money
            public bool Comodin5; //bit 
            public bool Comodin6; //bit 
            public string Comodin7; //nvarchar(10) 
            public string Comodin8; //nvarchar(100) 
            public DateTime Comodin9;
            public DateTime Comodin10;
            public long Comodin11; //bigint 
            public long Comodin12; //bigint 
            public int Comodin13; //money 
            public int Comodin14; //money 
            public bool Comodin15; //bit 
            public bool Comodin16; //bit 
            public DateTime Comodin17;
            public DateTime Comodin18;
            public string Comodin19;// nvarchar(300) 
            //public string Comodin20 //xml 
            //en la tabla hay 4 campos más, que no creo pinten nada..
 
 
        }
 
        public class CabOperac //XML OperacionesTalleresHistorico
        {
            public long IdOperacionTallerHistorico;//bigint
            public long IdOperacionTaller;//bigint
            public string FechaOperacionTaller;//DATETIME
            public string DescripcionGeneradaReparacion;
            public bool SolicitarPresupuesto;//bit
            public bool ViajaPieza;//bit
            public int PresupuestoOperacionTaller;//money
            public bool PresupuestoAceptadoPorCliente;//bit
            public bool PresupuestoModificadoPorCentral;//bit
            public bool PresupuestoModificadoPorTienda;//bit
            public bool InformadoCliente;
 
        }
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            RecogerXML();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            GetCampos_PedidoTienda();
            GetCampos_Ticket();
            GetCampos_OperacTaller();
 
            InsertOracle();
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
 
}