0% encontró este documento útil (0 votos)
52 vistas66 páginas

Informe Proyecto

Este documento describe el desarrollo de una aplicación móvil bancaria. Presenta los objetivos, análisis del problema, arquitectura del proyecto, herramientas utilizadas, diseño de interfaz y documentación del código. El documento contiene detalles sobre el desarrollo técnico de la aplicación para automatizar los servicios financieros de un banco a través de dispositivos móviles.

Cargado por

Maria Rivera
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
52 vistas66 páginas

Informe Proyecto

Este documento describe el desarrollo de una aplicación móvil bancaria. Presenta los objetivos, análisis del problema, arquitectura del proyecto, herramientas utilizadas, diseño de interfaz y documentación del código. El documento contiene detalles sobre el desarrollo técnico de la aplicación para automatizar los servicios financieros de un banco a través de dispositivos móviles.

Cargado por

Maria Rivera
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

ASIGNATURA:

Programación Móvil II.

CATEDRÁTICO:
Ing. Ricardo Lagos.

INTEGRANTES:

Edilzon Yareth Hernández - 202010110060

Fabricio Josué García – 202010110218

María Fernanda Rivera - 201930110085

Daniela Michelle Reyes - 201910080027

Gesis Geovanna Moya - 201930020047

Arnold Josué Zamora García - 202010010248

Michael Owen Molina Rivera - 202010010271

25 de nov. del 2024.


Contenido

INTRODUCCION............................................................................................................................3
OBJETIVOS....................................................................................................................................4
OBJETIVOS GENERALES....................................................................................................4
OBJETIVOS ESPECIFICOS...................................................................................................4
ANÁLISIS DEL PROBLEMA.............................................................................................................5
ARQUITECTURA DEL PROYECTO.....................................................................................6
DESARROLLO................................................................................................................................7
HERRAMIENTAS...................................................................................................................7
LIBRERIAS.............................................................................................................................7
DISEÑO.........................................................................................................................................8
PROTOTIPO DE ALTA FIDELIDAD.............................................................................................10
CÓDIGO DOCUMENTACIÓN.......................................................................................................14
DIAGRAMA DE GANTT............................................................................................................17
CONCLUSION DEL PROYECTO.....................................................................................................18
BIBLIOGRAFÍA............................................................................................................................19
INTRODUCCION

En el vertiginoso mundo financiero actual, la digitalización se ha convertido en una


piedra angular para la eficiencia, la comodidad y la seguridad de los servicios bancarios.
En este contexto, la creación de una aplicación móvil destinada a automatizar los
servicios financieros de un banco representa un paso crucial hacia la modernización y la
satisfacción del cliente. Este informe se enfoca en analizar y presentar los aspectos clave
de esta aplicación, diseñada para digitalizar la cartera de servicios de la entidad
bancaria. La aplicación móvil no solo simplifica las operaciones financieras cotidianas
para los clientes, sino que también potencia la accesibilidad, la personalización y la
gestión integral de las finanzas personales. A lo largo de este informe, se examinarán los
beneficios, características y desafíos asociados con la implementación de esta
herramienta innovadora en el sector bancario, destacando su impacto en la experiencia
del usuario y en la competitividad del banco en el mercado actual.
OBJETIVOS

OBJETIVOS GENERALES

 Desarrollar una aplicación móvil que permita automatizar y digitalizar los


servicios financieros ofrecidos por el banco, con el fin de agilizar procesos,
reducir tiempos de espera y mejorar la experiencia del cliente.
 Proporcionar a los clientes una plataforma intuitiva, segura y fácil de usar que
les permita acceder a una amplia gama de servicios bancarios desde sus
dispositivos móviles, adaptándose a sus necesidades y preferencias individuales.
 Facilitar el acceso a los servicios financieros del banco a través de dispositivos
móviles, permitiendo a los clientes realizar transacciones en cualquier momento
y lugar, sin necesidad de acudir físicamente a una sucursal bancaria.

OBJETIVOS ESPECIFICOS

 Permitir a los usuarios realizar transacciones seguras y autorizadas, incluyendo


transferencias de fondos entre cuentas propias y de terceros, así como pagos de
servicios y compras en línea, con la garantía de que sus datos están protegidos.
 Recopilar y analizar datos sobre el comportamiento y las preferencias de los
usuarios dentro de la aplicación, con el fin de identificar áreas de mejora y
personalizar la experiencia del usuario de manera proactiva.
 Incorporar servicios como consultas de saldo, transferencias, pagos de facturas,
compra y venta de divisas, solicitud de préstamos y gestión de inversiones, entre
otros, para cubrir las necesidades financieras de los clientes de manera integral.
ANÁLISIS DEL PROBLEMA

El problema inicial radica en la necesidad de modernizar y digitalizar los servicios


financieros del banco para adaptarse a las expectativas cambiantes de los clientes,
ofreciendo una experiencia bancaria más conveniente, personalizada, segura y accesible
a través de una aplicación móvil integral.

Limitaciones de Acceso a Servicios Bancarios: En muchos casos, los clientes


enfrentan dificultades para acceder a los servicios bancarios tradicionales debido
a limitaciones de tiempo, ubicación geográfica o restricciones de horario de las
sucursales físicas. Esto puede resultar en una experiencia frustrante y poco
conveniente para los usuarios, lo que afecta negativamente su satisfacción y
lealtad hacia el banco.

Complejidad de los Procesos Tradicionales: Los procesos bancarios


convencionales, como la apertura de cuentas, la solicitud de préstamos o la
realización de transacciones, suelen ser complejos y requerir la presentación de
múltiples documentos en persona en una sucursal bancaria. Esta complejidad
puede desmotivar a los clientes y generar barreras para la utilización de los
servicios financieros.

Falta de Personalización y Autonomía: Los sistemas bancarios tradicionales


no suelen ofrecer un alto grado de personalización ni autonomía a los clientes en
la gestión de sus finanzas. Esto limita la capacidad de los usuarios para adaptar
los servicios bancarios a sus necesidades individuales y preferencias de manera
efectiva.

Riesgos de Seguridad y Fraude: La realización de transacciones financieras a


través de canales convencionales, como cajeros automáticos o cheques, conlleva
riesgos de seguridad y fraude, especialmente en entornos donde la tecnología de
seguridad no está completamente actualizada. Esto genera preocupaciones entre
los clientes sobre la seguridad de sus datos y activos financieros.
Demanda de Experiencias Digitales y Móviles: Con el avance de la tecnología
y el aumento de la penetración de smartphones, los clientes están cada vez más
inclinados hacia experiencias bancarias digitales y móviles que les brinden
conveniencia, accesibilidad y seguridad. La falta de una solución móvil integral
puede llevar a la pérdida de clientes frente a competidores que sí ofrecen esta
opción.

Necesidad de Mejorar la Competitividad: En un mercado bancario cada vez


más saturado y competitivo, la capacidad de ofrecer servicios innovadores y
adaptados a las demandas del cliente es fundamental para diferenciarse y
mantener una ventaja competitiva. La falta de una solución integral y
digitalizada puede hacer que el banco quede rezagado frente a sus competidores
que sí ofrecen este tipo de servicios.
ARQUITECTURA DEL PROYECTO

Esta arquitectura proporciona una estructura sólida para el desarrollo de nuestra


aplicación móvil que automatice los servicios financieros de un banco, garantizando la
seguridad, escalabilidad y eficiencia necesarias para cumplir con las expectativas de los
usuarios y los requisitos regulatorios del sector financiero. Es importante adaptar esta
arquitectura a las necesidades específicas del banco y del proyecto en cuestión, así como
tener en cuenta consideraciones de rendimiento, usabilidad y cumplimiento normativo
durante todo el proceso de desarrollo
DESARROLLO

HERRAMIENTAS

Star Bank - Desarrollado en una plataforma móvil de Visual Studio 2019


junto con Net Maui
Star Bank - Su base de datos se encuentra alojada en FireBase una
plataforma de base de datos con un sistema de nodos desarrollada por
google

LIBRERIAS

FirebaseStorage.net
MailKit
Microsoft.Extensions.Logging.Debug
Microsoft.Maui.Controls
Microsoft.Maui.Controls.Compatibility por Microsoft
Microsoft.NET.ILLink. Tasks
FirebaseAuth
FirebaseAuthentication.net
FirebaseAuthentication. WinUI3
FirebaseAuthentication.WPF
FirebaseDatabase.net
FirebaseStorage.net
FirebaseAdmin
FirebaseAuth
DISEÑO
PROTOTIPO DE ALTA FIDELIDAD
CÓDIGO DOCUMENTACIÓN

using Firebase.Database;
using Firebase.Database.Query;
using StarBank.Models;
using Firebase.Storage;

namespace StarBank.Views;

public partial class AddEventoPage : ContentPage


