using administration.Models.Finances;
using administration.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace administration.Controllers.Finances
{
///
/// Contrôleur API pour la gestion des dépenses de l'utilisateur.
/// Fournit des points de terminaison pour récupérer les dépenses du mois en cours
/// pour l'utilisateur actuellement connecté.
///
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class ExpenseController : Controller
{
private readonly FinancesContext _context;
private readonly IUserSessionService _userSession;
///
/// Initialise une nouvelle instance du contrôleur .
///
/// Contexte de base de données des finances.
/// Service de session utilisateur pour obtenir l'utilisateur courant.
public ExpenseController(FinancesContext context, IUserSessionService userSession)
{
_context = context;
_userSession = userSession;
}
///
/// Récupère la dernière dépense du mois en cours pour l'utilisateur connecté.
///
///
/// Un objet contenant la dépense trouvée ou un code d'erreur approprié.
///
[HttpGet("last_expenses")]
public IActionResult GetRightExpenses()
{
try
{
if (_userSession.UserId == null)
return Unauthorized("Utilisateur non connecté.");
var expense = _context.Expenses
.Where(e => e.UserId == _userSession.UserId &&
e.Date.Month == DateTime.Now.Month)
.OrderByDescending(e => e.Date)
.FirstOrDefault();
if (expense == null)
return NotFound("Aucune dépense trouvée pour ce mois.");
var additionalSources = (
from additional in _context.AdditionalSources
join logo in _context.Logos on additional.LogoId equals logo.Id
where additional.UserId == _userSession.UserId &&
additional.Date.Month == DateTime.Now.Month &&
(additional.TransactionType == "expense" || additional.TransactionType == "sub")
select new
{
additional.Id,
additional.TransactionType,
additional.Amount,
additional.Description,
additional.Date,
Logo = new
{
logo.Id,
logo.Name,
logo.Image
}
}
).ToList();
var totalExpenses = expense.Rent
+ expense.Electricity
+ expense.Trash
+ expense.Wifi
+ expense.Groceries
+ expense.Insurance
+ expense.Saving;
var totalAdditionalExpense = additionalSources
.Where(a => a.TransactionType == "expense")
.Sum(a => a.Amount);
var totalAdditionalSub = additionalSources
.Where(a => a.TransactionType == "sub")
.Sum(a => a.Amount);
var result = new
{
expense.Id,
expense.Rent,
expense.Electricity,
expense.Trash,
expense.Wifi,
expense.Groceries,
expense.Insurance,
expense.Date,
expense.Saving,
AdditionalSourcesExpense = additionalSources.Where(a => a.TransactionType == "expense").ToList(),
AdditionalSourcesSub = additionalSources.Where(a => a.TransactionType == "sub").ToList(),
Total = totalExpenses + totalAdditionalExpense + totalAdditionalSub
};
return Ok(result);
}
catch (Exception ex)
{
return StatusCode(500, $"Erreur serveur : {ex.Message}, Méthode GetAdditionalRevenues");
}
}
///
/// Récupère les dépenses depuis la base de données avec l'id X.
///
/// L'id de la dépense
/// La bonne dépense
[HttpGet("expense_by_id")]
public IActionResult GetExpenseByID(int id)
{
try
{
Expense expense = _context.Expenses
.Where(r => r.Id == id)
.FirstOrDefault();
return Ok(expense);
}
catch (Exception ex)
{
return StatusCode(500, $"Erreur serveur : {ex.Message}, Méthode GetRevenueByID");
}
}
}
}