using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Threading.Tasks; using EveryThing.Data; using EveryThing.Models; using EveryThing.Models.Project; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace EveryThing.Pages { [Authorize] public class IndexModel : PageModel { private readonly ILogger _logger; private readonly ApplicationDbContext _context; private readonly UserManager _userManager; private readonly SignInManager _loginManager; private readonly RoleManager _roleManager; public IndexModel(ApplicationDbContext context, UserManager userManager, SignInManager loginManager, RoleManager roleManager) { _context = context; _userManager = userManager; _loginManager = loginManager; _roleManager = roleManager; } public string Year { get; set; } public IActionResult OnGet(string year) { //_logger.LogInformation("Index"); Year = year; Year ??= DateTime.Now.Year.ToString(); ViewData["Years"] = new SelectList(Enumerable.Range(2022, (DateTime.Now.Year - 2022) + 2)); return Page(); } public IActionResult OnGetData(int year) { var user = _userManager.GetUserAsync(User).Result; var dateMonthFrom = new DateTime(DateTime.Now.AddDays(-31).Year, DateTime.Now.AddDays(-31).Month, DateTime.Now.AddDays(-31).Day, 0, 0, 0); var dateMonthTo = new DateTime(DateTime.Now.AddDays(-1).Year, DateTime.Now.AddDays(-1).Month, DateTime.Now.AddDays(-1).Day, 23, 59, 59); var xAxisMonth = Enumerable.Range(0, 1 + dateMonthTo.Subtract(dateMonthFrom).Days) .Select(offset => dateMonthFrom.AddDays(offset)) .OrderBy(x => x) .Select(x => x.ToString("dd.MM.yy")) .Distinct() .ToList(); var projectPartItemsMonth = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .Where(x => x.ProjectPart.Project.IdCompanyFk == user.IdCompanyFk && x.ShippingDate >= dateMonthFrom && x.ShippingDate <= dateMonthTo) .ToList(); //Neka fora z chart JS da ne pozicionira prav ce ni nastavjleno y=0 za prazne //var month = new //{ // xAxis = xAxisMonth, // diferenceInPrice = projectPartItemsMonth // .GroupBy(x => new DateTime(((DateTime)x.ShippingDate).Year, ((DateTime)x.ShippingDate).Month, ((DateTime)x.ShippingDate).Day)) // .Select(x => new { x = x.Key.ToString("dd.MM.yy"), y = x.Sum(y => y.DifferenceInPriceValue) }), // sales = projectPartItemsMonth // .GroupBy(x => new DateTime(((DateTime)x.ShippingDate).Year, ((DateTime)x.ShippingDate).Month, ((DateTime)x.ShippingDate).Day)) // .Select(x => new { x = x.Key.ToString("dd.MM.yy"), y = x.Sum(y => y.SellingValue) }), // expenses = projectPartItemsMonth // .GroupBy(x => new DateTime(((DateTime)x.ShippingDate).Year, ((DateTime)x.ShippingDate).Month, ((DateTime)x.ShippingDate).Day)) // .Select(x => new { x = x.Key.ToString("dd.MM.yy"), y = x.Sum(y => y.MaterialValue + y.WorkValue) }) //}; var dicDiferenceInPriceMonth = new Dictionary(); var dicSalesMonth = new Dictionary(); var dicExpensesMonth = new Dictionary(); xAxisMonth.ForEach(x => { dicDiferenceInPriceMonth[x] = 0; dicSalesMonth[x] = 0; dicExpensesMonth[x] = 0; }); foreach (var day in projectPartItemsMonth .GroupBy(x => new DateTime(((DateTime)x.ShippingDate).Year, ((DateTime)x.ShippingDate).Month, ((DateTime)x.ShippingDate).Day)) .OrderBy(x => x.Key)) { var x = day.Key.ToString("dd.MM.yy"); dicDiferenceInPriceMonth[x] = day.Sum(x => x.DifferenceInPriceValue); dicSalesMonth[x] = day.Sum(x => x.SellingValue); dicExpensesMonth[x] = day.Sum(x => x.WorkValue + x.MaterialValue); } var month = new { xAxis = xAxisMonth, diferenceInPrice = dicDiferenceInPriceMonth.Select(x => new {x = x.Key, y = Math.Round(x.Value, 2) }), sales = dicSalesMonth.Select(x => new {x = x.Key, y = Math.Round(x.Value, 2) }), expenses = dicExpensesMonth.Select(x => new {x = x.Key, y = Math.Round(x.Value, 2) }), }; //Leto var dateYearTo = new DateTime(year, 12, 31, 23, 59, 59); var dateYearFrom = new DateTime(year, 1, 1, 1, 0, 0, 0); var xAxisYear = Enumerable.Range(0, 1 + dateYearTo.Subtract(dateYearFrom).Days) .Select(offset => dateYearFrom.AddDays(offset)) .OrderBy(x => x) .Select(x => x.ToString("MM.yy")) .Distinct() .ToList(); var projectPartItemsYear = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .Where(x => x.ProjectPart.Project.IdCompanyFk == user.IdCompanyFk && x.ShippingDate >= dateYearFrom && x.ShippingDate <= dateYearTo) .ToList(); //Neka fora z chart JS da ne pozicionira prav ce ni nastavjleno y=0 za prazne //var month = new //{ // xAxis = xAxisMonth, // diferenceInPrice = projectPartItemsMonth // .GroupBy(x => new DateTime(((DateTime)x.ShippingDate).Year, ((DateTime)x.ShippingDate).Month, ((DateTime)x.ShippingDate).Day)) // .Select(x => new { x = x.Key.ToString("dd.MM.yy"), y = x.Sum(y => y.DifferenceInPriceValue) }), // sales = projectPartItemsMonth // .GroupBy(x => new DateTime(((DateTime)x.ShippingDate).Year, ((DateTime)x.ShippingDate).Month, ((DateTime)x.ShippingDate).Day)) // .Select(x => new { x = x.Key.ToString("dd.MM.yy"), y = x.Sum(y => y.SellingValue) }), // expenses = projectPartItemsMonth // .GroupBy(x => new DateTime(((DateTime)x.ShippingDate).Year, ((DateTime)x.ShippingDate).Month, ((DateTime)x.ShippingDate).Day)) // .Select(x => new { x = x.Key.ToString("dd.MM.yy"), y = x.Sum(y => y.MaterialValue + y.WorkValue) }) //}; var dicDiferenceInPriceYear = new Dictionary(); var dicSalesYear = new Dictionary(); var dicExpensesYear = new Dictionary(); xAxisYear.ForEach(x => { dicDiferenceInPriceYear[x] = 0; dicSalesYear[x] = 0; dicExpensesYear[x] = 0; }); foreach (var day in projectPartItemsYear .GroupBy(x => new DateTime(((DateTime)x.ShippingDate).Year, ((DateTime)x.ShippingDate).Month, ((DateTime)x.ShippingDate).Day)) .OrderBy(x => x.Key)) { var x = day.Key.ToString("MM.yy"); dicDiferenceInPriceYear[x] = day.Sum(x => x.DifferenceInPriceValue); dicSalesYear[x] = day.Sum(x => x.SellingValue); dicExpensesYear[x] = day.Sum(x => x.WorkValue + x.MaterialValue); } var yearData = new { xAxis = xAxisYear, diferenceInPrice = dicDiferenceInPriceYear.Select(x => new { x = x.Key, y = Math.Round(x.Value, 2) }), sales = dicSalesYear.Select(x => new { x = x.Key, y = Math.Round(x.Value, 2) }), expenses = dicExpensesYear.Select(x => new { x = x.Key, y = Math.Round(x.Value, 2) }), }; //Zgornji napisi - labels var dateLabelsFrom = new DateTime(DateTime.Now.AddDays(-31).Year, DateTime.Now.AddDays(-31).Month, DateTime.Now.AddDays(-31).Day, 0, 0, 0); var dateLabelsTo = new DateTime(DateTime.Now.AddDays(-1).Year, DateTime.Now.AddDays(-1).Month, DateTime.Now.AddDays(-1).Day, 23, 59, 59); var projectPartItemsLabels = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .Where(x => x.ProjectPart.Project.IdCompanyFk == user.IdCompanyFk && x.ShippingDate >= dateLabelsFrom && x.ShippingDate <= dateLabelsTo) .ToList(); var labels = new { diferenceInPrice = Math.Round(projectPartItemsLabels.Sum(x => x.DifferenceInPriceValue),2).ToString("#,###,##0.00", new CultureInfo("sl-SI")), sales = Math.Round(projectPartItemsLabels.Sum(x => x.SellingValue), 2).ToString("#,###,##0.00", new CultureInfo("sl-SI")), expenses = Math.Round(projectPartItemsLabels.Sum(x => x.WorkValue + x.MaterialValue), 2).ToString("#,###,##0.00", new CultureInfo("sl-SI")), activeProjects = _context.Projects.Count(x => x.IdCompanyFk == user.IdCompanyFk && x.Status != ProjectStatus.Finished) }; //Graf po partnerjih preteklo leto var datePartnersYearTo = new DateTime(year, 12, 31, 23, 59, 59); var datePartnersYearFrom = new DateTime(year, 1, 1, 1, 0, 0, 0); var projectPartItemsPartnersYear = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .ThenInclude(x => x.Partner) .Where(x => x.ProjectPart.Project.IdCompanyFk == user.IdCompanyFk && x.ShippingDate >= datePartnersYearFrom && x.ShippingDate <= datePartnersYearTo) .ToList(); var diferenceInPricePartnersYear = new List(); var salesPartnersYear = new List(); var expensesPartnersYear = new List(); var xAxisPartnersYear = new List(); foreach (var partner in projectPartItemsPartnersYear .GroupBy(x => x.ProjectPart.Project.Partner.Title) .OrderBy(x => x.Key)) { var x = partner.Key; if (x.Length > 20) x = x.Substring(0, 20); xAxisPartnersYear.Add(x); diferenceInPricePartnersYear.Add(new {x = x, y = Math.Round(partner.Sum(x => x.DifferenceInPriceValue))}); salesPartnersYear.Add(new {x = x, y = Math.Round(partner.Sum(x => x.SellingValue))}); expensesPartnersYear.Add(new {x = x, y = Math.Round(partner.Sum(x => x.WorkValue+ x.MaterialValue))}); } var partnersYear = new { xAxis = xAxisPartnersYear, diferenceInPrice = diferenceInPricePartnersYear, sales = salesPartnersYear, expenses = expensesPartnersYear, }; //Graf po projetkih preteklo leto var dateProjectsYearTo = new DateTime(year, 12, 31, 23, 59, 59); var dateProjectsYearFrom = new DateTime(year, 1, 1, 1, 0, 0, 0); var projectPartItemsProjectsYear = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .Where(x => x.ProjectPart.Project.IdCompanyFk == user.IdCompanyFk && x.ShippingDate >= dateProjectsYearFrom && x.ShippingDate <= dateProjectsYearTo) .ToList(); var diferenceInPriceProjectsYear = new List(); var salesProjectsYear = new List(); var expensesProjectsYear = new List(); var xAxisProjectsYear = new List(); foreach (var partner in projectPartItemsProjectsYear .GroupBy(x => x.ProjectPart.Project.Title) .OrderBy(x => x.Key)) { var x = partner.Key; if (x.Length > 20) x = x.Substring(0, 20); xAxisProjectsYear.Add(x); diferenceInPriceProjectsYear.Add(new { x = x, y = Math.Round(partner.Sum(x => x.DifferenceInPriceValue)) }); salesProjectsYear.Add(new { x = x, y = Math.Round(partner.Sum(x => x.SellingValue)) }); expensesProjectsYear.Add(new { x = x, y = Math.Round(partner.Sum(x => x.WorkValue + x.MaterialValue)) }); } var projectsYear = new { xAxis = xAxisProjectsYear, diferenceInPrice = diferenceInPriceProjectsYear, sales = salesProjectsYear, expenses = expensesProjectsYear, }; var data = new { month, year = yearData, labels, partnersYear, projectsYear }; return new JsonResult(new { data, error = "", successful = true }); } } }