{
private string imagenUri;

public AddEventoPage()
{
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR

}
private async void OnImageTapped(object sender, EventArgs e)
{
// Navegar a la nueva página cuando se toca la imagen
// await Navigation.PushAsync(new EventoPage());
}

private async void btn_foto_Clicked(object sender, EventArgs e)


{
try
{
var result = await FilePicker.PickAsync(new PickOptions
{
PickerTitle = "Seleccionar imagen"
});

if (result != null)
{
var stream = await result.OpenReadAsync();
foto.Source = ImageSource.FromStream(() => stream);

// Guarda la URI de la imagen seleccionada


imagenUri = result.FullPath;
}
}
catch (Exception ex)
{
// Manejar la excepción
}
}

private async void btn_agregar_Clicked(object sender, EventArgs e)


{
if (string.IsNullOrWhiteSpace(txt_titulo.Text) ||
string.IsNullOrWhiteSpace(txt_descripcion.Text) ||
string.IsNullOrWhiteSpace(txt_direccion.Text) ||
string.IsNullOrWhiteSpace(txt_precio.Text) ||
string.IsNullOrWhiteSpace(imagenUri))
{
// Mostrar alerta indicando campos vacíos
await DisplayAlert("Campos Vacíos", "Por favor, complete todos los campos y seleccione una
imagen.", "Aceptar");
}
else
{
try
{
string fechaSeleccionadaString = fecha.Date.ToString("dd/MM/yyyy"); // Convierte la fecha
seleccionada a una cadena en formato "dd/MM/yyyy"
string imageUrl = await SubirImagenFirebaseStorage(imagenUri);

// Crea un nuevo objeto con los datos del evento


var nuevoEvento = new Eventos
{
Titulo = txt_titulo.Text,
Descripcion = txt_descripcion.Text,
Direccion = txt_direccion.Text,
Precio = txt_precio.Text,
Fecha = fechaSeleccionadaString,
ImagenUrl = imageUrl // URL de descarga de la imagen
};

// Guarda el nuevo evento en tu base de datos de Firebase


var firebaseClient = new FirebaseClient("https://proyectostarbank-default-rtdb.firebaseio.com/");
var eventoAgregado = await firebaseClient
.Child("Eventos") // Nombre del nodo en la base de datos
.PostAsync(nuevoEvento);

await DisplayAlert("Listo", "Evento guardado correctamente.", "Aceptar");

// Limpia los campos de entrada después de guardar el evento


txt_titulo.Text = string.Empty;
txt_descripcion.Text = string.Empty;
txt_direccion.Text = string.Empty;
txt_precio.Text = string.Empty;
fecha.Date = DateTime.Today;
imagenUri = null; // Reinicia la URI de la imagen
}
catch (Exception ex)
{
await DisplayAlert("Error", $"Error al guardar el evento: {ex.Message}", "Aceptar");
}
}
}

private async Task<string> SubirImagenFirebaseStorage(string imagenUri)


{
try
{
// Crea una instancia del cliente de Firebase Storage
var firebaseStorage = new FirebaseStorage("proyectostarbank.appspot.com");

// Obtiene el nombre de archivo de la URI de la imagen


var fileName = Path.GetFileName(imagenUri);

// Abre el archivo de imagen como flujo de datos


using (var stream = File.OpenRead(imagenUri))
{
// Sube la imagen a Firebase Storage
var imageUrl = await firebaseStorage
.Child("images") // Especifica la carpeta en la que deseas guardar la imagen
.Child(fileName) // Especifica el nombre de la imagen en Firebase Storage
.PutAsync(stream);

// Obtiene la URL de descarga de la imagen subida


return imageUrl;
}
}
catch (Exception ex)
{
Console.WriteLine($"Error al subir la imagen a Firebase Storage: {ex.Message}");
return null;
}

}
}
using Microsoft.Maui.Graphics.Text;
using StarBank.Models;

namespace StarBank.Views;

public partial class AggTarjetaPage : ContentPage


{
private String ID;
private String Cuenta;
private String nombre;
ConexionFirebase conexionFirebase = new ConexionFirebase();

public AggTarjetaPage(String Id)


{
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR
ID=Id;
txt_cvv.TextChanged += Txt_cvv_TextChanged;//FORMARO DEL CVV

txt_mm_aa.TextChanged += Txt_mm_aa_TextChanged;//FORMATO MM/AA

private async void OnImageTapped(object sender, EventArgs e)


{
// Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new Views.TransferPage(ID));
}

private async void btn_savetarjeta_Clicked(object sender, EventArgs e)


{
// Verificar si algún campo está vacío
if (string.IsNullOrWhiteSpace(txt_numTarjeta.Text) ||
string.IsNullOrWhiteSpace(txt_mm_aa.Text) ||
string.IsNullOrWhiteSpace(txt_cvv.Text) ||
string.IsNullOrWhiteSpace(txt_nameTajeta.Text) ||
string.IsNullOrWhiteSpace(txt_ciudad.Text) ||
string.IsNullOrWhiteSpace(txt_direccion.Text) ||
string.IsNullOrWhiteSpace(txt_montoAgg.Text))

{
// Mostrar alerta indicando campos vacíos
await DisplayAlert("Campos Vacíos", "Por favor, complete todos los campos.", "Aceptar");
}
else
{
DateTime fechaActual = DateTime.Now;
string fechaComoString = fechaActual.ToString("dd/MM/yyyy HH:mm:ss"); // Formato personalizado
de fecha y hora
var nombreUsuario = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "Nombre", "Usuarios");
var Cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "N_Cuenta", "Usuarios");
var Saldo = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "Saldo", "Usuarios");
String monto = txt_montoAgg.Text;
String Tarjeta=txt_numTarjeta.Text;
String MTarjeta = txt_nameTajeta.Text;
int Saldoactual = int.Parse(Saldo);
int Deposito = int.Parse(monto);
int nuevosaldo = Saldoactual + Deposito;

var IDTarjeta = await conexionFirebase.BuscarTarjeta(Tarjeta);


var saldoString = await conexionFirebase.ObtenerDatosID<Tarjetas>(IDTarjeta, "Saldo", "Tarjetas");
int saldoInt = Convert.ToInt32(saldoString);
if (saldoInt < Deposito)
{
await DisplayAlert("ERROR" , "Fondos INSUFICIENTES", "Aceptar");

}
else
{

int NuevoS = saldoInt - Deposito;


await conexionFirebase.ActualizarDatoTarjeta(IDTarjeta, "Saldo", NuevoS.ToString());
await DisplayAlert("Listo", "TRANFERENCIA REALIZADA", "Aceptar");
await conexionFirebase.RegistrarTransacciones(monto, "Tranferencia", fechaComoString, Tarjeta,
Cuenta, txt_nameTajeta.Text, nombreUsuario);
await conexionFirebase.ActualizarDatoUsuario(ID, "Saldo", nuevosaldo.ToString());

//FORMATO DEL CVV


private void Txt_cvv_TextChanged(object sender, TextChangedEventArgs e)
{
// Obtener el texto actual del Entry
var text = ((Entry)sender).Text;

// Quitar cualquier carácter que no sea dígito


var digitsOnly = new string(text.Where(char.IsDigit).ToArray());

// Si la longitud del texto es mayor que 3 (o 4), cortarlo


if (digitsOnly.Length > 3)
{
digitsOnly = digitsOnly.Substring(0, 3);
}

// Asignar el texto limpio de vuelta al Entry


((Entry)sender).Text = digitsOnly;
}

//FORMATO DEL MM/AA


private void Txt_mm_aa_TextChanged(object sender, TextChangedEventArgs e)
{
// Obtener el texto actual del Entry
var text = ((Entry)sender).Text;

// Quitar cualquier carácter que no sea dígito


var digitsOnly = new string(text.Where(char.IsDigit).ToArray());

// Si la longitud del texto es mayor que 5, cortarlo


if (digitsOnly.Length > 5)
{
digitsOnly = digitsOnly.Substring(0, 5);
}
// Insertar "/" después de los primeros 2 caracteres si aún no está presente
if (digitsOnly.Length >= 2 && !digitsOnly.Contains("/"))
{
digitsOnly = digitsOnly.Insert(2, "/");
}

// Asignar el texto limpio de vuelta al Entry


((Entry)sender).Text = digitsOnly;
}

using StarBank.Models;

using System.Net.Mail;
using System.Net;

namespace StarBank.Views;

public partial class ComprarEventoPage : ContentPage


{
public String des;
public String FECHA;
public String TITULO;
public String IMAGEN;
public String PRECIO;
public String DIRECCION;
public String id;
public String url;
ConexionFirebase conexionFirebase = new ConexionFirebase();

public ComprarEventoPage(String ID, string descripcion, String titulo, String direccion, String fecha, String
imagen, String precio)
{
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR
des = descripcion;
id = ID;
FECHA = fecha;
TITULO = titulo;
IMAGEN = imagen;
PRECIO = precio;
DIRECCION = direccion;
url = imagen;
Nom.Text = "Descripcion: " + des;
Title.Text = "EVENTO: " + TITULO;
direc.Text = "Lugar: " + DIRECCION;
prec.Text = "Precio: " + PRECIO + " Lps. ";
fechita.Text = FECHA;

// Crear una fuente de imagen URI con la URL


ImageSource imagenSource = ImageSource.FromUri(new Uri(url));
// Asignar la fuente de imagen al control Image
foto.Source = imagenSource;

// Suscribirse al evento TextChanged del Entry


txt_cantidad.TextChanged += Txt_cantidad_TextChanged;

// Calcular el total inicial


CalcularTotal();
}

private async void OnImageTapped(object sender, EventArgs e)


{
// Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new VerEventosPage(id));
}

private async void btn_comprar_Clicked(object sender, EventArgs e)


{
var saldoString = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Saldo", "Usuarios");
int SaldoActual = Convert.ToInt32(saldoString);
string cantidadTexto = txt_cantidad.Text;
int cantidad = int.Parse(cantidadTexto);
Double PRecio = double.Parse(PRECIO);
Double tot = PRecio * cantidad;
double SaldoOrigen = SaldoActual - tot;
if (SaldoActual < tot)
{
await DisplayAlert("ERROR", "FONDOS INSUFICIENTES", "Aceptar");
return;
}
else
{
String totalentradas = tot.ToString();
await conexionFirebase.ActualizarDatoUsuario(id, "Saldo", SaldoOrigen.ToString());
DateTime fechaActual = DateTime.Now.Date;
string fechaComoString = fechaActual.ToString("dd/MM/yyyy"); // Formato personalizado de fecha y
hora
string CunetaO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "N_Cuenta", "Usuarios");
string NombreO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Nombre", "Usuarios");
string ApellidoO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Apellidos", "Usuarios");
string correo = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Correo", "Usuarios");
await conexionFirebase.RegistrarTransacciones(totalentradas, "EVENTO", fechaComoString, CunetaO,
"EVENTOS", NombreO + "" + ApellidoO, TITULO);

await EnviarCorreoVerificacion(correo,TITULO, cantidadTexto,FECHA, PRECIO, totalentradas);


await DisplayAlert("lISTO", "eVENTO pAGADO", "Aceptar");

private void Txt_cantidad_TextChanged(object sender, TextChangedEventArgs e)


{
// Calcular el total cada vez que cambie el texto en el Entry
CalcularTotal();
}

private void CalcularTotal()


{
string cantidadTexto = txt_cantidad.Text;
if (!string.IsNullOrEmpty(cantidadTexto))
{
int cantidad = int.Parse(cantidadTexto);
Double PRecio = double.Parse(PRECIO);
Double tot = PRecio * cantidad;
String totalText = "0";
totalText = tot.ToString();

total.Text = "Total a pagar: " + totalText + " .Lps";


}
else
{
total.Text = "Ingrese una cantidad";
}

public async Task EnviarCorreoVerificacion(string email, string tituloEvento, String totalEntradas, string
fecha, string precioTicket,String total)
{
var fromAddress = new MailAddress("[email protected]", "STARBANK");
var toAddress = new MailAddress(email, "Estimado/a Cliente");
const string fromPassword = "oliswwttazemnlyn";
const string subject = "Detalles de la Factura y Verificación";

string body = "<html><head><style>" +


"body { font-family: Arial, sans-serif; }" +
"h2 { color: #007bff; }" +
"ul { list-style-type: none; padding: 0; }" +
"li { margin-bottom: 8px; }" +
".total { font-weight: bold; }" +
".signature { font-style: italic; font-size: 0.9em; color: #888; }" +
"</style></head><body>" +
"<h2>Estimado/a Cliente,</h2>" +
"<h3>Detalles del Evento y Verificación</h3>" +
"<p>Adjunto encontrará los detalles de su reserva junto con un código de verificación para
garantizar la seguridad de la transacción.</p>" +
"<hr />" + // Línea divisiva
"<ul>" +
"<li><strong>Evento:</strong> " + tituloEvento + "</li>" +
"<li><strong>Total de Entradas:</strong> " + totalEntradas + "</li>" +
"<li><strong>Fecha:</strong> " + fecha + "</li>" +
"<li><strong>Precio por Entrada:</strong> $" + precioTicket + "</li>" +
"<li class='total'><strong>Total a Pagar:</strong> $" + (total) + ".00</li>" +
"</ul>" +
"<hr />" + // Otra línea divisiva
"<p>Por favor, utilice este código al realizar el pago para verificar su transacción.</p>" +
"<p>Gracias por confiar en STARBANK.</p>" +
"<p class='signature'>Saludos cordiales,<br/>El equipo de STARBANK</p>" +
"</body></html>";

var smtp = new SmtpClient


{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body,
IsBodyHtml = true // Habilita el formato HTML en el cuerpo del correo
})
{
await smtp.SendMailAsync(message);
}
}

}
using Firebase.Database;
using Microsoft.Maui.Storage;
using StarBank.Models;

namespace StarBank.Views;

public partial class DashboardPage : ContentPage


{
ConexionFirebase conexionFirebase = new ConexionFirebase();

private string ID;

public DashboardPage(String userString)


{
ID = userString;
InicializarBienvenidaAsync(userString);
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR

private void btn_administrar_Clicked(object sender, EventArgs e)


{

private void btn_pagar_Clicked(object sender, EventArgs e)


{
Navigation.PushAsync(new ServiciosPage(ID));//Para cambiar de Pantalla

private async void btn_transferencias_Clicked(object sender, EventArgs e)


{

await Navigation.PushAsync(new TransferPage(ID));


}

private async void btn_control_Clicked(object sender, EventArgs e)


{
await Navigation.PushAsync(new VerTransMes(ID));

private async void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e)


{
ConexionFirebase conexionFirebase = new ConexionFirebase();
await conexionFirebase.CerrarSesion();

private async void InicializarBienvenidaAsync(string userString)


{
var nombreUsuario = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "Nombre",
"Usuarios");
var ApellidoUsuario = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "Apellidos",
"Usuarios");
var Saldo = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "Saldo", "Usuarios");
var cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "N_Cuenta", "Usuarios");

txtCuenta.Text = cuenta;
saldoActual.Text = "L." + Saldo;
txtBienvenida.Text = "Bienvenido " + nombreUsuario + " " + ApellidoUsuario;
}

namespace StarBank.Views;
using Firebase.Auth;
using Firebase.Auth.Providers;
using Firebase.Database;
using Microsoft.Maui.ApplicationModel.Communication;

public partial class Login : ContentPage


{
ConexionFirebase conexionFirebase = new ConexionFirebase();
string email;
public Login()
{
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR

private async void btn_iniciar_Clicked(object sender, EventArgs e)


{
email = txt_email.Text;
string password = txt_password.Text;
if (string.IsNullOrWhiteSpace(email) || string.IsNullOrWhiteSpace(password))
{
await DisplayAlert("Error", "Por favor, ingresa tu correo electrónico y contraseña.", "Aceptar");
}
else
{
var credenciales = await conexionFirebase.InicioSesion(email, password);
txt_email.Text = "";
txt_password.Text = "";

}
}

private void btn_registrar_Clicked(object sender, EventArgs e)


{
Navigation.PushAsync(new Registrar());//Para cambiar de Pantalla

//restablecer contra
private async void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e)
{

String gmail = txt_email.Text;


if(gmail==null)
{
await DisplayAlert("StarBank", "Ingrese un Correo Valido", "OK");
}
else
{
await conexionFirebase.ContraseñaNueva(gmail);
await DisplayAlert("Restablecer Contraseña", "", "ok");
}

}
}

using StarBank.Models;
using StarBank.Models;
using StarBank.Models;
using Firebase.Database;
using Firebase.Database.Query;
using StarBank.Models;
using System.Net;
using System.Net.Mail;
namespace StarBank.Views;

public partial class PagarAguaPage : ContentPage


{
private String id;
private String Total;
private String estado;
private String IdFac;
ConexionFirebase conexionFirebase = new ConexionFirebase();
public PagarAguaPage(String ID)
{
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR
id = ID;
}

private async void OnImageTapped(object sender, EventArgs e)


{
//Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new ServiciosPage(id));
}

private async void btn_buscar_Clicked(object sender, EventArgs e)


{
var Factura = txt_codeFactura.Text;
IdFac = await conexionFirebase.BuscarFactura(Factura);
String nom = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Nombre", "Facturas");
String NFac = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "N_Factrua", "Facturas");
String Fecha = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Fecha", "Facturas");
String Consumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Consumo", "Facturas");
String Mora = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Mora", "Facturas");
String Montoconsumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "MontoConsumo",
"Facturas");
Total = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "TotalPagar", "Facturas");
estado = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Estado", "Facturas");

mora.Text = "Monto Por Mora: " + Mora;


consumo.Text = "Consumo KW: " + Consumo;
fecha.Text = "Fecha Vencimiento: " + Fecha;
name.Text = "Nombre: " + nom;
codeFact.Text = "Código Factura: " + NFac;
Mconsumo.Text = "Monto Por Consumo: " + Montoconsumo;
total.Text = "Total a Pagar: " + Total;
}

private async void btn_pagarLuz_Clicked(object sender, EventArgs e)


{
var Factura = Total;
int totalF = Convert.ToInt32(Factura);
//conexionFirebase.Registrar("123456789", "EDILZON PALACIOS", "30/03/04", "25kw", "0", "5000",
"5000","Pendiente");
var saldoString = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Saldo", "Usuarios");
int SaldoActual = Convert.ToInt32(saldoString);
if (estado == "Pagado")
{
await DisplayAlert("ERROR", "Factura Pagado", "Aceptar");

}
else
{
if (SaldoActual < totalF)
{
await DisplayAlert("ERROR", "FONDOS INSUFICIENTES", "Aceptar");
return;
}
else
{
int SaldoOrigen = SaldoActual - totalF;
await conexionFirebase.ActualizarDatoUsuario(id, "Saldo", SaldoOrigen.ToString());

DateTime fechaActual = DateTime.Now.Date;


string fechaComoString = fechaActual.ToString("dd/MM/yyyy"); // Formato personalizado de fecha
y hora
string CunetaO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "N_Cuenta", "Usuarios");
string NombreO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Nombre", "Usuarios");
string ApellidoO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Apellidos", "Usuarios");
String nom = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Nombre", "Facturas");
String NFac = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "N_Factrua", "Facturas");
String Fecha = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Fecha", "Facturas");
String Consumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Consumo",
"Facturas");
String Mora = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Mora", "Facturas");
String Montoconsumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac,
"MontoConsumo", "Facturas");
string correo = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Correo", "Usuarios");

await EnviarCorreoVerificacion(correo, NFac, nom, Fecha, Consumo, Mora, Montoconsumo, Total);


await conexionFirebase.RegistrarTransacciones(Factura, "SERVICIO", fechaComoString, CunetaO,
"EMPRESA DE AGUA", NombreO + "" + ApellidoO, "EMPRESA DE AGUA");
await DisplayAlert("Listo", "Factura de AGUA Pagada con exito", "Aceptar");

}
}

