146 lines
4.7 KiB
C#
146 lines
4.7 KiB
C#
using FrontOffice.Main.Utilities;
|
|
using FrontOffice.Main.Shared;
|
|
using Microsoft.AspNetCore.Components;
|
|
using MudBlazor;
|
|
|
|
namespace FrontOffice.Main.Pages.Commission;
|
|
|
|
public partial class WeeklyBalancePage : ComponentBase
|
|
{
|
|
[Inject] private CommissionService CommissionService { get; set; } = default!;
|
|
[Inject] private ISnackbar SnackbarService { get; set; } = default!;
|
|
|
|
[Parameter]
|
|
[SupplyParameterFromQuery(Name = "week")]
|
|
public string? QueryWeekNumber { get; set; }
|
|
|
|
private WeekSelector? _weekSelector;
|
|
private WeekDefinitionDto? _selectedWeekDefinition;
|
|
private WeeklyBalanceDto? _weeklyBalance;
|
|
private bool _isLoading = true;
|
|
private bool _hasError = false;
|
|
|
|
private readonly ChartOptions _chartOptions = new()
|
|
{
|
|
ChartPalette = new[]
|
|
{
|
|
"#2196F3", // Info (Left)
|
|
"#4CAF50", // Success (Right)
|
|
"#FF9800" // Warning (Min)
|
|
}
|
|
};
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
if (firstRender)
|
|
{
|
|
// Wait for WeekSelector to initialize and load its cached weeks
|
|
if (_weekSelector != null)
|
|
{
|
|
await _weekSelector.EnsureLoadedAsync();
|
|
|
|
// Handle query parameter ?week=7 (WeekDefinitionId)
|
|
if (!string.IsNullOrEmpty(QueryWeekNumber))
|
|
{
|
|
// Try to parse as WeekDefinitionId first (most common from dashboard links)
|
|
if (long.TryParse(QueryWeekNumber, out long id))
|
|
{
|
|
_selectedWeekDefinition = _weekSelector.FindById(id);
|
|
|
|
// Fallback: try as WeekOrder if not found by Id
|
|
if (_selectedWeekDefinition == null && int.TryParse(QueryWeekNumber, out int weekOrder))
|
|
{
|
|
_selectedWeekDefinition = _weekSelector.FindByWeekOrder(weekOrder);
|
|
}
|
|
|
|
// If still not found in cache, create a temporary definition with just the Id
|
|
// so we can still query the balance from BFF
|
|
if (_selectedWeekDefinition == null)
|
|
{
|
|
_selectedWeekDefinition = new WeekDefinitionDto { Id = id, DisplayName = $"هفته {id}" };
|
|
}
|
|
}
|
|
}
|
|
|
|
// If no week selected and no query param, select current week
|
|
if (_selectedWeekDefinition == null)
|
|
{
|
|
_selectedWeekDefinition = _weekSelector.GetCurrentWeek();
|
|
}
|
|
|
|
await LoadWeeklyBalanceAsync();
|
|
StateHasChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
_isLoading = true;
|
|
}
|
|
|
|
private async Task LoadWeeklyBalanceAsync()
|
|
{
|
|
try
|
|
{
|
|
_isLoading = true;
|
|
_hasError = false;
|
|
|
|
long? weekDefinitionId = _selectedWeekDefinition?.Id;
|
|
|
|
_weeklyBalance = await CommissionService.GetMyWeeklyBalanceAsync(weekDefinitionId);
|
|
|
|
// Update week display name from selected definition if available
|
|
if (_selectedWeekDefinition != null && _weeklyBalance != null)
|
|
{
|
|
_weeklyBalance.WeekDisplayName = _selectedWeekDefinition.DisplayName;
|
|
return;
|
|
}
|
|
|
|
_weeklyBalance = new WeeklyBalanceDto()
|
|
{
|
|
|
|
};
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_hasError = true;
|
|
SnackbarService.Add($"خطا در دریافت تعادل: {ex.Message}", Severity.Error);
|
|
}
|
|
finally
|
|
{
|
|
_isLoading = false;
|
|
}
|
|
}
|
|
|
|
private async Task LoadCurrentWeekAsync()
|
|
{
|
|
if (_weekSelector != null)
|
|
{
|
|
await _weekSelector.SelectCurrentWeekAsync();
|
|
}
|
|
_selectedWeekDefinition = _weekSelector?.GetCurrentWeek();
|
|
await LoadWeeklyBalanceAsync();
|
|
}
|
|
|
|
private double GetLeftPercentage()
|
|
{
|
|
if (_weeklyBalance is null)
|
|
return 0;
|
|
var total = _weeklyBalance.LeftBalance + _weeklyBalance.RightBalance;
|
|
if (total == 0)
|
|
return 0;
|
|
return (_weeklyBalance.LeftBalance / (double)total) * 100;
|
|
}
|
|
|
|
private double GetRightPercentage()
|
|
{
|
|
if (_weeklyBalance is null)
|
|
return 0;
|
|
var total = _weeklyBalance.LeftBalance + _weeklyBalance.RightBalance;
|
|
if (total == 0)
|
|
return 0;
|
|
return (_weeklyBalance.RightBalance / (double)total) * 100;
|
|
}
|
|
}
|