diff --git a/src/Library/Fachada.cs b/src/Library/Fachada.cs index 70daea9..cf8053c 100644 --- a/src/Library/Fachada.cs +++ b/src/Library/Fachada.cs @@ -14,6 +14,8 @@ public class Fachada private readonly GestorClientes gestorClientes; private readonly GestorInteracciones gestorInteracciones; private readonly RegistroVenta registroVenta; + private readonly GestorVentas gestorVentas; + private readonly List etiquetas = new List(); @@ -26,6 +28,7 @@ public Fachada() gestorClientes = new GestorClientes(); gestorInteracciones = GestorInteracciones.Instancia; registroVenta = new RegistroVenta(); + gestorVentas = new GestorVentas(); } // --------------------------------------------------------------------- @@ -172,5 +175,47 @@ public List ObtenerUsuarios() { return gestorUsuarios.ObtenerTodos(); } + + + // --------------------------------------------------------------------- + // NUEVO AGREGADO POR SEBASTIAN + // --------------------------------------------------------------------- + + public Fachada(GestorVentas gv, GestorUsuarios gu) + { + gestorVentas = gv; // inicializo variables q luego usare + gestorUsuarios = gu; + } + + + // Retorna null si no hay ventas. Siento que es la mejor de las opciones. + public BonoVendedor ObtenerVendedorConMayorCantidadDeVentasYBonificacion() + { + var (vendedorId, cantidad) = gestorVentas.ObtenerVendedorConMasVentas(); + if (vendedorId == 0 || cantidad == 0) return null; + + var vendedor = gestorUsuarios.ObtenerUsuarioPorId(vendedorId) as Vendedor; + if (vendedor == null) return null; + + decimal bono = cantidad * 100m; /// BONO DE 100 x venta como decia la letra de la defensa. + return new BonoVendedor + { + VendedorId = vendedor.Id, + VendedorNombre = vendedor.Nombre, + CantidadVentas = cantidad, + Bono = bono + }; + } + } + + public class BonoVendedor + { + public int VendedorId { get; set; } //id vendedor + public string VendedorNombre { get; set; } // nombre vendedor + public int CantidadVentas { get; set; } //cantidad de ventas + public decimal Bono { get; set; } // bono } } + + + diff --git a/src/Library/GestorUsuario.cs b/src/Library/GestorUsuario.cs index 3d2bc40..4757ed4 100644 --- a/src/Library/GestorUsuario.cs +++ b/src/Library/GestorUsuario.cs @@ -29,7 +29,7 @@ public static GestorUsuarios Instancia /// /// Constructor privado para cumplir con el patrón Singleton. /// - private GestorUsuarios() { } + public GestorUsuarios() { } private readonly List usuarios = new List(); @@ -139,5 +139,15 @@ public List ObtenerTodos() { return new List(usuarios); } + + public Vendedor ObtenerUsuarioPorId(int vendedorId) + { + throw new NotImplementedException(); //El programa me recomienda usar throw new throw new NotImplementedException() para solucionar problemas. + } + + public void AgregarUsuario(Vendedor p0) + { + throw new NotImplementedException();// para que no se cometan errores en los test... + } } } diff --git a/src/Library/GestorVentas.cs b/src/Library/GestorVentas.cs new file mode 100644 index 0000000..c41fc99 --- /dev/null +++ b/src/Library/GestorVentas.cs @@ -0,0 +1,48 @@ +//Agrege un Gestor de Ventas. La verdad que me facilito la vida para estar mas organizado al tener un +//propio gestor, ademas que no fue tan dificil de implementar. Es mi centro logico para contar las ventas ya que es responsabilidad de "Ventas". + +// El metodo ObtenerVendedorConMasVentas devuelve un tuple (Vendedor, int cantidad) para ser los testing + +using System; +using System.Collections.Generic; +using System.Linq; +using Library; + +namespace ProyectoCRM +{ + public class GestorVentas + { + //coleccion/lista de ventas. + private readonly List ventas; + + public GestorVentas(List ventas = null) + { + this.ventas = ventas ?? new List(); + } + + public void AgregarVenta(Venta v) => ventas.Add(v); + + public IReadOnlyList ObtenerTodasLasVentas() => ventas.AsReadOnly(); + + // Retorna diccionario vendedorId----cantidadVentas + public Dictionary ObtenerCantidadVentasPorVendedor() + { + // Si Venta almacena VendedorId: + return ventas + .GroupBy(v => v.Vendedorid) + .ToDictionary(g => g.Key, g => g.Count()); + } + + // Retorna id del vendedor con mas ventas y la cantidad. Si no hay ventas, retorna (0,0) o null. + public (int VendedorId, int Cantidad) ObtenerVendedorConMasVentas() + { + var dict = ObtenerCantidadVentasPorVendedor(); + if (dict.Count == 0) return (0, 0); + + // En caso donde se de un empate, se devuelve el primero por orden de aparición. Osea el primero... + + var max = dict.OrderByDescending(kv => kv.Value).First(); + return ((int VendedorId, int Cantidad))(max.Key, max.Value);//Devuelve el primero + } + } +} \ No newline at end of file diff --git a/src/Library/Library.csproj b/src/Library/Library.csproj index 5730b86..7a5c435 100755 --- a/src/Library/Library.csproj +++ b/src/Library/Library.csproj @@ -4,7 +4,7 @@ net8.0 PII_DiscordBot_Demo Ucu.Poo.DiscordBot - 6 + latest diff --git a/src/Library/UsuarioBase.cs b/src/Library/UsuarioBase.cs index cdf81af..885aa24 100644 --- a/src/Library/UsuarioBase.cs +++ b/src/Library/UsuarioBase.cs @@ -35,5 +35,16 @@ protected UsuarioBase(bool activo, DateTime fechaCreacion) FechaCreacion = fechaCreacion; Id = 0; } + + protected UsuarioBase(bool activo) + { + throw new NotImplementedException(); // Estas son recomendaciones del programa para solucionar errores... + + } + + protected UsuarioBase() + { + throw new NotImplementedException(); // Estas son recomendaciones del programa para solucionar errores... + } } } \ No newline at end of file diff --git a/src/Library/Vendedor.cs b/src/Library/Vendedor.cs index ec92f02..e2c53bf 100644 --- a/src/Library/Vendedor.cs +++ b/src/Library/Vendedor.cs @@ -15,13 +15,25 @@ public class Vendedor : UsuarioBase private readonly List clientesAsignados = new List(); /// - /// Constructor del vendedor. + /// Constructor del vendedor /// /// Estado inicial del vendedor. /// Fecha de creación. public Vendedor(bool activo, DateTime fechaCreacion) : base(activo, fechaCreacion) { } + public Vendedor(bool BASE) : base(BASE) + { + throw new NotImplementedException(); //solicita el sistema para solucionar errores... + } + + public Vendedor() : base() + { + throw new NotImplementedException(); //solicita el sistema para solucionar errores... + } + + public string Nombre { get; set; } + /// /// Obtiene la lista de clientes asignados al vendedor. /// Devuelve una copia de la lista para preservar encapsulación. diff --git a/src/Library/Venta.cs b/src/Library/Venta.cs index 402c57f..8545e3c 100644 --- a/src/Library/Venta.cs +++ b/src/Library/Venta.cs @@ -18,6 +18,9 @@ public class Venta : Interaccion /// public Cotizacion CotizacionOrigen { get; private set; } + public object Vendedorid { get; set; } + public int VendedorId { get; set; } + /// /// Constructor principal de una Venta. /// @@ -38,6 +41,11 @@ public Venta( cotizacionOrigen?.RegistrarVentaAsociada(this); } + public Venta() + { + throw new NotImplementedException(); //lo solicita el programa para que no ocurran errores... + } + /// /// Asocia una cotización a esta venta (si se creó sin una). /// diff --git a/src/Program/Program.cs b/src/Program/Program.cs index 442b442..b262be5 100755 --- a/src/Program/Program.cs +++ b/src/Program/Program.cs @@ -12,7 +12,7 @@ internal static class Program /// /// Punto de entrada al programa. /// - private static void Main(string [] args) + private static void Main(string[] args) { if (args.Length != 0) { @@ -24,7 +24,7 @@ private static void Main(string [] args) } } - private static void DemoFacade(string [] args) + private static void DemoFacade(string[] args) { if (args.Length > 0) { @@ -38,3 +38,15 @@ private static void DemoBot() } } } + + + + + + + + + + + + diff --git a/test/LibraryTests/Fachada_allTest.cs b/test/LibraryTests/Fachada_allTest.cs index 4bb25e4..87e74b2 100644 --- a/test/LibraryTests/Fachada_allTest.cs +++ b/test/LibraryTests/Fachada_allTest.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using System; +using System.Collections.Generic; using System.Linq; using Library; using ProyectoCRM; @@ -186,5 +187,88 @@ public void CrearVendedor_OK() int id = fachada.CrearVendedor(true, DateTime.Now); Assert.IsTrue(fachada.ObtenerUsuarios().Any(u => u.Id == id)); } + + + //-------------------------------------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------------------------------------- + + + // ============================================================ + // TEST DE SEBASTIAN + // ============================================================ + + [Test] //Test para: " comando que permita obtener la cantidad de las ventas de cada vendedor" + public void ObtenerCantidadVentasPorVendedor_CuentaCorrectamente() + { + var v1 = new Venta { VendedorId = 1 }; //inicilizo objetos para realizar el testing + var v2 = new Venta { VendedorId = 1 }; + var v3 = new Venta { VendedorId = 2 }; + + var gestor = new GestorVentas(new List{ v1, v2, v3 }); + var dict = gestor.ObtenerCantidadVentasPorVendedor(); + + Assert.AreEqual(2, dict[1]); + Assert.AreEqual(1, dict[2]); + } + + [Test] //Test para: "El vendedor con mayor cantidad" + public void ObtenerVendedorConMasVentas_RetornaCorrecto() + { + var gestor = new GestorVentas(new List{ + new Venta{VendedorId = 10}, + new Venta{VendedorId = 20}, + new Venta{VendedorId = 10} + }); + + var (id, cantidad) = gestor.ObtenerVendedorConMasVentas(); + Assert.AreEqual(10, id); + Assert.AreEqual(2, cantidad); + } + + [Test] //Test cuando tiene que retornar 0. + public void ObtenerVendedorConMasVentas_SinVentas_RetornaCero() + { + var gestor = new GestorVentas(); + var (id, cantidad) = gestor.ObtenerVendedorConMasVentas(); + Assert.AreEqual(0, id); + Assert.AreEqual(0, cantidad); + } + + + + //Aca el test de este metodo que calcula el bono de 100 x venta. + [Test] + public void ObtenerVendedorConMayorCantidadDeVentasYBonificacion_CalculaBonoCorrectamente() + { + // Crear vendedores en el GestorUsuarios + var gestorUsuarios = new GestorUsuarios(); + gestorUsuarios.AgregarUsuario(new Vendedor { Id = 1, Nombre = "Marcelo" });//inicializo objetos para el testing + gestorUsuarios.AgregarUsuario(new Vendedor { Id = 2, Nombre = "Gonzalo" }); + + var ventas = new List{ // lista + new Venta{ VendedorId = 1 }, + new Venta{ VendedorId = 1 }, + new Venta{ VendedorId = 2 } + }; + var gestorVentas = new GestorVentas(ventas); + + var fachada = new Fachada(gestorVentas, gestorUsuarios); + + var bono = fachada.ObtenerVendedorConMayorCantidadDeVentasYBonificacion(); + + + Assert.IsNotNull(bono); + Assert.AreEqual(1, bono.VendedorId); + Assert.AreEqual("Marcelo", bono.VendedorNombre); + Assert.AreEqual(2, bono.CantidadVentas); + Assert.AreEqual(200m, bono.Bono); // 2 * 100!!! + } + } + + + + + } diff --git a/test/LibraryTests/LibraryTests.csproj b/test/LibraryTests/LibraryTests.csproj index 6285b3c..2c3e2c1 100755 --- a/test/LibraryTests/LibraryTests.csproj +++ b/test/LibraryTests/LibraryTests.csproj @@ -2,7 +2,7 @@ net8.0 - 6 + latest false true Ucu.Poo.DiscordBot.Domain.Tests