public async Task EnviarCorreoVerificacion(string Email, string codigoFactura, string nombreCliente, string
fechaVencimiento, string consumo, string montoMora, string montoConsumo, string totalPagar)
{
var fromAddress = new MailAddress("[email protected]", "STARBANK");
var toAddress = new MailAddress(Email, "Estimado/a Cliente");
const string fromPassword = "oliswwttazemnlyn";
const string subject = "Detalles de la Factura y Verificación";

string body = "<html><head><style>" +


"body { font-family: Arial, sans-serif; }" +
"h2 { color: #007bff; }" +
"ul { list-style-type: none; padding: 0; }" +
"li { margin-bottom: 8px; }" +
".total { font-weight: bold; }" +
".signature { font-style: italic; font-size: 0.9em; color: #888; }" +
"</style></head><body>" +
"<h2>Estimado/a Cliente,</h2>" +
"<h3>Factura De AGUA,</h3>" +
"<p>Adjunto encontrará los detalles de su factura junto con un código de verificación para
garantizar la seguridad de la transacción.</p>" +
"<hr />" + // Línea divisiva
"<ul>" +
"<li><strong>Código de Factura:</strong> " + codigoFactura + "</li>" +
"<li><strong>Nombre:</strong> " + nombreCliente + "</li>" +
"<li><strong>Fecha de Vencimiento:</strong> " + fechaVencimiento + "</li>" +
"<li><strong>Consumo:</strong> " + consumo + "</li>" +
"<li><strong>Monto por Mora:</strong> $" + montoMora + "</li>" +
"<li><strong>Monto por Consumo:</strong> $" + montoConsumo + "</li>" +
"<li class='total'><strong>Total a Pagar:</strong> " + totalPagar + ".Lps</li>" +
"</ul>" +
"<hr />" + // Otra línea divisiva
"<p>Por favor, utilice este código al realizar el pago para verificar su transacción.</p>" +
"<p>Gracias por confiar en STARBANK.</p>" +
"<p class='signature'>Saludos cordiales,<br/>El equipo de STARBANK</p>" +
"</body></html>";

var smtp = new SmtpClient


{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};

using (var message = new MailMessage(fromAddress, toAddress)


{
Subject = subject,
Body = body,
IsBodyHtml = true // Habilita el formato HTML en el cuerpo del correo
})
{
await smtp.SendMailAsync(message);
}
}

