From 57c16542c672269cbee20e5ee7b7d87211a46ea3 Mon Sep 17 00:00:00 2001 From: fedpo Date: Tue, 3 Dec 2024 12:25:53 +0000 Subject: [PATCH] Funcionalidad de mardar mails hecha --- Controladora/ControladoraInformes.cs | 8 + Informes/InformeEmail.cs | 172 +++++++++++------- .../FrmInformeFacturaPorFecha.Designer.cs | 3 +- Vista/Informes/FrmInformeFacturaPorFecha.cs | 17 ++ .../FrmInformeFacturasPorCliente.Designer.cs | 1 + .../Informes/FrmInformeFacturasPorCliente.cs | 20 +- 6 files changed, 158 insertions(+), 63 deletions(-) diff --git a/Controladora/ControladoraInformes.cs b/Controladora/ControladoraInformes.cs index 9c80051..c4ce003 100644 --- a/Controladora/ControladoraInformes.cs +++ b/Controladora/ControladoraInformes.cs @@ -59,6 +59,14 @@ namespace Controladora // Utiliza la instancia singleton de InformeEmail para enviar el correo return InformeEmail.Instance.EnviarEmailFactura(titulo, detalles); } + public string EnviarEmail(string titulo, List facturas) + { + if (facturas == null || facturas.Count == 0) + return "La lista de facturas está vacía o es nula."; + + + return InformeEmail.Instance.EnviarEmailFacturas(titulo, facturas); + } public bool Informa { get diff --git a/Informes/InformeEmail.cs b/Informes/InformeEmail.cs index f0507d4..73a2323 100644 --- a/Informes/InformeEmail.cs +++ b/Informes/InformeEmail.cs @@ -20,12 +20,119 @@ namespace Informes get { return instance; } } - private InformeEmail() + public string EnviarEmailFactura(string titulo, List desc) { + string body = GenerarTablaDetalle(desc); + return SendMail(titulo, body); } + public string EnviarEmailFacturas(string titulo, List facturas) + { + string body = GenerarTablaFacturas(facturas); + return SendMail(titulo, body); + } - public string EnviarEmailFactura(string titulo, List desc) + private string GenerarTablaFacturas(List facturas) + { + string body = @" + + "; + foreach (var item in facturas) + { + body += $""" +
+

Factura del {item.Fecha}, cliente: {item.NombreCliente}

