/// <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; } }