using StarBank.Models;
using StarBank.Models;
using Firebase.Database;
using Firebase.Database.Query;
using StarBank.Models;
using System.Net;
using System.Net.Mail;
namespace StarBank.Views;

public partial class PagarLuzPage : ContentPage


{
private String ID;
private String Total;
private String estado;
private String IdFac;
ConexionFirebase conexionFirebase = new ConexionFirebase();

public PagarLuzPage(String id)


{
ID= id;
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR

private async void OnImageTapped(object sender, EventArgs e)


{
// Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new ServiciosPage(ID));
}

private async void btn_buscar_Clicked(object sender, EventArgs e)


{
var Factura = txt_codeFactura.Text;
IdFac = await conexionFirebase.BuscarFactura(Factura);
String nom = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Nombre","Facturas");
String NFac = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "N_Factrua", "Facturas");
String Fecha = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Fecha", "Facturas");
String Consumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Consumo", "Facturas");
String Mora = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Mora", "Facturas");
String Montoconsumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "MontoConsumo",
"Facturas");
Total = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "TotalPagar", "Facturas");
estado = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Estado", "Facturas");

mora.Text ="Monto Por Mora: "+Mora;


consumo.Text ="Consumo KW: "+ Consumo;
fecha.Text ="Fecha Vencimiento: "+Fecha;
name.Text = "Nombre: "+nom;
codeFact.Text ="Código Factura: " + NFac;
Mconsumo.Text ="Monto Por Consumo: "+Montoconsumo;
total.Text="Total a Pagar: "+Total;
}

private async void btn_pagarLuz_Clicked(object sender, EventArgs e)


{
var Factura = Total;
int totalF = Convert.ToInt32(Factura);
//conexionFirebase.Registrar("123456789", "EDILZON PALACIOS", "30/03/04", "25kw", "0", "5000",
"5000","Pendiente");
var saldoString = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "Saldo", "Usuarios");
int SaldoActual = Convert.ToInt32(saldoString);
if (estado == "Pagado")
{
await DisplayAlert("ERROR", "Factura Pagado", "Aceptar");

}
else
{
if (SaldoActual < totalF)
{
await DisplayAlert("ERROR", "FONDOS INSUFICIENTES", "Aceptar");
return;
}
else
{
int SaldoOrigen = SaldoActual - totalF;
await conexionFirebase.ActualizarDatoUsuario(ID, "Saldo", SaldoOrigen.ToString());

DateTime fechaActual = DateTime.Now.Date;


string fechaComoString = fechaActual.ToString("dd/MM/yyyy"); // Formato personalizado de fecha
y hora
string CunetaO = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "N_Cuenta", "Usuarios");
string NombreO = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "Nombre", "Usuarios");
string ApellidoO = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "Apellidos",
"Usuarios");
String nom = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Nombre", "Facturas");
String NFac = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "N_Factrua", "Facturas");
String Fecha = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Fecha", "Facturas");
String Consumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Consumo",
"Facturas");
String Mora = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Mora", "Facturas");
String Montoconsumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac,
"MontoConsumo", "Facturas");
string correo = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "Correo", "Usuarios");
await EnviarCorreoVerificacion(correo, NFac, nom, Fecha, Consumo, Mora, Montoconsumo, Total);

await conexionFirebase.RegistrarTransacciones(Factura, "SERVICIO", fechaComoString, CunetaO,


"ENEE", NombreO + "" + ApellidoO, "EMPRESA DE ENERGIA ELECTRICA");
await DisplayAlert("Listo", "Factura de Energia Electrica Pagada con exito", "Aceptar");

}
}
}

public async Task EnviarCorreoVerificacion(string Email, string codigoFactura, string nombreCliente, string
fechaVencimiento, string consumo, string montoMora, string montoConsumo, string totalPagar)
{
var fromAddress = new MailAddress("[email protected]", "STARBANK");
var toAddress = new MailAddress(Email, "Estimado/a Cliente");
const string fromPassword = "oliswwttazemnlyn";
const string subject = "Detalles de la Factura y Verificación";

string body = "<html><head><style>" +


"body { font-family: Arial, sans-serif; }" +
"h2 { color: #007bff; }" +
"ul { list-style-type: none; padding: 0; }" +
"li { margin-bottom: 8px; }" +
".total { font-weight: bold; }" +
".signature { font-style: italic; font-size: 0.9em; color: #888; }" +
"</style></head><body>" +
"<h2>Estimado/a Cliente,</h2>" +
"<h3>Factura De ELECTRICIDAD,</h3>" +
"<p>Adjunto encontrará los detalles de su factura junto con un código de verificación para
garantizar la seguridad de la transacción.</p>" +
"<hr />" + // Línea divisiva
"<ul>" +
"<li><strong>Código de Factura:</strong> " + codigoFactura + "</li>" +
"<li><strong>Nombre:</strong> " + nombreCliente + "</li>" +
"<li><strong>Fecha de Vencimiento:</strong> " + fechaVencimiento + "</li>" +
"<li><strong>Consumo:</strong> " + consumo + "</li>" +
"<li><strong>Monto por Mora:</strong> $" + montoMora + "</li>" +
"<li><strong>Monto por Consumo:</strong> $" + montoConsumo + "</li>" +
"<li class='total'><strong>Total a Pagar:</strong> " + totalPagar + ".Lps</li>" +
"</ul>" +
"<hr />" + // Otra línea divisiva
"<p>Por favor, utilice este código al realizar el pago para verificar su transacción.</p>" +
"<p>Gracias por confiar en STARBANK.</p>" +
"<p class='signature'>Saludos cordiales,<br/>El equipo de STARBANK</p>" +
"</body></html>";

var smtp = new SmtpClient


{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};

using (var message = new MailMessage(fromAddress, toAddress)


{
Subject = subject,
Body = body,
IsBodyHtml = true // Habilita el formato HTML en el cuerpo del correo
})
{
await smtp.SendMailAsync(message);
}
}

}
using StarBank.Models;
using Firebase.Database;
using Firebase.Database.Query;
using StarBank.Models;
using System.Net;
using System.Net.Mail;
namespace StarBank.Views;

public partial class PagarWifiPage : ContentPage


{
private String id;
private String Total;
private String estado;
private String IdFac;
ConexionFirebase conexionFirebase = new ConexionFirebase();
public PagarWifiPage(String ID)
{
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR
id = ID;

private async void OnImageTapped(object sender, EventArgs e)


{
// Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new ServiciosPage(id));
}

private async void btn_buscar_Clicked(object sender, EventArgs e)


{
var Factura = txt_codeFactura.Text;
IdFac = await conexionFirebase.BuscarFactura(Factura);
String nom = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Nombre", "Facturas");
String NFac = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "N_Factrua", "Facturas");
String Fecha = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Fecha", "Facturas");
String Consumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Consumo", "Facturas");
String Mora = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Mora", "Facturas");
String Montoconsumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "MontoConsumo",
"Facturas");
Total = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "TotalPagar", "Facturas");
estado = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Estado", "Facturas");

mora.Text = "Monto Por Mora: " + Mora;


consumo.Text = "Consumo KW: " + Consumo;
fecha.Text = "Fecha Vencimiento: " + Fecha;
name.Text = "Nombre: " + nom;
codeFact.Text = "Código Factura: " + NFac;
Mconsumo.Text = "Monto Por Consumo: " + Montoconsumo;
total.Text = "Total a Pagar: " + Total;

private async void btn_pagarLuz_Clicked(object sender, EventArgs e)


{
var Factura = Total;
int totalF = Convert.ToInt32(Factura);
//conexionFirebase.Registrar("123456789", "EDILZON PALACIOS", "30/03/04", "25kw", "0", "5000",
"5000","Pendiente");
var saldoString = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Saldo", "Usuarios");
int SaldoActual = Convert.ToInt32(saldoString);
if (estado == "Pagado")
{
await DisplayAlert("ERROR", "Factura Pagado", "Aceptar");

}
else
{
if (SaldoActual < totalF)
{
await DisplayAlert("ERROR", "FONDOS INSUFICIENTES", "Aceptar");
return;
}
else
{
int SaldoOrigen = SaldoActual - totalF;
await conexionFirebase.ActualizarDatoUsuario(id, "Saldo", SaldoOrigen.ToString());

DateTime fechaActual = DateTime.Now.Date;


string fechaComoString = fechaActual.ToString("dd/MM/yyyy"); // Formato personalizado de fecha
y hora
string CunetaO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "N_Cuenta", "Usuarios");
string NombreO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Nombre", "Usuarios");
string ApellidoO = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Apellidos", "Usuarios");
String nom = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Nombre", "Facturas");
String NFac = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "N_Factrua", "Facturas");
String Fecha = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Fecha", "Facturas");
String Consumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Consumo",
"Facturas");
String Mora = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac, "Mora", "Facturas");
String Montoconsumo = await conexionFirebase.ObtenerDatosID<Servicios>(IdFac,
"MontoConsumo", "Facturas");
string correo = await conexionFirebase.ObtenerDatosID<Usuarios>(id, "Correo", "Usuarios");

await EnviarCorreoVerificacion(correo, NFac, nom, Fecha, Consumo, Mora, Montoconsumo, Total);

await conexionFirebase.RegistrarTransacciones(Factura, "SERVICIO", fechaComoString, CunetaO,


"ENEE", NombreO + "" + ApellidoO, "EMPRESA DE ENERGIA ELECTRICA");
await DisplayAlert("Listo", "Factura de Energia Electrica Pagada con exito", "Aceptar");

}
}

