-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
Copy pathCreateExpense.cs
More file actions
176 lines (141 loc) · 6.1 KB
/
CreateExpense.cs
File metadata and controls
176 lines (141 loc) · 6.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
using Application.Common.Repositories;
using Application.Features.BudgetManager.Queries;
using Application.Features.ConfigManager;
using Application.Features.ExpenseManager.Queries;
using Application.Features.NumberSequenceManager;
using Domain.Entities;
using Domain.Enums;
using FluentValidation;
using MediatR;
namespace Application.Features.ExpenseManager.Commands;
public class CreateExpenseResult
{
public Expense? Data { get; set; }
}
public class CreateExpenseRequest : IRequest<CreateExpenseResult>
{
public string? Title { get; init; }
public string? Description { get; init; }
public DateTime? ExpenseDate { get; init; }
public string? Status { get; init; }
public double? Amount { get; init; }
public string? CampaignId { get; init; }
public string? CreatedById { get; init; }
}
public class CreateExpenseValidator : AbstractValidator<CreateExpenseRequest>
{
public CreateExpenseValidator()
{
RuleFor(x => x.Title).NotEmpty();
RuleFor(x => x.ExpenseDate).NotNull();
RuleFor(x => x.Amount).NotNull();
RuleFor(x => x.CampaignId).NotEmpty();
RuleFor(x => x.Status).NotEmpty();
}
}
public class CreateExpenseHandler : IRequestHandler<CreateExpenseRequest, CreateExpenseResult>
{
private readonly ICommandRepository<Expense> _repository;
private readonly IUnitOfWork _unitOfWork;
private readonly NumberSequenceService _numberSequenceService;
private readonly IMediator _mediator;
public CreateExpenseHandler(
ICommandRepository<Expense> repository,
IUnitOfWork unitOfWork,
NumberSequenceService numberSequenceService,
IMediator mediator
)
{
_repository = repository;
_unitOfWork = unitOfWork;
_numberSequenceService = numberSequenceService;
_mediator = mediator;
}
public async Task<CreateExpenseResult> Handle(CreateExpenseRequest request, CancellationToken cancellationToken = default)
{
var entity = new Expense
{
CreatedById = request.CreatedById,
Number = _numberSequenceService.GenerateNumber(nameof(Expense), "", "EXP"),
Title = request.Title,
Description = request.Description,
ExpenseDate = request.ExpenseDate,
Status = (ExpenseStatus)int.Parse(request.Status!),
Amount = request.Amount,
CampaignId = request.CampaignId
};
//AnalyseExpense analyse= new AnalyseExpense(_mediator);
//ConfigMethode configService = new ConfigMethode(_mediator);
//var config = await configService.GetConfigByNameAsync("AlertBudget");
//Console.WriteLine("Valeur de la config");
//Console.WriteLine(config);
//if (await analyse.IsExpenseExceedingBudget(entity.Amount ?? 0, entity.CampaignId, int.Parse(config) ))
//{
// throw new Exception("Expense exceeds the budget.");
//}
await _repository.CreateAsync(entity, cancellationToken);
await _unitOfWork.SaveAsync(cancellationToken);
return new CreateExpenseResult
{
Data = entity
};
}
}
public class AnalyseExpense
{
private readonly IMediator _mediator;
public AnalyseExpense(IMediator mediator)
{
_mediator = mediator;
}
public async Task<bool> IsExpenseExceedingBudgetAlert(double amount, string idCampaign, int? alert, DateTime date)
{
// Get the list of budgets for the campaign using GetBudgetByCampaignIdListRequest
var budgetRequest = new GetBudgetByCampaignIdListRequest { CampaignId = idCampaign };
var budgetResult = await _mediator.Send(budgetRequest);
var budgets = budgetResult.Data;
if (budgets == null || !budgets.Any())
{
throw new Exception("No budgets found for the campaign.");
}
var expensesRequest = new GetExpenseByCampaignIdListRequest { CampaignId = idCampaign };
var expensesResult = await _mediator.Send(expensesRequest);
// Get the list of confirmed expenses for the campaign
var expenses = expensesResult.Data;
// Filter expenses to only include confirmed ones
var confirmedExpenses = expenses.Where(e => e.Status == ExpenseStatus.Confirmed);
var confirmedBudget = budgets.Where(e => e.Status == BudgetStatus.Confirmed);
var budgetBeforDate = confirmedBudget.Where(b => b.BudgetDate <= date);
// Calculate the total budget
double totalBudget = budgetBeforDate.Sum(b => b.Amount ?? 0);
// Calculate the total confirmed expenses
double totalExpenses = confirmedExpenses.Sum(e => e.Amount ?? 0) + amount;
Console.WriteLine("bugetAvecLimte");
Console.WriteLine(alert);
Console.WriteLine(totalBudget);
Console.WriteLine(totalBudget - ((totalBudget * alert) / 100));
return totalExpenses > totalBudget - ((totalBudget * alert) / 100);
}
public async Task<bool> IsExpenseExceedingBudget(double amount, string idCampaign)
{
// Get the list of budgets for the campaign using GetBudgetByCampaignIdListRequest
var budgetRequest = new GetBudgetByCampaignIdListRequest { CampaignId = idCampaign };
var budgetResult = await _mediator.Send(budgetRequest);
var budgets = budgetResult.Data;
if (budgets == null || !budgets.Any())
{
throw new Exception("No budgets found for the campaign.");
}
var expensesRequest = new GetExpenseByCampaignIdListRequest { CampaignId = idCampaign };
var expensesResult = await _mediator.Send(expensesRequest);
// Get the list of confirmed expenses for the campaign
var expenses = expensesResult.Data;
// Filter expenses to only include confirmed ones
var confirmedExpenses = expenses.Where(e => e.Status == ExpenseStatus.Confirmed);
// Calculate the total budget
double totalBudget = budgets.Sum(b => b.Amount ?? 0);
// Calculate the total confirmed expenses
double totalExpenses = confirmedExpenses.Sum(e => e.Amount ?? 0) + amount;
return totalExpenses > totalBudget;
}
}