/// <summary> /// Envia un correo con el pasaje reservado al usuario especificado /// </summary> /// <param name="u">Usuario al que se le envia el correo</param> /// <param name="p">Pasaje a enviar en el correo</param> public void EnviarPasajeReservado(Usuario u, Pasaje p, ConfirmarPagoModel cpm) { try { // obtengo el pasaje en PDF en base64 string pdfBase64 = new PdfHelper().GenerarPasaje(u, p, cpm); // crea el correo para enviar EmailDTO email = new EmailDTO() { // datos de quien envia sender = new EmailInvolvedDTO() { email = ConfigurationManager.AppSettings["SendinBlueMailSenderEmail"], name = ConfigurationManager.AppSettings["SendinBlueMailSenderName"], }, // asunto subject = ConfigurationManager.AppSettings["SendinBlueMailSubject"], // contenido html (ya no lo uso porque uso un template) //htmlContent = emailHtml, // ID del template a usar templateId = 1, }; // Establesco la lista de destinatarios (que en realidad es uno solo) email.to.Add( new EmailInvolvedDTO() { email = u.persona.correo, name = u.persona.nombre, } ); //agrego el archivo adjunto email.attachment.Add( new EmailAttachmentBase64DTO() { name = "pasaje_" + p.id + ".pdf", content = pdfBase64, } ); //agrego los parametros que se usan en el template [email protected]("nombre", u.persona.nombre); string json = Newtonsoft.Json.JsonConvert.SerializeObject(email); // envio la peticion HTTP con los datos a la API de SendinBlue HttpResponseMessage response = Task.Run(() => client.PostAsJsonAsync("smtp/email", email)).Result; response.EnsureSuccessStatusCode(); } catch (Exception e) { throw new Exception("Ocurrió un error al enviar el correo. " + e.Message); } }
public async Task <ActionResult> ComprarPasaje(ComprarPasajeModel cpm) { try { cpm.lineas = (List <Share.Entities.Linea>) await gp.ListarLinea(); cpm.precioElegirAsiento = await up.PrecioParaElegirAsiento(); // calidacion if (!TryValidateModel(cpm, nameof(ComprarPasaje))) { return(View(cpm)); } ConfirmarPagoModel confPago = new ConfirmarPagoModel() { fecha = cpm.fecha, idViaje = cpm.idViaje, idLinea = cpm.idLinea, idParadaOrigen = cpm.idParadaOrigen, idParadaDestino = cpm.idParadaDestino, asiento = cpm.asiento, precio = cpm.precio, nombreLinea = Task.Run(() => gp.obtenerLinea(cpm.idLinea)).Result.nombre, nombreParadaOrigen = Task.Run(() => gp.obtenerParada(cpm.idParadaOrigen)).Result.nombre, nombreParadaDestino = Task.Run(() => gp.obtenerParada(cpm.idParadaDestino)).Result.nombre, hora = Task.Run(() => gp.obtenerViaje(cpm.idViaje)).Result.horario.hora, }; return(View("ConfirmarPago", confPago)); } catch (Exception) { return(View(cpm)); } }
public string GenerarPasaje(Usuario usuario, Pasaje pasaje, ConfirmarPagoModel cpm) { // primero organizo los datos que se van a mostrar en el PDF // genero el QR Image imagenQR = this.generarQR(pasaje.id.ToString()); // Información que se va a mostrar IDictionary <string, string> datos = new Dictionary <string, string>(); datos.Add("Linea:", cpm.nombreLinea); datos.Add("Fecha y hora:", cpm.fecha.ToString("dd/MM/yyyy") + " " + cpm.hora.ToString(@"hh\:mm")); datos.Add("Origen:", cpm.nombreParadaOrigen); datos.Add("Destino:", cpm.nombreParadaDestino); datos.Add("Asiento:", cpm.asiento == 0 ? "Sin asiento" : cpm.asiento.ToString()); datos.Add("Precio:", "$ " + cpm.precio); // --------------------------------- // creo un documento Document doc = new Document(PageSize.A5.Rotate(), 18, 18, 18, 18); // creo un espacio en memoria para ir generando el documento MemoryStream ms = new MemoryStream(); // creo un escritor de pdf pasandole el documento y el espacio de memoria PdfWriter writer = PdfWriter.GetInstance(doc, ms); doc.Open(); // creo el tipo de fuente // hay que pasarsela a cada parafo que se quiera escribir con ella BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.WINANSI, BaseFont.EMBEDDED); // agrego una linea horizontal arriba de todo doc.Add(new Paragraph(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.GRAY, Element.ALIGN_LEFT, 1)))); // creo la tabla principal del pasaje PdfPTable tabla = new PdfPTable(4); // 4 columnas PdfPCell celdaQR = new PdfPCell(imagenQR) { Border = 0, HorizontalAlignment = 1, }; // agrego la celda a la tabla principal tabla.AddCell(celdaQR); // creo una tabla con los detalles del pasaje // esta tabla estará contenida dentro de una celda al lado del codigo QR PdfPTable tablaDetalles = new PdfPTable(4); // agrego datos a esta tabla foreach (var item in datos) { tablaDetalles.AddCell(new PdfPCell(new Phrase(item.Key)) { Border = 0 }); tablaDetalles.AddCell(new PdfPCell(new Phrase(item.Value)) { Colspan = 3, Border = 0 }); } // creo una la celda para la tabla que llené recien, y esa celda la agrego a la tabla principal tabla.AddCell(new PdfPCell(tablaDetalles) { Colspan = 3, Border = 0, }); // agrego la tabla principal al documento doc.Add(tabla); // agrego una linea horizontal abajo de todo doc.Add(new Paragraph(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.GRAY, Element.ALIGN_LEFT, 1)))); // finalizo el documento writer.CloseStream = false; doc.Close(); ms.Position = 0; // convierto el documento a Base64 y lo retorna return(Convert.ToBase64String(ms.ToArray())); }
public async Task <ActionResult> ConfirmarPago(ConfirmarPagoModel cpm) { Pasaje pasaje = new Pasaje(); try { // Pseudocodigo: // obtener datos del usuario y de pasaje a reservar // Realizar la reserva // Verificar el estado del pago, si es correcto: // mostrar mensaje ok // si no: // cancelar la reserva // mostrar mensaje error // obtengo al usuario logueado Usuario u = (Usuario)Session["datosLogeados"]; // completo los datos necesarios para reservar ReservarPasajeDTO rpdto = new ReservarPasajeDTO() { idViaje = cpm.idViaje, idParadaOrigen = cpm.idParadaOrigen, idParadaDestino = cpm.idParadaDestino, asiento = cpm.asiento, idUsuario = u.id, documento = u.persona.documento, tipoDocumento = u.persona.tipo_documento, }; // realizo la reserva, si falla, en el catch la cancelo pasaje = await up.ReservarPasaje(rpdto); // creo un objeto Pago con la informacion necesaria Payment payment = new Payment() { TransactionAmount = (float?)cpm.precio, Token = cpm.token, Description = "Reserva de pasaje en UruguayBus", Installments = cpm.installments, PaymentMethodId = cpm.payment_method_id, IssuerId = cpm.issuer_id, Payer = new Payer() { Email = ConfigurationManager.AppSettings["UnobtrusivePayerEmail"], } }; // confirma el pago payment.Save(); /** * pending => El usuario no completo el proceso de pago todavía. * approved => El pago fue aprobado y acreditado. * authorized => El pago fue autorizado pero no capturado todavía. * in_process => El pago está en revisión. * in_mediation => El usuario inició una disputa. * rejected => El pago fue rechazado.El usuario podría reintentar el pago. * cancelled => El pago fue cancelado por una de las partes o el pago expiró. * refunded => El pago fue devuelto al usuario. * charged_back => Se ha realizado un contracargo en la tarjeta de crédito del comprador */ // verifico el estado del pago if (payment.Status == PaymentStatus.approved) { // todo bien cpm.accion = ConfirmarPagoResult.Ok; try { // mando el correo con el pasaje new EmailHelper().EnviarPasajeReservado(u, pasaje, cpm); } catch (Exception) { } } else { cpm.accion = ConfirmarPagoResult.Error; await up.CancelarPasaje(pasaje.id); } return(View(cpm)); } catch (Exception) { try { await up.CancelarPasaje(pasaje.id); } catch (Exception) { } cpm.accion = ConfirmarPagoResult.Error; return(View(cpm)); } }