public async Task EnviarCorreoVerificacion(string Email, string codigoFactura, string nombreCliente, string
fechaVencimiento, string consumo, string montoMora, string montoConsumo, string totalPagar)
{
var fromAddress = new MailAddress("[email protected]", "STARBANK");
var toAddress = new MailAddress(Email, "Estimado/a Cliente");
const string fromPassword = "oliswwttazemnlyn";
const string subject = "Detalles de la Factura y Verificación";

string body = "<html><head><style>" +


"body { font-family: Arial, sans-serif; }" +
"h2 { color: #007bff; }" +
"ul { list-style-type: none; padding: 0; }" +
"li { margin-bottom: 8px; }" +
".total { font-weight: bold; }" +
".signature { font-style: italic; font-size: 0.9em; color: #888; }" +
"</style></head><body>" +
"<h2>Estimado/a Cliente,</h2>" +
"<h3>Factura De WIFI/CABLE,</h3>" +
"<p>Adjunto encontrará los detalles de su factura junto con un código de verificación para
garantizar la seguridad de la transacción.</p>" +
"<hr />" + // Línea divisiva
"<ul>" +
"<li><strong>Código de Factura:</strong> " + codigoFactura + "</li>" +
"<li><strong>Nombre:</strong> " + nombreCliente + "</li>" +
"<li><strong>Fecha de Vencimiento:</strong> " + fechaVencimiento + "</li>" +
"<li><strong>Consumo:</strong> " + consumo + "</li>" +
"<li><strong>Monto por Mora:</strong> $" + montoMora + "</li>" +
"<li><strong>Monto por Consumo:</strong> $" + montoConsumo + "</li>" +
"<li class='total'><strong>Total a Pagar:</strong> " + totalPagar + ".Lps</li>" +
"</ul>" +
"<hr />" + // Otra línea divisiva
"<p>Por favor, utilice este código al realizar el pago para verificar su transacción.</p>" +
"<p>Gracias por confiar en STARBANK.</p>" +
"<p class='signature'>Saludos cordiales,<br/>El equipo de STARBANK</p>" +
"</body></html>";

var smtp = new SmtpClient


{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};

using (var message = new MailMessage(fromAddress, toAddress)


{
Subject = subject,
Body = body,
IsBodyHtml = true // Habilita el formato HTML en el cuerpo del correo
})
{
await smtp.SendMailAsync(message);
}
}

