/// <summary>
        /// Función que revisa que el correo sea el de un colaborador válido, y trae sus datos incluyendo sus Talonarios.
        /// </summary>
        /// <param name="correo">Cuenta de correo a validar</param>
        /// <returns>Objeto Colaborador con los datos personales obtenidos por el correo electrónico</returns>
        public static Colaborador ObtieneConTalonarios(string correo)
        {
            Colaborador persona = null;

            /* Solo se permite el acceso a personas que tengan fuentas de correo terminadas en "@anahuac.mx" */
            database db = new database();

            /* Buscamos al colaborador para revisar que este registrado como un colaborador en el sorteo activo actual */
            ResultSet dbPersona = db.getTable(String.Format(@"
SELECT top 1 CA.PK1, C.CLAVE, C.NOMBRE, C.APATERNO, C.AMATERNO, S.CUENTA, SE.PK_SORTEO
FROM COLABORADORES_ASIGNACION CA, 
SECTORES SE, 
SORTEOS S,
COLABORADORES C
WHERE CA.PK_SECTOR=SE.PK1 
AND SE.PK_SORTEO=S.PK1 
AND S.ACTIVO = 1
AND CA.PK_COLABORADOR=(SELECT TOP 1 PK1 FROM COLABORADORES C WHERE C.CORREO_P='{0}' AND C.CORREO_P LIKE '*****@*****.**')", correo));

            long sorteo_colab  = -1;
            bool existePersona = false;

            // Si existe la persona con correo anahuac, entonces extraemos sus datos
            if (dbPersona.Next())
            {
                // Obtenemos los datos del nombre de la persona
                string nombre           = dbPersona.Get("NOMBRE"),
                       apellido_paterno = dbPersona.Get("APATERNO"),
                       apellido_materno = dbPersona.Get("AMATERNO");
                // Generamos el nombre completo
                string nombre_completo = string.Format("{0} {1} {2}", nombre, apellido_paterno, apellido_materno).Trim();

                persona = new Colaborador(false, nombre_completo)
                {
                    clave               = dbPersona.GetLong("PK1"),
                    identificador       = dbPersona.Get("CLAVE"),
                    nombre              = nombre,
                    apellido_paterno    = apellido_paterno,
                    apellido_materno    = apellido_materno,
                    correo              = correo.ToLower(),
                    referencia_bancaria = dbPersona.Get("CUENTA")
                                          //referencia_bancaria = dbPersona.Get("REFBANCARIA")
                };
                sorteo_colab  = dbPersona.GetLong("PK_SORTEO");
                existePersona = true;
            }

            /* Si la persona existe, obtenemos los datos del estado de cuenta */
            if (existePersona)
            {
                ResultSet dbEdoCuenta = db.getTable(String.Format(@"
SELECT TOP 1 IMPORTE, ABONO, SALDO
FROM vESTADO_CUENTA_COLABORADOR edo
WHERE edo.PK_COLABORADOR = {0}", persona.clave));

                /* Si encontramos datos, entonces extraemos la información del estado de cuenta */
                if (dbEdoCuenta.Next())
                {
                    persona.monto_total   = dbEdoCuenta.GetDecimal("IMPORTE");
                    persona.monto_abonado = dbEdoCuenta.GetDecimal("ABONO");
                    persona.monto_deudor  = dbEdoCuenta.GetDecimal("SALDO");
                }

                #region Talonarios y Boletos
                List <Talonario> talonarios = new List <Talonario>(5);

                /* Traemos los folios de los talonarios digitales asignados a un colaborador en el sorteo activo */
                ResultSet dbTalonarios = db.getTable(String.Format(@"
select distinct t.PK1, t.FOLIO
from COLABORADORES c
inner join COLABORADORES_BOLETOS cb ON c.pk1 = cb.PK_COLABORADOR
inner join BOLETOS b ON b.PK1 = cb.PK_BOLETO
inner join TALONARIOS t ON b.PK_TALONARIO = t.PK1
where t.DIGITAL = 1
and t.ASIGNADO = 1
and c.PK1 = {0}
and t.PK_SORTEO = {1}
ORDER BY t.FOLIO", persona.clave, sorteo_colab));

                /* Por cada talonario, agregamos el folio a la lista*/
                while (dbTalonarios.Next())
                {
                    talonarios.Add(new Talonario()
                    {
                        clave = dbTalonarios.GetLong("PK1"),
                        folio = dbTalonarios.Get("FOLIO")
                    });
                }

                /* Convertimos la lista a arreglo antes de ciclar sobre los talonarios y agregar losboletos*/
                persona.talonarios = talonarios.ToArray();

                /* Por cada folio obtenido, traemos los datos del talonario*/
                foreach (Talonario talonario in persona.talonarios)
                {
                    /* Traemos los datos del talonario */
                    ResultSet dbBoleto = db.getTable(String.Format(@"
SELECT
    boletos.PK1,
	boletos.FOLIO,
	boletos.FOLIODIGITAL,
    boletos.PK_ESTADO
FROM COLABORADORES_BOLETOS rel_boletos
INNER JOIN boletos
ON boletos.PK1 = rel_boletos.PK_BOLETO
inner join TALONARIOS t
ON boletos.PK_TALONARIO = t.PK1
inner join SORTEOS s
ON s.PK1 = t.PK_SORTEO
WHERE t.PK_SORTEO = {2}
AND rel_boletos.PK_COLABORADOR = {0}
AND boletos.PK_TALONARIO = {1}", persona.clave, talonario.clave, sorteo_colab));

                    List <Boleto> pendientes = new List <Boleto>(20);
                    List <Boleto> vendidos   = new List <Boleto>(20);
                    List <Boleto> asignados  = new List <Boleto>(20);

                    while (dbBoleto.Next())
                    {
                        Boleto boleto = new Boleto(false)
                        {
                            clave         = dbBoleto.GetLong("PK1"),
                            folio         = dbBoleto.Get("FOLIO"),
                            folio_digital = dbBoleto.Get("FOLIODIGITAL"),
                            estado_boleto = dbBoleto.Get("PK_ESTADO")
                        };
                        if (boleto.folio_digital == "0")
                        {
                            boleto.folio_digital = null;
                        }
                        boleto.vendido = !String.IsNullOrEmpty(boleto.folio_digital);
                        if (boleto.estado_boleto == "V")
                        {
                            vendidos.Add(boleto);
                        }
                        if (boleto.estado_boleto == "P")
                        {
                            asignados.Add(boleto);
                        }
                        if (boleto.estado_boleto == "NULL" || boleto.estado_boleto == String.Empty)
                        {
                            pendientes.Add(boleto);
                        }

                        /* Buscamos el boleto por su clave */
                        ResultSet dbBoletoComprador = db.getTable(String.Format(@"
SELECT TOP 1 bol.PK1, bol.FOLIO, CAST(bol.FOLIODIGITAL as NVARCHAR(16)) FOLIODIGITAL, tal.FOLIO AS TAL_FOLIO, scb.PK_COLABORADOR, tal.PK_SORTEO, ISNULL(comp.PK1,-1) tiene_comprador, com.NOMBRE, com.APELLIDOS, com.TELEFONO_M, com.CORREO, com.CALLE, com.NUMERO, com.COLONIA, com.ESTADO, com.MUNDEL, com.TELEFONO_F
FROM boletos bol
INNER JOIN TALONARIOS tal
ON tal.PK1 = bol.PK_TALONARIO
LEFT JOIN COLABORADORES_BOLETOS scb
ON scb.PK_BOLETO = bol.PK1
LEFT JOIN COMPRADORES_BOLETOS comp
ON comp.PK_BOLETO = bol.PK1
LEFT JOIN COMPRADORES com 
ON com.PK1 = comp.PK_COMPRADOR
WHERE bol.PK1 = {0}", boleto.clave));

                        /* Si el boleto existe, procedemos a extraer sus datos */
                        if (dbBoletoComprador.Next())
                        {
                            /* Revisamos si tiene un comprador */
                            if (dbBoletoComprador.GetInt("tiene_comprador") > -1)
                            {
                                /* Si tiene comprador agregamos los datos al objeto de salida */
                                boleto.comprador = new Comprador()
                                {
                                    nombre    = dbBoletoComprador.Get("NOMBRE"),
                                    apellidos = dbBoletoComprador.Get("APELLIDOS"),
                                    celular   = dbBoletoComprador.Get("TELEFONO_M"),
                                    correo    = dbBoletoComprador.Get("CORREO"),
                                    direccion = new Direccion()
                                    {
                                        calle     = dbBoletoComprador.Get("CALLE"),
                                        numero    = dbBoletoComprador.Get("NUMERO"),
                                        colonia   = dbBoletoComprador.Get("COLONIA"),
                                        estado    = dbBoletoComprador.Get("ESTADO"),
                                        municipio = dbBoletoComprador.Get("MUNDEL"),
                                        telefono  = dbBoletoComprador.Get("TELEFONO_F")
                                    }
                                };
                            }
                        }
                    }
                    //talonario.boletos = pendientes.ToArray();

                    talonario.Boletos.Add("pendientes", pendientes.ToArray());
                    talonario.Boletos.Add("vendidos", vendidos.ToArray());
                    talonario.Boletos.Add("asignados", asignados.ToArray());
                }
                ;

                #endregion
            }
            ;

            db.Close();

            persona.version = "1.0.2";

            return(persona);
        }
        /// <summary>
        /// Función que permite enviar un boleto por correo
        /// </summary>
        /// <param name="clave">Clave del boleto al que se le va enviar el correo</param>
        /// <param name="clave_persona">Clave de la persona dueña del talonario</param>
        public static void EnviarBoleto(long clave, long clave_persona)
        {
            /* Traemos los datos del sorteo activo */
            Sorteo sorteo_activo = SorteoService.ObtenerActivo();

            Boleto boleto = ObtieneBoleto(clave, clave_persona);

            Colaborador colaborador = ColaboradorService.ObtienePorClave(clave_persona);

            /* Si el talonario existe, traemos sus datos */
            if (boleto != null && boleto.comprador != null)
            {
                string       urlBoleto = string.Format("{0}/boleto/{1}", ConfigurationManager.AppSettings["App.Url.Base"], boleto.token);
                MemoryStream qrImage   = GenerateQRCode(urlBoleto);

                String nombreArchivo = String.Format("boleto-{0}", boleto.folio);
                System.Net.Mail.Attachment qrAttachment = new System.Net.Mail.Attachment(qrImage, nombreArchivo, System.Net.Mime.MediaTypeNames.Image.Jpeg)
                {
                    ContentId   = String.Format("{0}@anahuac.mx", nombreArchivo),
                    ContentType = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Image.Jpeg),
                    Name        = String.Format("{0}.jpg", nombreArchivo)
                };
                qrAttachment.ContentDisposition.Inline = true;

                System.Drawing.Image frenteBoleto = Bitmap.FromFile(System.Web.Hosting.HostingEnvironment.MapPath("~/Content/Imagenes/Boleto_final_Sorteo_2017.png"));
                Graphics             g            = Graphics.FromImage(frenteBoleto);
                g.DrawString(boleto.folio, System.Drawing.SystemFonts.DefaultFont, System.Drawing.Brushes.Black, new RectangleF(832, 13, 85, 29));

                MemoryStream frenteImage = new MemoryStream();
                frenteBoleto.Save(frenteImage, System.Drawing.Imaging.ImageFormat.Jpeg);
                frenteImage.Position = 0;

                System.Net.Mail.Attachment boletoAttach = new System.Net.Mail.Attachment(frenteImage, String.Format("Boleto_final_Sorteo_2017_{0}.jpg", boleto.folio), System.Net.Mime.MediaTypeNames.Image.Jpeg)
                {
                    ContentId = "*****@*****.**"
                };
                boletoAttach.ContentDisposition.Inline = true;

                System.Net.Mail.Attachment reversoAttach = new System.Net.Mail.Attachment(System.Web.Hosting.HostingEnvironment.MapPath("~/Content/Imagenes/Boleto_final_Sorteo.png"))
                {
                    ContentId = "*****@*****.**"
                };
                reversoAttach.ContentDisposition.Inline = true;

                System.Net.Mail.Attachment logoAttach = new System.Net.Mail.Attachment(System.Web.Hosting.HostingEnvironment.MapPath("~/Content/Imagenes/AHC_Logo-Correo.png"))
                {
                    ContentId = "*****@*****.**"
                };
                logoAttach.ContentDisposition.Inline = true;



                Code.CorreoUtil.Enviar(
                    new string[] { boleto.comprador.correo },
                    String.Format("Sorteo Anáhuac: Boleto {0}", boleto.folio),
                    String.Format(@"<html>
<head>
</head>
<body>
    <style type=""text/css"">
        #boleto-logo img {{
            width: 120px;
        }}

        #contenido-correo {{
            font-family: Tahoma, Verdana, Arial, sans-serif;
            text-align: center;
        }}

        #contenido-correo h3 {{
            color: #ea7200;
            font-style: italic;
            font-size: 1.1em;
        }}

        #contenido-correo p.boleto-descripcion {{
            color: #666;
        }}

        .boletos-conteo {{
            color: #ea7200;
        }}
    
        #boleto-detalle-contenido {{
            margin-top: 1em;
            text-align: center;
        }}

        .boleto-contacto, .boleto-url {{
            color: #666;
            font-size: 0.8em;
        }}

        .boleto-contacto span {{
            color: #000;
            font-size: 1.3em;
            font-weight: bold;
        }}

        #qrURL-boleto, #reverso-boleto {{
            margin-bottom: 1.2em;
        }}

        #frente-boleto img, #reverso-boleto img {{
            width: 75%;
        }}

    </style>
    <div id=""contenido-correo"">
    <p>
        <div id=""boleto-logo""><img src=""cid:{16}"" /></div>
    </p>
    <h2 class=""talonario-boletos-header con-flecha-llamada"">Boleto <span class=""boletos-conteo"">{0}</span></h2>
    <h3>¡Felicidades!</h3>
    <p class=""boleto-descripcion"">Has comprado el <b>boleto {0}</b> del Sorteo Anáhuac.<br/>A continuación te presentamos los datos de tu compra:</p>
    <div id=""boleto-detalle-contenido"">
    <p class=""boleto-contacto"">
        Dueño<br/>
        <span>{1} {2}</span>
    </p>
    <p class=""boleto-contacto"">
        Domicilio:<br/>
        <span>{6}</span> <span>{7}</span><br/>
        <span>{8}</span>, <span>{9}</span>
    </p>
    <p class=""boleto-contacto"">
        Teléfono fijo:<br/>
        <span>{5}</span>
    </p>
    <p class=""boleto-contacto"">
        Teléfono móvil:<br/>
        <span>{4}</span>
    </p>
    <p class=""boleto-contacto"">
        Correo electrónico:<br/>
        <span>{3}</span>
    </p>
    <p class=""boleto-contacto"">
        Cuenta bancaria:<br/>
        <span>{12}</span>
    </p>
    <p class=""boleto-contacto"">
        Referencia bancaria:<br/>
        <span>{13}</span>
    </p>
    <p>
        <div id=""qrURL-boleto""><img src=""cid:{11}"" /></div>
    </p>
    <p class=""boleto-contacto"">
        {17}
    </p>
    <p>
        <div id=""frente-boleto""><img src=""cid:{14}"" /></div>
        <div id=""reverso-boleto""><img src=""cid:{15}"" /></div>
    </p>
    <p class=""boleto-contacto"">
    Para más información, puedes revisar nuestro sitio web en<br/><a href=""http://www.sorteoanahuac.mx/"" target=""_blank"">http://www.sorteoanahuac.mx/</a>.
    </p>
    </div>
    </div>
</body>
<html>",
                                  boleto.folio,
                                  boleto.comprador.nombre,
                                  boleto.comprador.apellidos,
                                  boleto.comprador.correo,
                                  boleto.comprador.celular,
                                  boleto.comprador.direccion.telefono,
                                  boleto.comprador.direccion.calle,
                                  boleto.comprador.direccion.numero,
                                  boleto.comprador.direccion.municipio,
                                  boleto.comprador.direccion.estado,
                                  boleto.token,
                                  qrAttachment.ContentId,
                                  sorteo_activo.cuenta_bancaria,
                                  colaborador.referencia_bancaria,
                                  boletoAttach.ContentId,
                                  reversoAttach.ContentId,
                                  logoAttach.ContentId,
                                  urlBoleto),
                    new System.Net.Mail.Attachment[] { qrAttachment, boletoAttach, reversoAttach, logoAttach });
                return;
            }
        }