From bc07e3ebd914a9a1e30c64045c08f5b3c21b85d3 Mon Sep 17 00:00:00 2001 From: devRaGonSa Date: Fri, 2 May 2025 13:30:46 +0200 Subject: [PATCH] Graficos de ventas --- WebVentaCoche/Controllers/SalesController.cs | 93 +++++++- .../Views/Sales/HistoricalSales.cshtml | 204 ++++++++++++++++++ WebVentaCoche/Views/Sales/Index.cshtml | 176 --------------- .../Views/Sales/Last30DaysSales.cshtml | 201 +++++++++++++++++ WebVentaCoche/Views/Sales/MonthSales.cshtml | 170 +++++++++++++++ WebVentaCoche/Views/Shared/_Layout.cshtml | 4 +- 6 files changed, 668 insertions(+), 180 deletions(-) create mode 100644 WebVentaCoche/Views/Sales/HistoricalSales.cshtml delete mode 100644 WebVentaCoche/Views/Sales/Index.cshtml create mode 100644 WebVentaCoche/Views/Sales/Last30DaysSales.cshtml create mode 100644 WebVentaCoche/Views/Sales/MonthSales.cshtml diff --git a/WebVentaCoche/Controllers/SalesController.cs b/WebVentaCoche/Controllers/SalesController.cs index b8a7f6b..0bd6f81 100644 --- a/WebVentaCoche/Controllers/SalesController.cs +++ b/WebVentaCoche/Controllers/SalesController.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using System.Globalization; using WebVentaCoche.DataBase; using WebVentaCoche.Enums; using WebVentaCoche.ViewModels; @@ -16,13 +17,32 @@ namespace WebVentaCoche.Controllers _context = context; } - //GET:/Sales/ - public IActionResult Index() + //GET:/Sales/HistoricalSales + public IActionResult HistoricalSales() { return View(); } - //GET:/Sales/GetMonthlyData + //GET:/Sales/Last30DaysSales + public IActionResult Last30DaysSales() + { + return View(); + } + + //GET:/Sales/MonthSales + public async Task MonthSales() + { + var meses = await _context.OrderDetails.Where(d => d.Order.Status == OrderStatus.Delivered) + .Select(d => new { d.Order.OrderDate.Year, d.Order.OrderDate.Month }).Distinct().ToListAsync(); + + ViewBag.Months = meses + .Select(x => $"{x.Year}-{x.Month:D2}") + .OrderBy(s => s) + .ToList(); + + return View(); + } + [HttpGet] public async Task GetMonthlyData() { @@ -43,5 +63,72 @@ namespace WebVentaCoche.Controllers return Json(data); } + [HttpGet] + public async Task GetLast30DaysData() + { + var desde = DateTime.UtcNow.AddDays(-30); + + var raw = await _context.OrderDetails + .Where(d => d.Order.Status == OrderStatus.Delivered + && d.Order.OrderDate >= desde) + .GroupBy(d => new + { + d.Product.Name, + Date = d.Order.OrderDate.Date + }) + .Select(g => new + { + ProductName = g.Key.Name!, + Date = g.Key.Date, + Units = g.Sum(x => x.Quantity) + }) + .ToListAsync(); + + var data = raw + .Select(x => new + { + productName = x.ProductName, + date = x.Date.ToString("yyyy-MM-dd"), + units = x.Units + }); + + return Json(data); + } + + //GET:/Sales/GetMonthData?month=2025-04 + [HttpGet] + public async Task GetSalesByMonth(string month) + { + if (string.IsNullOrEmpty(month)) + return BadRequest(); + + var parts = month.Split('-'); + if (parts.Length != 2 || + !int.TryParse(parts[0], out var year) || + !int.TryParse(parts[1], out var mon)) + { + return BadRequest(); + } + + var data = await _context.OrderDetails + .Where(d => + d.Order.Status == OrderStatus.Delivered && + d.Order.OrderDate.Year == year && + d.Order.OrderDate.Month == mon + ) + .GroupBy(d => d.Product.Name) + .Select(g => new + { + productName = g.Key, + units = g.Sum(x => x.Quantity), + revenue = g.Sum(x => x.Quantity * x.UnitPrice) + }) + .ToListAsync(); + + return Json(data); + } + + + } } diff --git a/WebVentaCoche/Views/Sales/HistoricalSales.cshtml b/WebVentaCoche/Views/Sales/HistoricalSales.cshtml new file mode 100644 index 0000000..7595855 --- /dev/null +++ b/WebVentaCoche/Views/Sales/HistoricalSales.cshtml @@ -0,0 +1,204 @@ +@{ + ViewData["Title"] = "Ventas Mensuales"; + Layout = "_Layout"; +} + +
+
+

@ViewData["Title"]

+ +
+ +
+
+ + + + Mantén Ctrl para seleccionar varios productos. + +
+
+ +
+ +
+
+
+ +@section Scripts { + + +} \ No newline at end of file diff --git a/WebVentaCoche/Views/Sales/Index.cshtml b/WebVentaCoche/Views/Sales/Index.cshtml deleted file mode 100644 index ad4657e..0000000 --- a/WebVentaCoche/Views/Sales/Index.cshtml +++ /dev/null @@ -1,176 +0,0 @@ -@{ - ViewData["Title"] = "Ventas Mensuales"; - Layout = "_Layout"; -} - -
-

@ViewData["Title"]

- -
-
- - - - Mantén Ctrl para seleccionar varios productos. - -
-
- -
- -
-
- -@section Scripts { - - -} diff --git a/WebVentaCoche/Views/Sales/Last30DaysSales.cshtml b/WebVentaCoche/Views/Sales/Last30DaysSales.cshtml new file mode 100644 index 0000000..c8b5246 --- /dev/null +++ b/WebVentaCoche/Views/Sales/Last30DaysSales.cshtml @@ -0,0 +1,201 @@ +@{ + ViewData["Title"] = "Ventas Últimos 30 Días"; + Layout = "_Layout"; +} + +
+
+

@ViewData["Title"]

+ +
+ +
+
+ + + + Mantén Ctrl para seleccionar varios productos. + +
+
+ +
+ +
+
+
+ +@section Scripts { + + +} diff --git a/WebVentaCoche/Views/Sales/MonthSales.cshtml b/WebVentaCoche/Views/Sales/MonthSales.cshtml new file mode 100644 index 0000000..27012fd --- /dev/null +++ b/WebVentaCoche/Views/Sales/MonthSales.cshtml @@ -0,0 +1,170 @@ +@{ + ViewData["Title"] = "Ventas por Mes"; + Layout = "_Layout"; + + // Leemos con el mismo nombre que en el controlador: + var meses = ViewBag.Months as List ?? new List(); +} + +
+
+

@ViewData["Title"]

+ +
+
+ + +
+
+ + +
+ +
+
+
+ +@section Scripts { + + +} diff --git a/WebVentaCoche/Views/Shared/_Layout.cshtml b/WebVentaCoche/Views/Shared/_Layout.cshtml index aedd686..d46a256 100644 --- a/WebVentaCoche/Views/Shared/_Layout.cshtml +++ b/WebVentaCoche/Views/Shared/_Layout.cshtml @@ -50,7 +50,9 @@
  • Productos
  • Pedidos
  • Usuarios
  • -
  • Ventas
  • +
  • Historico de ventas
  • +
  • Ventas últimos 30 dias
  • +
  • Venta por meses
  • }