using Firebase.Auth;
using Firebase.Auth;
using Firebase.Auth.Providers;
using FirebaseAdmin.Auth;
using Microsoft.Maui.ApplicationModel.Communication;
using System;
using MailKit.Net.Smtp;
using MimeKit;
using Google.Apis.Auth.OAuth2;
using System.IO;
using System.Net.Mail;
using System.Net;
namespace StarBank.Views;
using Firebase.Database;
using Firebase.Database.Query;
using StarBank.Models;
using System.Net;
using System.Net.Mail;
public partial class Registrar : ContentPage
{

public Registrar()
{

InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR

private void irLogin(object sender, EventArgs e)


{

Navigation.PushAsync(new Login());//Para cambiar de Pantalla

//Boton para registrar.


private async void btn_registrarcuenta_Clicked(object sender, EventArgs e)
{
//conexion con firebase igual mente todos los campos paera hacer validaciones
ConexionFirebase conexionFirebase = new ConexionFirebase();
string correo = txt_emailR.Text;
string contrasenia = txt_passwordR.Text;
String nombre = txt_nombre.Text;
String apellido = txt_apellidos.Text;
String dni = txt_identidad.Text;
String telefono = txt_telefono.Text;
String contra2 = txt_passwordRC.Text;
//VALIDACIONES DE CAMPOS VACIOS :O

if (string.IsNullOrWhiteSpace(correo) || string.IsNullOrWhiteSpace(contrasenia) ||
string.IsNullOrWhiteSpace(nombre) || string.IsNullOrWhiteSpace(dni) || string.IsNullOrWhiteSpace(telefono)
|| string.IsNullOrWhiteSpace(contra2))
{
await DisplayAlert("Error", "Por favor,Completa todo el Formulario.", "Aceptar");
}
else
{
if (contrasenia.Length < 6)
{
await DisplayAlert("StarBank", "¡La contraseña debe tener al menos 6 caracteres!", "OK");
return; // Salimos del método si la contraseña es demasiado corta
}
//Condicion para verificar el confirmar contraseña.
if (contrasenia == contra2 )
{
// Lógica adicional aquí si la contraseña cumple con los requisitos
string codigoGenerado = GenerarCodigoAleatorio();
await EnviarCorreoVerificacion(correo, codigoGenerado);
string result = string.Empty;
bool codigoCorrecto = false;

// Resto del código...


//usamos un cilco while para que no se cierre la ventana ermegente
//al mete mal el codigo,si no que seguira abierta pero manda una alerta al usuario... :D
while (!codigoCorrecto)
{
result = await DisplayPromptAsync("CODIGO DE VERIFICACION", "Por favor, ingrese el
codigo que se envio a su correo" +
":", "Aceptar", "Cancelar", keyboard: Keyboard.Numeric);

//Manejamos si son iguales


if (result == codigoGenerado)
{
codigoCorrecto = true;

}
else
{
await DisplayAlert("StarBank", "¡ERROR EN EL CODIGO DE VERIFICACION! Genera Otro
Codigo", "OK");
return;
}

// enviamos una alerta hacemos uso de la conexion para llamar al metodo de crear usuario
// generamos numero de cue nta actualmente sigue en prueba.
await DisplayAlert("StarBank", "¡USUARIO CREADO CON EXITO!", "OK");
//Creacion de usuario en el apartado de autenticacion
//funciones de incio y cierre de sesion
var credenciales = await conexionFirebase.CrearUsuario(correo, contrasenia);
string numeroDeCuenta = NumeroDeCuentaGenerator.GenerarNumeroDeCuenta();

//Registro en base de datos en firebase.


RegistrarUsuarios(nombre, apellido, dni, telefono, correo, numeroDeCuenta);

limpiar();
await Navigation.PushAsync(new Views.Login());//Para cambiar de Pantalla
}

}
else
{
await DisplayAlert("StarBank", "¡ERROR contraseña muy corta o no coincide !", "OK");

}
}

//Metodo para enviar el correo de verificacion


//actualmente se hace desde un correo personal... :(
public async Task EnviarCorreoVerificacion(String Email, String cod)
{

var fromAddress = new MailAddress("[email protected]", "STARBANK");


var toAddress = new MailAddress(Email, "Usuario");
const string fromPassword = "oliswwttazemnlyn";
const string subject = "Codigo de Verificacion";
string body = "Este es el Numero de verificacion: " + cod;

var smtp = new SmtpClient


{
Host = "smtp.gmail.com", // Cambia esto según tu proveedor de correo
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};

using (var message = new MailMessage(fromAddress, toAddress)


{
Subject = subject,
Body = body
})
{
smtp.Send(message);
}
}

//Clase para hacer el codigo de verificacion es de manera ramdon asi que siemppre sera diferenete
//................ :D
static string GenerarCodigoAleatorio()
{
// Creamos una instancia de la clase Random
Random random = new Random();

// Creamos una cadena para almacenar el código aleatorio


string codigo = "";

// Generamos el código aleatorio


for (int i = 0; i < 4; i++)
{
// Generamos un dígito aleatorio entre 0 y 9
int digitoAleatorio = random.Next(0, 10);

// Agregamos el dígito aleatorio a la cadena del código


codigo += digitoAleatorio.ToString();
}

// Retornamos el código aleatorio generado


return codigo;
}

//Metodo para limpiar los campos del formulario ;)


public void limpiar(){
txt_emailR.Text = string.Empty;
txt_passwordR.Text = string.Empty; ;
txt_nombre.Text = string.Empty; ;
txt_apellidos.Text = string.Empty; ;
txt_identidad.Text = string.Empty; ;
txt_telefono.Text = string.Empty; ;
txt_passwordRC.Text = string.Empty; ;
}

//GENERA NUMERO DE CUENTA


public static class NumeroDeCuentaGenerator
{
private static int contador = 1;
private static object lockObject = new object();
public static string GenerarNumeroDeCuenta()
{
int numeroDeCuenta = 0;

lock (lockObject)
{
numeroDeCuenta = contador;
contador++;
}

if (numeroDeCuenta > 9999)


{
throw new InvalidOperationException("Se ha alcanzado el máximo de números de cuenta.");
}

return numeroDeCuenta.ToString("00000");
}
}

//METODOS CRUD///

//METODO PARA AGREGAR


public static void RegistrarUsuarios(String name, String apellido,String identidad,String telefono, String
correo,String Cuenta)
{
//Estamos diciendoa nuestra base de datos que añadiremos un usuario

//Nos pide el nelace de nuestra base de datos :D


FirebaseClient user = new FirebaseClient("https://proyectostarbank-default-rtdb.firebaseio.com/");
var usuario = user.Child("Usuarios").OnceAsync<Usuarios>();
String saldo = "0";

user.Child("Usuarios").PostAsync(new Usuarios { Nombre =name, Apellidos =


apellido,DNI=identidad,Telefono=telefono,Correo=correo,N_Cuenta=Cuenta, Saldo=saldo });

}
using StarBank.Models;

namespace StarBank.Views;

public partial class ServiciosPage : ContentPage


{
ConexionFirebase conexionFirebase = new ConexionFirebase();

private String id;


public ServiciosPage(String ID)
{
id= ID;
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR
InicializarBienvenidaAsync(id);
}

private async void OnImageTapped(object sender, EventArgs e)


{
// Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new Views.DashboardPage(id));
}

private void btn_luz_Clicked(object sender, EventArgs e)


{
Navigation.PushAsync(new PagarLuzPage(id));//Para cambiar de Pantalla

private void btn_agua_Clicked(object sender, EventArgs e)


{
Navigation.PushAsync(new PagarAguaPage(id));//Para cambiar de Pantalla
}

private void btn_internet_Clicked(object sender, EventArgs e)


{
Navigation.PushAsync(new PagarWifiPage(id));//Para cambiar de Pantalla

private void btn_eventos_Clicked(object sender, EventArgs e)


{
Navigation.PushAsync(new VerEventosPage(id));//Para cambiar de Pantalla

private async void InicializarBienvenidaAsync(string userString)


{
var Saldo = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "Saldo", "Usuarios");
var Cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "N_Cuenta", "Usuarios");

cuenta.Text = Cuenta;
saldo.Text = "L." + Saldo;
}
}
using StarBank.Models;

namespace StarBank.Views;

public partial class TransCuentaPage : ContentPage


{
private String identificador;
ConexionFirebase conexionFirebase = new ConexionFirebase();

public TransCuentaPage(String id)


{
identificador = id;
ObtenerCuenta(id);
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR
}

//BOTON DE ATRAS
private async void OnImageTapped(object sender, EventArgs e)
{
//Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new TransferPage(identificador));
}

private async void btn_transCuenta_Clicked(object sender, EventArgs e)


{
// Verificar si algún campo está vacío
if (string.IsNullOrWhiteSpace(txt_Monto.Text) ||
string.IsNullOrWhiteSpace(txt_cuentaOrigen.Text) ||
string.IsNullOrWhiteSpace(txt_nameOrigen.Text) ||
string.IsNullOrWhiteSpace(txt_cuentaDestino.Text) ||
string.IsNullOrWhiteSpace(txt_nameDestino.Text) ||
string.IsNullOrWhiteSpace(txt_descripcion.Text))
{
// Mostrar alerta indicando campos vacíos
await DisplayAlert("Campos Vacíos", "Por favor, complete todos los campos.", "Aceptar");
}
else
{
var CuentaD = txt_cuentaDestino.Text;
var CuentaO = txt_cuentaOrigen.Text;
int Monto = Convert.ToInt32(txt_Monto.Text);
var MointoBD = Monto.ToString();
String IDBenficiario = await conexionFirebase.BuscarIDEnBaseDeDatos(CuentaD);
string NombreO = await conexionFirebase.ObtenerDatosID<Usuarios>(identificador, "Nombre",
"Usuarios");
string ApellidoO = await conexionFirebase.ObtenerDatosID<Usuarios>(identificador, "Apellidos",
"Usuarios");
string NombreD = await conexionFirebase.ObtenerDatosID<Usuarios>(IDBenficiario, "Nombre",
"Usuarios");
string ApellidoD = await conexionFirebase.ObtenerDatosID<Usuarios>(IDBenficiario, "Apellidos",
"Usuarios");
var saldoString = await conexionFirebase.ObtenerDatosID<Usuarios>(identificador, "Saldo",
"Usuarios");
var saldoString2 = await conexionFirebase.ObtenerDatosID<Usuarios>(IDBenficiario, "Saldo",
"Usuarios");

int SaldoActual2 = Convert.ToInt32(saldoString2);

int SaldoActual = Convert.ToInt32(saldoString);


if (SaldoActual<Monto) {
await DisplayAlert("ERROR", "FONDOS INSUFICIENTES", "Aceptar");
return;
}
else
{
int SaldoOrigen = SaldoActual - Monto;
int SaldoBeneficiario = SaldoActual2 + Monto;
await conexionFirebase.ActualizarDatoUsuario(identificador, "Saldo", SaldoOrigen.ToString());
await conexionFirebase.ActualizarDatoUsuario(IDBenficiario, "Saldo",
SaldoBeneficiario.ToString());
DateTime fechaActual = DateTime.Now.Date;
string fechaComoString = fechaActual.ToString("dd/MM/yyyy"); // Formato personalizado de fecha
y hora

await conexionFirebase.RegistrarTransacciones(MointoBD, "Transferencia", fechaComoString,


CuentaO, CuentaD, NombreO+""+ApellidoO, NombreD+""+ApellidoD);

await DisplayAlert("Listo", "Transferencia realizada correctamente.", "Aceptar");


txt_cuentaDestino.Text = string.Empty;
txt_nameDestino.Text = "Destinatario: --";
txt_Monto.Text = string.Empty;
txt_descripcion.Text = string.Empty;

// Todos los campos están llenos, continuar con la lógica de envío de transferencia
// Aquí puedes agregar el código para realizar la transferencia
}
}

private async void btn_verificar_Clicked(object sender, EventArgs e)


{
try
{
var CuentaEnvio = txt_cuentaDestino.Text;
String IDBenficiario = await conexionFirebase.BuscarIDEnBaseDeDatos(CuentaEnvio);

if (string.IsNullOrEmpty(IDBenficiario)) // Validación del ID del beneficiario


{
await DisplayAlert("ERROR", "CUENTA NO ENCONTRADA", "Aceptar");
return;
}

string Nombre = await conexionFirebase.ObtenerDatosID<Usuarios>(IDBenficiario, "Nombre",


"Usuarios");
string Apellido = await conexionFirebase.ObtenerDatosID<Usuarios>(IDBenficiario, "Apellidos",
"Usuarios");

if (string.IsNullOrEmpty(Nombre) || string.IsNullOrEmpty(Apellido)) // Verificar si el nombre o el


apellido están vacíos
{
await DisplayAlert("ERROR", "Nombre No Encontra", "Aceptar");
return;
}

txt_nameDestino.Text = Nombre + " " + Apellido;


}
catch (Exception ex)
{
await DisplayAlert("ERROR", "Ocurrió un error: " + ex.Message, "Aceptar");
return;
}

private async void ObtenerCuenta(string userString)


{
string Cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "N_Cuenta", "Usuarios");
string Nombre = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "Nombre", "Usuarios");
string Apellido = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "Apellidos",
"Usuarios");

txt_cuentaOrigen.Text = Cuenta;
txt_nameOrigen.Text = Nombre+Apellido;

using StarBank.Models;

namespace StarBank.Views;

public partial class TransferPage : ContentPage


{
private String ID;
ConexionFirebase conexionFirebase = new ConexionFirebase();

public TransferPage(String id)


{
ID = id;
InicializarBienvenidaAsync(ID);

InitializeComponent();

NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR


}

//BOTON DE ATRAS
private async void OnImageTapped(object sender, EventArgs e)
{
// Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new Views.DashboardPage(ID));
}

private void btn_transfercuenta_Clicked(object sender, EventArgs e)


{
Navigation.PushAsync(new TransCuentaPage(ID));//Para cambiar de Pantalla
}

private void btn_aggtarjeta_Clicked(object sender, EventArgs e)


{
Navigation.PushAsync(new AggTarjetaPage(ID));//Para cambiar de Pantalla
}
private async void InicializarBienvenidaAsync(string userString)
{
var Saldo = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "Saldo", "Usuarios");
string resultado = await conexionFirebase.ObtenerDatosID<Usuarios>(userString, "N_Cuenta",
"Usuarios");
N_Cuenta.Text = resultado;
Saldo_Act.Text = Saldo;
}
}

using Firebase.Database;
using StarBank.Models;

namespace StarBank.Views;

public partial class VerEventosPage : ContentPage


{
private List<Eventos> eventos;
private String id;

public VerEventosPage(String ID)


{
id = ID;

InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);//ELIMINA EL TOOLBAR

}
protected override async void OnAppearing()
{
base.OnAppearing();
var firebaseClient = new FirebaseClient("https://proyectostarbank-default-rtdb.firebaseio.com/");

try
{
// Recupera los datos de Firebase Realtime Database
var eventosSnapshot = await firebaseClient.Child("Eventos").OnceAsync<Eventos>();

// Convierte los datos de Firebase en una lista de Eventos


eventos = eventosSnapshot.Select(item => new Eventos
{
Titulo = item.Object.Titulo,
Descripcion = item.Object.Descripcion,
ImagenUrl = item.Object.ImagenUrl,
Fecha=item.Object.Fecha,
Precio=item.Object.Precio,
Direccion=item.Object.Direccion,
}).ToList();

// Asigna los datos al ItemsSource del CollectionView


collectionView.ItemsSource = eventos;
}
catch (Exception ex)
{
// Maneja la excepción si ocurre algún error al recuperar los datos de Firebase
Console.WriteLine($"Error al recuperar datos de Firebase: {ex.Message}");
}
}
private async void OnImageTapped(object sender, EventArgs e)
{
// Navegar a la nueva página cuando se toca la imagen
await Navigation.PushAsync(new ServiciosPage(id));
}
private async void btn_Ver_Clicked(object sender, EventArgs e)
{
//await Navigation.PushAsync(new ComprarEventoPage());

}
private async void collectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (collectionView.SelectedItem != null && collectionView.SelectedItem is Eventos selectedEvent)
{
// Pasar la descripción del elemento seleccionado a la nueva página
await Navigation.PushAsync(new ComprarEventoPage(id,selectedEvent.Descripcion,
selectedEvent.Titulo, selectedEvent.Direccion,
selectedEvent.Fecha, selectedEvent.ImagenUrl,selectedEvent.Precio));

// Deseleccionar el elemento después de realizar la navegación


collectionView.SelectedItem = null;
}

using Firebase.Database;

using Firebase.Database.Query;

using StarBank.Models;

using System.Globalization;

namespace StarBank.Views;

public partial class VerTransMes : ContentPage

private List<Transacciones> eventos;

private string ID;

ConexionFirebase conexionFirebase = new ConexionFirebase();

public VerTransMes(String id)

InitializeComponent();

BindingContext = this; // Esto establece el contexto de enlace en esta misma página


(VerTransMes)

ID = id;
}

protected override async void OnAppearing()

base.OnAppearing();

var firebaseClient = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");

try

string Cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "N_Cuenta",


"Usuarios");

// Construye la consulta para filtrar por título específico

// Construye la consulta para filtrar por tipo, número de cuenta y mes

var query = await firebaseClient

.Child("Transferencia")

.OrderBy("CuentaO")

.EqualTo(Cuenta)

.OnceAsync<Transacciones>();

// Convierte los datos de Firebase en una lista de Eventos

eventos = query.Select(item => new Transacciones

CuentaO = item.Object.CuentaO,

Tipo = item.Object.Tipo,

}).ToList();

// Asigna los datos al ItemsSource del CollectionView solo si hay datos disponibles

if (eventos != null && eventos.Any())

Eventos.ItemsSource = eventos;
// Muestra un mensaje de alerta en caso de éxito

// await DisplayAlert("Éxito", "Datos de Firebase recuperados correctamente",


"Aceptar");

else

// Muestra un mensaje de alerta si no se encontraron datos

await DisplayAlert("Alerta", "No se encontraron datos de Firebase", "Aceptar");

catch (Exception ex)

// Muestra un mensaje de alerta si ocurre algún error al recuperar los datos de Firebase

await DisplayAlert("Error", $"Error al recuperar datos de Firebase: {ex.Message}",


"Aceptar");

Console.WriteLine($"Error al recuperar datos de Firebase: {ex.Message}");

private async void TipoTransaccionPicker_SelectedIndexChanged(object sender,


System.EventArgs e)

// Obtener el tipo de transacción seleccionado

var selectedTipo = TipoTransaccionPicker.SelectedItem as string;

if (selectedTipo == null)

return;

// Obtener las transacciones correspondientes al tipo seleccionado

switch (selectedTipo)

case "Transferencia":
try

// Obtener el número de cuenta del usuario

string Cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "N_Cuenta",


"Usuarios");

// Inicializar el cliente de Firebase

var firebaseClient = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");

// Obtener el índice del mes seleccionado

var selectedIndex = MesPicker.SelectedIndex;

// Construye la consulta para filtrar por tipo, número de cuenta y mes

var query = await firebaseClient

.Child("Transferencia")

.OrderBy("Tipo")

.EqualTo("Transferencia")

.OnceAsync<Transacciones>();

// Filtrar los resultados por tipo, número de cuenta y mes

var resultados = query

.Where(item =>

!string.IsNullOrEmpty(item.Object.Fecha) && // Verifica que la cadena de fecha


no esté vacía

item.Object.CuentaO == Cuenta && // Ajusta según el número de cuenta que


desees validar

item.Object.Tipo == "Transferencia" && // Ajusta según el tipo que desees


validar

DateTime.TryParseExact(item.Object.Fecha, "d/M/yyyy",
CultureInfo.InvariantCulture, DateTimeStyles.None, out var fecha) && // Intenta analizar la
cadena de fecha como DateTime

fecha.Month == selectedIndex + 1) // Filtrar por el mes que desees (agregamos


1 al índice para coincidir con el sistema de numeración de meses)
.Select(item => new Transacciones

CuentaO = item.Object.CuentaO,

Tipo = item.Object.Tipo,

NombreRecibe=item.Object.NombreRecibe

// Agrega otros campos que desees recuperar

})