+ + + + """; + foreach (var i in item.Detalles) + { + body += $""" + + + + + + + """; + } + body += $""" + + + + + + +
Producto + Cantidad + Precio CU + Subtotal +
{i.Producto.Nombre}{i.Cantidad}{i.Producto.Precio}{i.Producto.Precio * i.Cantidad}
Total{CalcularTotal(item.Detalles)}
+ """; + } + return body; + } + + private string GenerarTablaDetalle(List desc) + { + // Esta seccion es el armado del mail html + string body = + @" + + + + "; + + foreach (var i in desc) + { + body += + @$" + + + + + + "; + } + + body += + @$" + + + + + + +
Producto + Cantidad + Precio CU + Subtotal +
{i.Producto.Nombre}{i.Cantidad}{i.Producto.Precio}{i.Producto.Precio * i.Cantidad}
Total{CalcularTotal(desc)}
"; + + return body; + } + private double CalcularTotal(List desc) + { + double total = 0; + foreach (var i in desc) + { + total += i.Producto.Precio * i.Cantidad; + } + return total; + } + + + + private string SendMail(string titulo, string body) { string? ret = null; string json; @@ -58,16 +165,13 @@ namespace Informes MailMessage mail = new MailMessage(); mail.Subject = titulo; mail.IsBodyHtml = true; - mail.Body = GenerarTabla(desc); + mail.Body = body; mail.Sender = new MailAddress(config.EmailAddr); foreach (var i in config.EmailTarget) mail.To.Add(i); mail.From = new MailAddress(config.EmailAddr); try { - #if DEBUG - Console.WriteLine($"From: {config.EmailAddr}, Title: {titulo}"); - #endif smtp.Send(mail); mail.Dispose(); } @@ -76,65 +180,11 @@ namespace Informes ret = "No se pudo comunicar con el server SMTP"; throw; } - //Decimos que se envio el email correctamente si el valor del retorno sigue siendo nulo en otro caso tendra la descripcion del error. return (ret == null) ? - "Se envio el Email Correctamente": + "Se envio el Email Correctamente" : ret; // } - - private string GenerarTabla(List desc) - { - // Esta seccion es el armado del mail html - string body = - @" - - - - "; - - foreach (var i in desc) - { - body += - @$" - - - - - - "; - } - - body += - @$" - - - - - - -
Producto - Cantidad - Precio CU - Subtotal -
{i.Producto.Nombre}{i.Cantidad}{i.Producto.Precio}{i.Producto.Precio * i.Cantidad}
Total{CalcularTotal(desc)}
- "; - return body; - } - private double CalcularTotal(List desc) - { - double total = 0; - foreach (var i in desc) - { - total += i.Producto.Precio * i.Cantidad; - } - return total; - } - } } diff --git a/Vista/Informes/FrmInformeFacturaPorFecha.Designer.cs b/Vista/Informes/FrmInformeFacturaPorFecha.Designer.cs index 087a597..45347c5 100644 --- a/Vista/Informes/FrmInformeFacturaPorFecha.Designer.cs +++ b/Vista/Informes/FrmInformeFacturaPorFecha.Designer.cs @@ -136,12 +136,13 @@ // // btnEnviarEmail // - btnEnviarEmail.Location = new Point(26, 364); + btnEnviarEmail.Location = new Point(26, 143); btnEnviarEmail.Name = "btnEnviarEmail"; btnEnviarEmail.Size = new Size(200, 26); btnEnviarEmail.TabIndex = 9; btnEnviarEmail.Text = "Enviar Informe Por Email"; btnEnviarEmail.UseVisualStyleBackColor = true; + btnEnviarEmail.Click += btnEnviarEmail_Click; // // FrmInformeFacturaPorFecha // diff --git a/Vista/Informes/FrmInformeFacturaPorFecha.cs b/Vista/Informes/FrmInformeFacturaPorFecha.cs index edec856..4484719 100644 --- a/Vista/Informes/FrmInformeFacturaPorFecha.cs +++ b/Vista/Informes/FrmInformeFacturaPorFecha.cs @@ -16,9 +16,11 @@ namespace Vista.Informes public partial class FrmInformeFacturaPorFecha : Form { private ReadOnlyCollection? facturas; + private DateTime fecini, fecfin; public FrmInformeFacturaPorFecha() { InitializeComponent(); + if (ControladoraInformes.Instance.RecuperarConfig().Informar == false) btnEnviarEmail.Enabled = false; } private void btnBuscar_Click(object sender, EventArgs e) @@ -28,6 +30,10 @@ namespace Vista.Informes MessageBox.Show("La fecha de inicio no puede ser mayor que la fecha final.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + + //es por si mandas un email mantener el state de las fechas + fecini = dateInicio.Value; + fecfin = dateFin.Value; facturas = ControladoraInformes.Instance.MostrarFacturasEnRangoDeFechas(dateInicio.Value, dateFin.Value); @@ -79,5 +85,16 @@ namespace Vista.Informes column.Visible = column.Name == "Subtotal" || column.Name == "NombreProducto" || column.Name == "Cantidad"; } } + + private void btnEnviarEmail_Click(object sender, EventArgs e) + { + if (facturas == null || facturas.Count <= 0) + { + MessageBox.Show("No hay facturas para mandar email"); + return; + } + string msg = ControladoraInformes.Instance.EnviarEmail($"Facturas del {fecini.ToString()} hasta {fecfin.ToString()}", facturas.ToList()); + MessageBox.Show(msg); + } } } \ No newline at end of file diff --git a/Vista/Informes/FrmInformeFacturasPorCliente.Designer.cs b/Vista/Informes/FrmInformeFacturasPorCliente.Designer.cs index b9a4344..4b950ff 100644 --- a/Vista/Informes/FrmInformeFacturasPorCliente.Designer.cs +++ b/Vista/Informes/FrmInformeFacturasPorCliente.Designer.cs @@ -53,6 +53,7 @@ btnEnviarEmail.TabIndex = 19; btnEnviarEmail.Text = "Enviar Informe Por Email"; btnEnviarEmail.UseVisualStyleBackColor = true; + btnEnviarEmail.Click += btnEnviarEmail_Click; // // label4 // diff --git a/Vista/Informes/FrmInformeFacturasPorCliente.cs b/Vista/Informes/FrmInformeFacturasPorCliente.cs index cf136db..3ed0583 100644 --- a/Vista/Informes/FrmInformeFacturasPorCliente.cs +++ b/Vista/Informes/FrmInformeFacturasPorCliente.cs @@ -17,10 +17,13 @@ namespace Vista.Informes public partial class FrmInformeFacturasPorCliente : Form { private ReadOnlyCollection facturas; + private DateTime fecini, fecfin; public FrmInformeFacturasPorCliente() { InitializeComponent(); IniciarTablaClientes(); + if (ControladoraInformes.Instance.RecuperarConfig().Informar == false) btnEnviarEmail.Enabled = false; + } private void IniciarTablaClientes() @@ -37,6 +40,10 @@ namespace Vista.Informes if (Check()) { Cliente cli = (Cliente)dgvCliente.SelectedRows[0].DataBoundItem; + + //es por si mandas un email mantener el state de las fechas + fecini = dateInicio.Value; + fecfin = dateFin.Value; var lista = ControladoraInformes.Instance.MostrarFacturasDeClienteEnRangoDeFechas(cli, dateInicio.Value, dateFin.Value); if (lista == null) @@ -97,12 +104,23 @@ namespace Vista.Informes } private void RefrescarTablaDetalles(List list) { - dgvDetalle.DataSource = null; + dgvDetalle.DataSource = null; dgvDetalle.DataSource = list; foreach (DataGridViewColumn column in dgvDetalle.Columns) { column.Visible = column.Name == "Subtotal" || column.Name == "NombreProducto" || column.Name == "Cantidad"; } } + + private void btnEnviarEmail_Click(object sender, EventArgs e) + { + if (facturas == null || facturas.Count <= 0) + { + MessageBox.Show("No hay facturas para mandar email"); + return; + } + string msg = ControladoraInformes.Instance.EnviarEmail($"Facturas cliente: {facturas[0].NombreCliente} del {fecini.ToString()} hasta {fecfin.ToString()}", facturas.ToList()); + MessageBox.Show(msg); + } } }