/// <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));
            }
        }
Beispiel #3
0
        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));
            }
        }