.ToList();

// Asigna los datos al ItemsSource del CollectionView solo si hay datos disponibles

if (resultados.Any())

Eventos.ItemsSource = resultados;

// Muestra un mensaje de alerta en caso de éxito

await DisplayAlert("Éxito", "Datos de Firebase recuperados correctamente",


"Aceptar");

else

// Muestra un mensaje de alerta si no se encontraron datos

await DisplayAlert("Alerta", "Seleccione un Mes", "Aceptar");

catch (Exception ex)

// Muestra un mensaje de alerta si ocurre algún error al recuperar los datos de


Firebase

await DisplayAlert("Error", $"Error al recuperar datos", "Aceptar");

}
break;

case "Evento":

try

// Obtener el número de cuenta del usuario

string Cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "N_Cuenta",


"Usuarios");

// Inicializar el cliente de Firebase

var firebaseClient = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");

// Obtener el índice del mes seleccionado

var selectedIndex = MesPicker.SelectedIndex;

// Construye la consulta para filtrar por tipo, número de cuenta y mes

var query = await firebaseClient

.Child("Transferencia")

.OrderBy("Tipo")

.EqualTo("EVENTO")

.OnceAsync<Transacciones>();

// Filtrar los resultados por tipo, número de cuenta y mes

var resultados = query

.Where(item =>

!string.IsNullOrEmpty(item.Object.Fecha) && // Verifica que la cadena de fecha


no esté vacía

item.Object.CuentaO == Cuenta && // Ajusta según el número de cuenta que


desees validar

item.Object.Tipo == "EVENTO" && // Ajusta según el tipo que desees validar

DateTime.TryParseExact(item.Object.Fecha, "d/M/yyyy",
CultureInfo.InvariantCulture, DateTimeStyles.None, out var fecha) && // Intenta analizar la
cadena de fecha como DateTime
fecha.Month == selectedIndex + 1) // Filtrar por el mes que desees (agregamos
1 al índice para coincidir con el sistema de numeración de meses)

.Select(item => new Transacciones

CuentaO = item.Object.CuentaO,

Tipo = item.Object.Tipo,

NombreRecibe = item.Object.NombreRecibe

// Agrega otros campos que desees recuperar

})

.ToList();

// Asigna los datos al ItemsSource del CollectionView solo si hay datos disponibles

if (resultados.Any())

Eventos.ItemsSource = resultados;

// Muestra un mensaje de alerta en caso de éxito

await DisplayAlert("Éxito", "Datos de Firebase recuperados correctamente",


"Aceptar");

else

// Muestra un mensaje de alerta si no se encontraron datos

await DisplayAlert("Alerta", "No se encontraron datos de Firebase para los


criterios especificados" + Cuenta, "Aceptar");

catch (Exception ex)

// Muestra un mensaje de alerta si ocurre algún error al recuperar los datos de


Firebase

await DisplayAlert("Error", $"Error al recuperar datos de Firebase: {ex.Message}",


"Aceptar");
Console.WriteLine($"Error al recuperar datos de Firebase: {ex.Message}");

break;

case "Servicio":

try

// Obtener el número de cuenta del usuario

string Cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "N_Cuenta",


"Usuarios");

// Inicializar el cliente de Firebase

var firebaseClient = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");

// Obtener el índice del mes seleccionado

var selectedIndex = MesPicker.SelectedIndex;

// Construye la consulta para filtrar por tipo, número de cuenta y mes

var query = await firebaseClient

.Child("Transferencia")

.OrderBy("Tipo")

.EqualTo("SERVICIO")

.OnceAsync<Transacciones>();

// Filtrar los resultados por tipo, número de cuenta y mes

var resultados = query

.Where(item =>

!string.IsNullOrEmpty(item.Object.Fecha) && // Verifica que la cadena de fecha


no esté vacía
item.Object.CuentaO == Cuenta && // Ajusta según el número de cuenta que
desees validar

item.Object.Tipo == "SERVICIO" && // Ajusta según el tipo que desees validar

DateTime.TryParseExact(item.Object.Fecha, "d/M/yyyy",
CultureInfo.InvariantCulture, DateTimeStyles.None, out var fecha) && // Intenta analizar la
cadena de fecha como DateTime

fecha.Month == selectedIndex + 1) // Filtrar por el mes que desees (agregamos


1 al índice para coincidir con el sistema de numeración de meses)

.Select(item => new Transacciones

CuentaO = item.Object.CuentaO,

Tipo = item.Object.Tipo,

NombreRecibe = item.Object.NombreRecibe

// Agrega otros campos que desees recuperar

})

.ToList();

// Asigna los datos al ItemsSource del CollectionView solo si hay datos disponibles

if (resultados.Any())

Eventos.ItemsSource = resultados;

// Muestra un mensaje de alerta en caso de éxito

await DisplayAlert("Éxito", "Datos de Firebase recuperados correctamente",


"Aceptar");

else

// Muestra un mensaje de alerta si no se encontraron datos

await DisplayAlert("Alerta", "No se encontraron datos de Firebase para los


criterios especificados" + Cuenta, "Aceptar");

}
catch (Exception ex)

// Muestra un mensaje de alerta si ocurre algún error al recuperar los datos de


Firebase

await DisplayAlert("Error", $"Error al recuperar datos de Firebase: {ex.Message}",


"Aceptar");

Console.WriteLine($"Error al recuperar datos de Firebase: {ex.Message}");

break;

default:

break;

private async void MesPicker_SelectedIndexChanged(object sender, EventArgs e)

// Obtener el tipo de transacción seleccionado

var selectedTipo = TipoTransaccionPicker.SelectedItem as string;

if (selectedTipo == null)

return;

// Obtener el número de cuenta del usuario

string Cuenta = await conexionFirebase.ObtenerDatosID<Usuarios>(ID, "N_Cuenta",


"Usuarios");

// Inicializar el cliente de Firebase

var firebaseClient = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");
// Obtener el índice del mes seleccionado

var selectedIndex = MesPicker.SelectedIndex;

try

// Construye la consulta para filtrar por tipo, número de cuenta y mes

var query = await firebaseClient

.Child("Transferencia")

.OrderBy("Tipo")

.EqualTo("Transferencia")

.OnceAsync<Transacciones>();

// Filtrar los resultados por tipo, número de cuenta y mes

var resultados = query

.Where(item =>

!string.IsNullOrEmpty(item.Object.Fecha) && // Verifica que la cadena de fecha no


esté vacía

item.Object.CuentaO == Cuenta && // Ajusta según el número de cuenta que


desees validar

item.Object.Tipo == "Transferencia" && // Ajusta según el tipo que desees validar

DateTime.TryParseExact(item.Object.Fecha, "d/M/yyyy",
CultureInfo.InvariantCulture, DateTimeStyles.None, out var fecha) && // Intenta analizar la
cadena de fecha como DateTime

fecha.Month == selectedIndex + 1) // Filtrar por el mes que desees (agregamos 1 al


índice para coincidir con el sistema de numeración de meses)

.Select(item => new Transacciones

CuentaO = item.Object.CuentaO,

Tipo = item.Object.Tipo,

NombreRecibe = item.Object.NombreRecibe

// Agrega otros campos que desees recuperar

})

.ToList();
// Asigna los datos al ItemsSource del CollectionView solo si hay datos disponibles

if (resultados.Any())

Eventos.ItemsSource = resultados;

// Muestra un mensaje de alerta en caso de éxito

await DisplayAlert("Éxito", "Datos de Firebase recuperados correctamente",


"Aceptar");

else

// Muestra un mensaje de alerta si no se encontraron datos

await DisplayAlert("Alerta", "No se encontraron datos de Firebase para los criterios


especificados" + Cuenta, "Aceptar");

catch (Exception ex)

// Muestra un mensaje de alerta si ocurre algún error al recuperar los datos de Firebase

await DisplayAlert("Error", $"Error al recuperar datos de Firebase: {ex.Message}",


"Aceptar");

Console.WriteLine($"Error al recuperar datos de Firebase: {ex.Message}");

using Firebase.Auth;

using Firebase.Auth.Providers;

using Firebase.Database;

using Firebase.Database.Query;
using Microsoft.Maui.Storage;

using MimeKit;

using StarBank.Models;

namespace StarBank

internal class ConexionFirebase

FirebaseClient client = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");

public static FirebaseAuthClient ConectarFirebase()

var config = new FirebaseAuthConfig

ApiKey = "AIzaSyCftYHrKkZgRw4WYt6ZBvQKjacGlh_MtJ8",

AuthDomain = "proyectostarbank.web.app",

Providers = new Firebase.Auth.Providers.FirebaseAuthProvider[]

// Add and configure individual providers

new Firebase.Auth.Providers.GoogleProvider().AddScopes("email"),

new Firebase.Auth.Providers.EmailProvider(),

new Firebase.Auth.Providers.GoogleProvider().AddScopes("email"),

new Firebase.Auth.Providers.EmailProvider()

// ...

},
};

var client = new FirebaseAuthClient(config);

return client;

//<CREAR USUARIO

public async Task<UserCredential> CrearUsuario(string Email, string Password)

