private void CrearPDF(object sender, EventArgs e)
        {
            //función que crea el PDF de la factura

            clase_factcom factura = (clase_factcom)((ToolStripMenuItem)sender).Tag;

            this.Cursor = Cursors.WaitCursor;

            string base_imponible = "";
            string iva = "";
            string recargo = "";
            string total_importe = "";
            string detcod = "", detnom = "", detvia = "", detmun = "", detnif = "", detEMail = "";
            string texto_cabecera = ""; string observaciones = ""; string texto_pie = "";
            string serie = "";

            string strQ = "SELECT * FROM FACTV_CABE WHERE Factura=" + factura.Factura + " AND Anyo=" + factura.Anyo + " AND Serie='" + factura.Serie + "'";

            SqlDataReader myReader = null;

            try
            {
                //SqlDataReader myReader = null;
                SqlCommand myCommand = new SqlCommand(strQ, CnO);
                myReader = myCommand.ExecuteReader();
                while (myReader.Read())
                {
                    serie          = myReader["Serie"].ToString();
                    base_imponible = myReader["BI1"].ToString();
                    iva            = myReader["IVA1"].ToString();
                    recargo        = myReader["RE1"].ToString();
                    total_importe  = myReader["ImpteFactura"].ToString();

                    texto_cabecera = myReader["TextoCabe"].ToString();
                    observaciones  = myReader["Observaciones"].ToString();
                    texto_pie      = myReader["TextoPie"].ToString();
                    if (myReader["SubSerie"] != DBNull.Value)
                    {
                        SubSerie = myReader["SubSerie"].ToString();
                    }
                }
                //myReader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                myReader.Close();
            }

            //datos del detallista
            strQ = "SELECT ProCod, ProNom, ProDom, ProPob, ProCop, ProCif, ProEMail FROM PROVEEDORES WHERE ProCod=" + factura.ProCod;

            try
            {
                SqlCommand myCommand = new SqlCommand(strQ, CnO);
                myReader = myCommand.ExecuteReader();
                while (myReader.Read())
                {
                    detcod   = myReader["ProCod"].ToString();
                    detnom   = myReader["ProNom"].ToString();
                    detvia   = myReader["ProDom"].ToString();
                    detmun   = myReader["ProCop"].ToString() + "  " + myReader["ProPob"].ToString();
                    detnif   = myReader["ProCif"].ToString();
                    detEMail = myReader["ProEMail"].ToString();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                myReader.Close();
            }

            ///////

            string gIdent = this.GetType().FullName + " " + System.Reflection.MethodBase.GetCurrentMethod().Name;

            GloblaVar.gUTIL.CartelTraza("ENTRADA a " + this.GetType().FullName);

            CrystalDecisions.CrystalReports.Engine.ReportDocument myReport;
            myReport = new Report_Factura_Carabal();
            GloblaVar.gUTIL.ATraza(" Usuario " + frmPpal.USUARIO);

            switch (frmPpal.USUARIO)
            {
            case "1": myReport = new Report_Factura_Llorens();
                break;

            case "2":
                if (SubSerie == "ASG")
                {
                    myReport = new CR007();
                }
                else
                {
                    myReport = new Report_Factura_Carabal();
                }
                break;

            case "5":
                myReport = new Report_Factura_Dialpesca();
                break;

            case "8":
                myReport = new Report_Factura_Valpeix();
                break;

            default:
                break;
            }

            CrystalDecisions.Shared.TableLogOnInfo tliActual;

            //leer cadena de conexión
            string server   = GloblaVar.gREMOTO_SERVER;
            string database = GloblaVar.gREMOTO_BD;

            foreach (CrystalDecisions.CrystalReports.Engine.Table tbA in myReport.Database.Tables)
            {
                tliActual = tbA.LogOnInfo;
                tliActual.ConnectionInfo.ServerName         = server;   //"localhost\\SQLEXPRESS";
                tliActual.ConnectionInfo.DatabaseName       = database; //"OREMAPEREMdb";
                tliActual.ConnectionInfo.UserID             = "";
                tliActual.ConnectionInfo.Password           = "";
                tliActual.ConnectionInfo.IntegratedSecurity = true;
                tbA.ApplyLogOnInfo(tliActual);
            }

            myReport.DataDefinition.RecordSelectionFormula = "{command.Factura}=" + factura.Factura + " and {command.Serie}='" + factura.Serie + "' and {command.Anyo}=" + factura.Anyo;

            myReport.SetParameterValue("idfactura", factura.Anyo + "/" + factura.Factura);
            myReport.SetParameterValue("serie", serie);
            myReport.SetParameterValue("base_imponible", Funciones.Formatea(base_imponible));
            myReport.SetParameterValue("iva", Funciones.Formatea(iva));
            myReport.SetParameterValue("recargo", Funciones.Formatea(recargo));
            myReport.SetParameterValue("importe_total", Funciones.Formatea(total_importe));
            myReport.SetParameterValue("datos_mayorista", frmPpal.DATOS_MAYORISTA);
            myReport.SetParameterValue("detnom", detnom);
            myReport.SetParameterValue("detcod", detcod);
            myReport.SetParameterValue("detvia", detvia);
            myReport.SetParameterValue("detmun", detmun);
            myReport.SetParameterValue("detnif", detnif);
            myReport.SetParameterValue("fecha", factura.FechaEmision);

            myReport.SetParameterValue("texto_cabecera", texto_cabecera);
            myReport.SetParameterValue("observaciones", observaciones);
            myReport.SetParameterValue("texto_pie", texto_pie);


            //crear factura en PDF

            string   nomFactura = "", directorio = "", diskFileName = "", fecha = "", directorioFacturasPDF = "";
            DateTime fechaEmision = Convert.ToDateTime(factura.FechaEmision);

            try
            {
                //damos formato a la fecha de emision de la factura
                fecha = fechaEmision.Year.ToString() + fechaEmision.Month.ToString().PadLeft(2, '0') + fechaEmision.Day.ToString().PadLeft(2, '0');

                nomFactura = "Factura_" + fecha + "_" + factura.Factura.PadLeft(5, '0') + "_" + factura.Serie + ".pdf";

                //comprueba si existe el directorio y si no lo crea
                directorioFacturasPDF = GloblaVar.gCERCLE_103;
                directorio            = CrearDirectorio(@directorioFacturasPDF, detcod.PadLeft(5, '0'));
                diskFileName          = directorio + "\\" + nomFactura;

                myReport.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, diskFileName);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al crear la factura en PDF:\n\n" + ex.ToString());
                return;
            }

            if (((ToolStripMenuItem)sender).Name == "Crear")
            {
                MessageBox.Show(nomFactura + " ha sido creada correctamente");
            }
            else
            {
                //enviar factura por email
                if (!detEMail.Contains('@'))
                {
                    MessageBox.Show("El detallista " + detnom + " con el código " + detcod + " no tiene un correo válido.");
                }
                else
                {
                    if (CnO != null)
                    {
                        ConEDNSSMTP = "";
                        ConEMail    = "";
                        ConAutPwd   = "";

                        CargarDatosControlMayorista();
                    }

                    if (!string.IsNullOrEmpty(ConEDNSSMTP) && !string.IsNullOrEmpty(ConEMail) && !string.IsNullOrEmpty(ConAutPwd))
                    {
                        SmtpClient clienteCorreo = new SmtpClient(ConEDNSSMTP, 587);

                        clienteCorreo.EnableSsl             = true;
                        clienteCorreo.DeliveryMethod        = SmtpDeliveryMethod.Network;
                        clienteCorreo.UseDefaultCredentials = false;
                        clienteCorreo.Credentials           = new NetworkCredential(ConEMail, ConAutPwd);

                        try
                        {
                            MailMessage mensaje = new MailMessage();

                            mensaje.From = new MailAddress(ConEMail);
                            mensaje.To.Add(detEMail.Trim());
                            mensaje.Subject         = nomFactura;
                            mensaje.SubjectEncoding = System.Text.Encoding.UTF8;
                            mensaje.Body            = "Factura adjunta";
                            mensaje.BodyEncoding    = System.Text.Encoding.UTF8;

                            using (Attachment adjunto = new Attachment(diskFileName))
                            {
                                ContentDisposition contentDisposition = adjunto.ContentDisposition;
                                contentDisposition.CreationDate     = File.GetCreationTime(diskFileName);
                                contentDisposition.ModificationDate = File.GetLastWriteTime(diskFileName);
                                contentDisposition.ReadDate         = File.GetLastAccessTime(diskFileName);

                                mensaje.Attachments.Add(adjunto);

                                clienteCorreo.Send(mensaje);

                                mensaje = null;
                            }

                            MessageBox.Show(nomFactura + " enviada correctamente");
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Error al enviar la factura:\n\n" + ex.ToString());
                        }
                    }
                    else
                    {
                        MessageBox.Show("El mayorista no tiene configurados los datos para enviar correos");
                    }
                }
            }

            this.Cursor = Cursors.Default;
        }
        private void Proceso(string DetCPM)
        {
            ArrayList Detallistas = Obtener_Detallistas(DetCPM);

            //lectura de la lista

            if (Detallistas.Count == 0)
            {
                MessageBox.Show("No existen detallistas con la periodicidad de facturación seleccionada");
            }
            else
            {
                this.Cursor = Cursors.WaitCursor;

                int facturas_creadas = 0;
                //int facturas_impresas = 0;
                //int facturas_correo = 0;

                string MEMORIA = "";    //aquí se almacenan los detalles del proceso para mostrar luego al usuario

                for (int x = 0; x < Detallistas.Count; x++)
                {
                    clase_detallista prove = (clase_detallista)Detallistas[x];

                    string DetCod = prove.DetCod;

                    //obtener lista de todos los albaranes sin facturar de este detallista x

                    ArrayList Lista_albaranes = Obtener_Lista_Albaranes(DetCod);

                    if (Lista_albaranes.Count == 0)
                    {
                        //MEMORIA += "No hay albaranes por facturar para el detallista " + DetCod + " - " + prove.DetNom + " \r\n";
                        //textBox_Memoria.Text  = "No hay albaranes por facturar para el detallista " + DetCod + " - " + prove.DetNom + " \r\n";
                        //GloblaVar.gUTIL.ATraza(MEMORIA);
                    }
                    else
                    {
                        switch (DetCPM)
                        {
                        case "S":
                            Serie = "AS";
                            if (frmPpal.USUARIO == "2")
                            {
                                Serie = "AW";
                            }
                            break;

                        case "Q":
                            Serie = "AQ";
                            break;

                        case "M":
                            Serie = "AM";
                            if (frmPpal.USUARIO == "2")
                            {
                                Serie = "AN";
                            }
                            break;

                        case "D":
                            Serie = "AD";
                            break;

                        default:
                            Serie = "AA";
                            break;
                        }

                        //1. Facturar
                        string idFactura = "";

                        if (frmPpal.USUARIO == "8")
                        {
                            idFactura = Funciones.Facturar(DetCod, Serie, true, Lista_albaranes, CnO, dateTimePicker_FechaFactura.Text);
                        }
                        else
                        {
                            idFactura = Funciones.Facturar(DetCod, Serie, true, Lista_albaranes, CnO);
                        }

                        //string nomFactura = "";

                        //string fecha = DateTime.Today.Year.ToString() + DateTime.Today.Month.ToString().PadLeft(2, '0') + DateTime.Today.Day.ToString().PadLeft(2, '0');

                        //nomFactura = "Factura_" + fecha + "_" + idFactura.PadLeft(5, '0') + "_" + Serie;

                        //MEMORIA += "Se ha creado la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + nomFactura + " \r\n";
                        //textBox_Memoria.Text = "Se ha creado la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + nomFactura + " \r\n";
                        //GloblaVar.gUTIL.ATraza(MEMORIA);
                        //facturas_creadas++;



                        //directorio
                        string directorio = "";

                        //creación de PDF
                        //2. Recopilar datos de factura, cliente, etc
                        string   anyo = DateTime.Today.Year.ToString();
                        string   base_imponible = "";
                        string   iva = "";
                        string   recargo = "";
                        string   total_importe = "";
                        string   detcod = "", detnom = ""; string detvia = ""; string detmun = ""; string detnif = "";
                        string   texto_cabecera = ""; string observaciones = ""; string texto_pie = "";
                        DateTime fechaEmision = DateTime.Today;


                        string strQ = "SELECT * FROM FACTV_CABE WHERE Factura=" + idFactura + " AND Anyo=" + anyo + " AND Serie='" + Serie + "'";

                        SqlDataReader myReader = null;

                        try
                        {
                            SqlCommand myCommand = new SqlCommand(strQ, CnO);
                            myReader = myCommand.ExecuteReader();
                            while (myReader.Read())
                            {
                                fechaEmision   = Convert.ToDateTime(myReader["FechaEmision"].ToString());
                                base_imponible = myReader["BI1"].ToString();
                                iva            = myReader["IVA1"].ToString();
                                recargo        = myReader["RE1"].ToString();
                                total_importe  = myReader["ImpteFactura"].ToString();

                                texto_cabecera = myReader["TextoCabe"].ToString();
                                observaciones  = myReader["Observaciones"].ToString();
                                texto_pie      = myReader["TextoPie"].ToString();
                            }
                            //myReader.Close();
                        }
                        catch (Exception ex)
                        {
                            MEMORIA += "Error al cargar los datos de la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + ex.ToString() + " \r\n";
                            textBox_Memoria.Text = "Error al cargar los datos de la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + ex.ToString() + " \r\n";
                            GloblaVar.gUTIL.ATraza(MEMORIA);

                            //Vamos al siguiente detallista
                        }
                        finally
                        {
                            myReader.Close();
                        }

                        base_imponible = Funciones.Formatea(base_imponible);
                        iva            = Funciones.Formatea(iva);
                        recargo        = Funciones.Formatea(recargo);
                        total_importe  = Funciones.Formatea(total_importe);

                        //datos del detallista

                        detcod = DetCod;
                        detnom = prove.DetNom;
                        detvia = prove.detvia;
                        detmun = prove.DetCop + "  " + prove.detmun;
                        detnif = prove.DetNif;

                        //Comenzamos a crear el Report
                        CrystalDecisions.CrystalReports.Engine.ReportDocument myReport;
                        myReport = new Report_Factura_Carabal();

                        switch (frmPpal.USUARIO)
                        {
                        case "1": myReport = new Report_Factura_Llorens();
                            break;

                        case "2": myReport = new Report_Factura_Carabal();
                            break;

                        case "5":
                            myReport = new Report_Factura_Dialpesca();
                            break;

                        case "8":
                            myReport = new Report_Factura_Valpeix();
                            break;

                        default:
                            break;
                        }


                        CrystalDecisions.Shared.TableLogOnInfo tliActual;

                        //leer cadena de conexión
                        string server   = GloblaVar.gREMOTO_SERVER;
                        string database = GloblaVar.gREMOTO_BD;

                        //string userid = "reports";
                        //string paswd = "crystal";

                        foreach (CrystalDecisions.CrystalReports.Engine.Table tbA in myReport.Database.Tables)
                        {
                            tliActual = tbA.LogOnInfo;
                            tliActual.ConnectionInfo.ServerName         = server;   //"localhost\\SQLEXPRESS";
                            tliActual.ConnectionInfo.DatabaseName       = database; //"OREMAPEREMdb";
                            tliActual.ConnectionInfo.UserID             = "";
                            tliActual.ConnectionInfo.Password           = "";
                            tliActual.ConnectionInfo.IntegratedSecurity = true;
                            tbA.ApplyLogOnInfo(tliActual);
                        }

                        myReport.DataDefinition.RecordSelectionFormula = "{command.Factura}=" + idFactura + " and {command.Serie}='" + Serie + "' and {command.Anyo}=" + anyo;

                        myReport.SetParameterValue("idfactura", anyo + "/" + idFactura);
                        myReport.SetParameterValue("serie", Serie);
                        myReport.SetParameterValue("base_imponible", base_imponible);
                        myReport.SetParameterValue("iva", iva);
                        myReport.SetParameterValue("recargo", recargo);
                        myReport.SetParameterValue("importe_total", total_importe);
                        myReport.SetParameterValue("datos_mayorista", frmPpal.DATOS_MAYORISTA);
                        myReport.SetParameterValue("detnom", detnom);
                        myReport.SetParameterValue("detcod", detcod);
                        myReport.SetParameterValue("detvia", detvia);
                        myReport.SetParameterValue("detmun", detmun);
                        myReport.SetParameterValue("detnif", detnif);
                        //myReport.SetParameterValue("fecha", DateTime.Today.ToShortDateString());
                        myReport.SetParameterValue("fecha", fechaEmision.ToShortDateString());

                        myReport.SetParameterValue("texto_cabecera", texto_cabecera);
                        myReport.SetParameterValue("observaciones", observaciones);
                        myReport.SetParameterValue("texto_pie", texto_pie);

                        //myReport.SetParameterValue("total_pagina", "1");

                        //crystalReportViewer1.ReportSource = myReport;
                        //crystalReportViewer1.ShowLastPage();
                        //int total_paginas = crystalReportViewer1.GetCurrentPageNumber();
                        ////string TotalPage = total_paginas.ToString();
                        //crystalReportViewer1.ShowFirstPage();

                        ////recargar el total páginas
                        //// myReport.SetParameterValue("total_pagina", "/" + TotalPage);


                        //string nombre_factura = "Factura_" + fecha + "_" + idFactura + "_" + SERIE + ".pdf";

                        //string DiskFileName = directorio + "\\" + nombre_factura;
                        //myReport.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, DiskFileName);

                        string nomFactura = "", diskFileName = "", directorioFacturasPDF = "";
                        string fecha = fechaEmision.Year.ToString() + fechaEmision.Month.ToString().PadLeft(2, '0') + fechaEmision.Day.ToString().PadLeft(2, '0');

                        try
                        {
                            nomFactura = "Factura_" + fecha + "_" + idFactura.PadLeft(5, '0') + "_" + Serie + ".pdf";

                            //comprueba si existe el directorio y si no lo crea
                            directorioFacturasPDF = GloblaVar.gCERCLE_103;
                            directorio            = CrearDirectorio(@directorioFacturasPDF, DetCod.PadLeft(5, '0'));
                            diskFileName          = directorio + "\\" + nomFactura;

                            myReport.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, diskFileName);

                            myReport.Close();
                            myReport.Dispose();
                            GC.Collect();
                        }
                        catch (Exception ex)
                        {
                            MEMORIA += "Error al crear la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + ex.ToString() + " \r\n";
                            textBox_Memoria.Text = "Error al crear la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + ex.ToString() + " \r\n";
                            GloblaVar.gUTIL.ATraza(MEMORIA);
                        }

                        MEMORIA += "Se ha creado la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + nomFactura + " \r\n";
                        textBox_Memoria.Text = "Se ha creado la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + nomFactura + " \r\n";
                        GloblaVar.gUTIL.ATraza(MEMORIA);
                        facturas_creadas++;

                        //comprobamos si este detallista tiene marcada la impresión

                        if (prove.FPVImpresion.ToLower() == "true")
                        {
                            //    myReport.PrintToPrinter(1, false, 0, total_paginas);
                            //    facturas_impresas++;
                        }

                        //comprobamos si tiene marcado el enviar correo

                        //if (prove.FPVCorreo.ToLower() == "true")
                        //{
                        //    //comprobar si el e-mail del detallista tiene al menos una @

                        //    if (prove.DetEMail.Contains('@') == false)
                        //    {
                        //        //MEMORIA += "El detallista " + prove.DetCod + " - " + prove.DetNom + " no tiene un correo válido. \r\n";
                        //        //textBox_Memoria.Text = "El detallista " + prove.DetCod + " - " + prove.DetNom + " no tiene un correo válido. \r\n";
                        //        //GloblaVar.gUTIL.ATraza(MEMORIA);
                        //    }
                        //    else
                        //    {
                        //        try
                        //        {
                        //            ////enviar correo
                        //            //SmtpClient Cliente = new SmtpClient();

                        //            //Cliente.Host = ConEDNSSMTP;  //"smtp.gmail.com";
                        //            //Cliente.Port = 587;
                        //            //Cliente.Credentials = new NetworkCredential(ConEMail, ConAutPwd);
                        //            //Cliente.EnableSsl = true;

                        //            //string from = ConEMail;   //nosotros
                        //            //string to = prove.DetEMail;     //destino

                        //            //MailMessage Mensaje = new MailMessage(from, to);

                        //            //Mensaje.Body = "Adjuntamos factura.";
                        //            //Mensaje.BodyEncoding = System.Text.Encoding.UTF8;
                        //            //Mensaje.Subject = nomFactura;
                        //            //Mensaje.SubjectEncoding = System.Text.Encoding.UTF8;


                        //            //Attachment Adjunto = new Attachment(diskFileName);
                        //            //ContentDisposition disposition = Adjunto.ContentDisposition;
                        //            //disposition.CreationDate = File.GetCreationTime(diskFileName);
                        //            //disposition.ModificationDate = File.GetLastWriteTime(diskFileName);
                        //            //disposition.ReadDate = File.GetLastAccessTime(diskFileName);

                        //            //Mensaje.Attachments.Add(Adjunto);

                        //            //Cliente.Send(Mensaje);

                        //            facturas_correo++;

                        //        }
                        //        catch (Exception ex)
                        //        {
                        //            MEMORIA += "Error al enviar la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + ex.ToString() + " \r\n";
                        //            textBox_Memoria.Text = "Error al enviar la factura del detallista " + DetCod + " - " + prove.DetNom + " :  " + ex.ToString() + " \r\n";
                        //            GloblaVar.gUTIL.ATraza(MEMORIA);


                        //        }
                        //    }

                        //}
                    }
                }

                MEMORIA += "Facturas creadas: " + facturas_creadas.ToString() + "\r\n";
                //MEMORIA += "Facturas impresas: " + facturas_impresas.ToString() + "\r\n";
                //MEMORIA += "Facturas enviadas por correo: " + facturas_correo.ToString() + "\r\n";

                textBox_Memoria.Text = MEMORIA;
            }

            //fin de proceso
            this.Cursor = Cursors.Default;
        }