var cliente = ConectarFirebase();

var userCredential = await cliente.CreateUserWithEmailAndPasswordAsync(Email,


Password);

return userCredential;

//MANJEMOS EL INCIO DE SESION

public async Task<UserCredential> InicioSesion(string Email, string Password)

try

//HACEMOS CONECXION

var cliente = ConectarFirebase();

//USAMOS EL INCIO DE SESION CON EMAIL Y CONTRASEÑA

var userCredential = await cliente.SignInWithEmailAndPasswordAsync(Email,


Password);

//OBTENEMOS EL ID DEL USUARIO QUE SE CONECTO


//oBTENEMOS EL USUARIO Y LO CONVERTIMOS EN UNA CADENA DE TEXTO

var userId = await BuscarCorreoEnBaseDeDatos(Email);

String userString = userId.ToString();

//CAMBIAMOS DE PAGINA Y LE MANDAMOS PARAMETROS DE LOS DATOS QUE


NECESITAMOS

await Application.Current.MainPage.Navigation.PushAsync(new
Views.DashboardPage(userId.ToString()));

return userCredential;

catch (FirebaseAuthException ex)

await Application.Current.MainPage.DisplayAlert("Error", "Correo electrónico o


contraseña incorrectos.", "Aceptar");

return null;

//cerrar sesion x(

public async Task CerrarSesion()

try

var cliente = ConectarFirebase();


cliente.SignOut();

await Application.Current.MainPage.Navigation.PopToRootAsync();

await Application.Current.MainPage.Navigation.PushAsync(new Views.Login());//


Redirigir a la página de inicio de sesión después de cerrar sesión

catch (FirebaseAuthException ex)

// Manejar la excepción si ocurre algún error durante el cierre de sesión

await Application.Current.MainPage.DisplayAlert("Error", "Se produjo un error al


cerrar sesión.", "Aceptar");

//Usamos un metodo de firebase para recuperar contraseña mediante el correo


electronico

public async Task ContraseñaNueva(String correo)

var cliente = ConectarFirebase();

await cliente.ResetEmailPasswordAsync(correo);

//Estamos buscando en nuestra base de datos nuestro correo y obtenemos nuestro id


poara manejar los datos.

public async Task<string> BuscarCorreoEnBaseDeDatos(string correo)

var usuarios = await client.Child("Usuarios").OnceAsync<Dictionary<string, string>>();

string userId = ""; // Inicializa userId con un valor predeterminado

foreach (var usuario in usuarios)


{

if (usuario.Object["Correo"] == correo)

userId = usuario.Key;

return userId;

return "no encontrado";

//Estamos buscando en nuestra base de datos nuestro correo y obtenemos nuestro id


poara manejar los datos.

public async Task<string> BuscarIDEnBaseDeDatos(string cuenta)

var usuarios = await client.Child("Usuarios").OnceAsync<Dictionary<string, string>>();

string userId = ""; // Inicializa userId con un valor predeterminado

foreach (var usuario in usuarios)

if (usuario.Object["N_Cuenta"] == cuenta)

userId = usuario.Key;

return userId;

return "no encontrado";

public async Task<string> BuscarTarjeta(string numeroTarjeta)


{

var tarjetas = await client.Child("Tarjetas").OnceAsync<Dictionary<string, string>>();

string userId = ""; // Inicializa userId con un valor predeterminado

foreach (var tarjeta in tarjetas)

if (tarjeta.Object["N_Tarjeta"] == numeroTarjeta)

userId = tarjeta.Key;

return userId;

return "No encontrado";

public async Task<string> BuscarFactura(string NumeroFactura)

var tarjetas = await client.Child("Facturas").OnceAsync<Dictionary<string, string>>();

string userId = ""; // Inicializa userId con un valor predeterminado

foreach (var tarjeta in tarjetas)

if (tarjeta.Object["N_Factrua"] == NumeroFactura)

userId = tarjeta.Key;

return userId;

return "No encontrado";

}
//Metodo para obtener datos de la base de datos

public async Task<string> ObtenerDatosID<T>(string idUsuario,String nombreDato,String


Nodo)

try

var snapshot = await client.Child(Nodo).Child(idUsuario).OnceSingleAsync<T>();

var propiedad = typeof(T).GetProperty(nombreDato);

if (snapshot != null)

var valorPropiedad = propiedad.GetValue(snapshot); // Obtener el valor de la


propiedad específica

if (valorPropiedad != null)

return valorPropiedad.ToString(); // Convertir el objeto al tipo string

else

return "";

else

return "";

catch (Exception ex)


{

// Manejar errores de conexión o datos no encontrados

Console.WriteLine($"Error: {ex.Message}");

return "Error al recuperar nombre de usuario";

//Actualizamos algun campo de la base de datos

public async Task ActualizarDatoUsuario(string idUsuario, string nombreDato, string


nuevoValor)

try

// Construir la ruta completa al nodo que contiene el dato que deseas actualizar

var rutaNodo = $"Usuarios/{idUsuario}/{nombreDato}";

// Actualizar el dato utilizando PutAsync

await client.Child(rutaNodo).PutAsync(nuevoValor);

Console.WriteLine($"Dato {nombreDato} actualizado correctamente para el usuario


con ID {idUsuario}");

catch (Exception ex)

// Manejar errores

Console.WriteLine($"Error al actualizar el dato: {ex.Message}");

}
public async Task ActualizarDatoTarjeta(string id, string nombreDato, string nuevoValor)

try

// Construir la ruta completa al nodo que contiene el dato que deseas actualizar

var rutaNodo = $"Tarjetas/{id}/{nombreDato}";

// Actualizar el dato utilizando PutAsync

await client.Child(rutaNodo).PutAsync(nuevoValor);

Console.WriteLine($"Dato {nombreDato} actualizado correctamente para el usuario


con ID {id}");

catch (Exception ex)

// Manejar errores

Console.WriteLine($"Error al actualizar el dato: {ex.Message}");

public async Task RegistrarTransacciones(String Monto,String Tipo,String Fecha,String


CuentaO,String CuentaD,String NombreENVIO,String NombreRecibe )

//Estamos diciendoa nuestra base de datos que añadiremos un usuario

//Nos pide el nelace de nuestra base de datos :D

FirebaseClient user = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");

var usuario = user.Child("Transferencia").OnceAsync<Transacciones>();

await user.Child("Transferencia").PostAsync(new Transacciones { Monto = Monto, Tipo


= Tipo, Fecha = Fecha, CuentaO= CuentaO, CuentaD= CuentaD, NombreENVIO= NombreENVIO,
NombreRecibe = NombreRecibe });
}

public async Task RegistrarTarjetas(String Numero, String Nombre,String Saldo)

//Estamos diciendoa nuestra base de datos que añadiremos un usuario

//Nos pide el nelace de nuestra base de datos :D

FirebaseClient user = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");

var usuario = user.Child("Tarjetas").OnceAsync<Tarjetas>();

await user.Child("Tarjetas").PostAsync(new Tarjetas


{ N_Tarjeta=Numero,Nombre=Nombre,Saldo=Saldo});

public async Task Registrar(String N_Factura, String Nombre,String FechaV,String


Consumo,String MontoMora,String montoConsumo,String Total,String Estado)

//Estamos diciendoa nuestra base de datos que añadiremos un usuario

//Nos pide el nelace de nuestra base de datos :D

FirebaseClient user = new FirebaseClient("https://proyectostarbank-default-


rtdb.firebaseio.com/");

var usuario = user.Child("Facturas").OnceAsync<Servicios>();

await user.Child("Facturas").PostAsync(new Servicios {N_Factrua=


N_Factura,Nombre=Nombre,Fecha= FechaV,Consumo= Consumo, Mora=
MontoMora,MontoConsumo= montoConsumo,TotalPagar= Total,Estado=Estado });

}
//Actualizamos algun campo de la base de datos

public async Task ActuEstado(string idUsuario, string nombreDato, string nuevoValor)

try

// Construir la ruta completa al nodo que contiene el dato que deseas actualizar

var rutaNodo = $"Facturas/{idUsuario}/{nombreDato}";

// Actualizar el dato utilizando PutAsync

await client.Child(rutaNodo).PutAsync(nuevoValor);

Console.WriteLine($"Dato {nombreDato} actualizado correctamente para el usuario


con ID {idUsuario}");

catch (Exception ex)

// Manejar errores

Console.WriteLine($"Error al actualizar el dato: {ex.Message}");

}
internal class FirebaseConfig

private string v;

public FirebaseConfig(string v)

this.v = v;

}
DIAGRAMA DE GANTT
CONCLUSION DEL PROYECTO

La implementación de una aplicación móvil para automatizar los servicios financieros


de un banco representa una respuesta innovadora y efectiva a las demandas cambiantes
de los clientes en el ámbito bancario. A lo largo de este informe, se ha examinado en
detalle la importancia y los beneficios de esta iniciativa, así como los desafíos y
consideraciones clave para su desarrollo y ejecución exitosos.

La digitalización de los servicios financieros a través de una aplicación móvil no solo


optimiza la eficiencia operativa del banco, sino que también mejora significativamente
la experiencia del cliente al proporcionar acceso conveniente, seguro y personalizado a
una amplia gama de servicios bancarios desde la palma de su mano. Desde consultas de
saldo hasta inversiones complejas, la aplicación móvil ofrece una plataforma integral
para satisfacer las necesidades financieras de los clientes en cualquier momento y lugar.

Además, la aplicación móvil no solo impulsa la competitividad del banco en el mercado


actual, sino que también fortalece la relación cliente-banco al proporcionar un canal de
comunicación directo y una atención personalizada. Mediante el análisis de datos y la
retroalimentación continua de los usuarios, el banco puede adaptar y mejorar
constantemente la aplicación para satisfacer las necesidades y expectativas cambiantes
de los clientes.

En resumen, la digitalización de los servicios financieros a través de una aplicación


móvil es un paso fundamental hacia la modernización y la innovación en el sector
bancario. Al proporcionar acceso conveniente, seguro y personalizado a una amplia
gama de servicios bancarios, la aplicación móvil no solo mejora la experiencia del
cliente, sino que también impulsa la competitividad y el crecimiento sostenible del
banco en el mercado actual y en el futuro.
BIBLIOGRAFÍA

(ForosDelWeb, 2024)

(StackExchangeInc, 2024)

(developers, 2024)

También podría gustarte