@page "/admin/tax-profiles"
@using TaxBaik.Web.Services.AdminClients
@inject ITaxProfileBrowserClient TaxProfileClient
@inject IClientBrowserClient ClientClient
@inject ISnackbar Snackbar
@inject IDialogService DialogService
@attribute [Authorize]
세무 프로필 관리
@if (profiles == null)
{
}
else if (profiles.Count == 0)
{
세무 프로필이 없습니다.
}
else
{
@if (clientMap.TryGetValue(context.Item.ClientId, out var clientName))
{
@clientName
}
@context.Item.TaxRiskLevel
@if (context.Item.NextFilingDueDate.HasValue)
{
@context.Item.NextFilingDueDate.Value.ToString("yyyy-MM-dd")
}
}
@(editingProfile == null ? "새 프로필 추가" : "프로필 수정")
@foreach (var client in clients)
{
@client.CompanyName
}
낮음
보통
높음
취소
저장
@code {
private List? profiles;
private List clients = [];
private Dictionary clientMap = new();
private MudForm? form;
private bool isDialogOpen;
private TaxProfile? editingProfile;
private TaxProfileForm profileForm = new();
protected override async Task OnInitializedAsync()
{
await LoadData();
}
private async Task LoadData()
{
try
{
profiles = await TaxProfileClient.GetAllAsync();
var (clientItems, _) = await ClientClient.GetPagedAsync();
clients = clientItems.ToList();
clientMap = clients.ToDictionary(c => c.Id, c => c.CompanyName ?? "");
}
catch (Exception ex)
{
Snackbar.Add($"데이터 로드 실패: {ex.Message}", Severity.Error);
}
}
private void OpenCreateDialog()
{
editingProfile = null;
profileForm = new();
isDialogOpen = true;
}
private async Task OpenEditDialog(TaxProfile profile)
{
editingProfile = profile;
profileForm = new TaxProfileForm
{
ClientId = profile.ClientId,
BusinessType = profile.BusinessType ?? "",
TaxRiskLevel = profile.TaxRiskLevel,
NextFilingDueDate = profile.NextFilingDueDate,
SpecialNotes = profile.SpecialNotes
};
isDialogOpen = true;
}
private async Task SaveProfile()
{
try
{
if (editingProfile == null)
{
var newId = await TaxProfileClient.CreateAsync(
profileForm.ClientId,
profileForm.BusinessType);
if (newId > 0)
{
Snackbar.Add("프로필이 생성되었습니다.", Severity.Success);
CloseDialog();
await LoadData();
}
}
else
{
await TaxProfileClient.UpdateAsync(
editingProfile.Id,
profileForm.BusinessType,
null,
profileForm.NextFilingDueDate,
profileForm.TaxRiskLevel);
Snackbar.Add("프로필이 업데이트되었습니다.", Severity.Success);
CloseDialog();
await LoadData();
}
}
catch (Exception ex)
{
Snackbar.Add($"저장 실패: {ex.Message}", Severity.Error);
}
}
private async Task DeleteProfile(int id)
{
var parameters = new DialogParameters();
parameters.Add("Title", "삭제 확인");
parameters.Add("Message", "이 프로필을 삭제하시겠습니까?");
var dialog = await DialogService.ShowAsync("", parameters);
var result = await dialog.Result;
if (result?.Canceled ?? true)
return;
try
{
await TaxProfileClient.DeleteAsync(id);
Snackbar.Add("프로필이 삭제되었습니다.", Severity.Success);
await LoadData();
}
catch (Exception ex)
{
Snackbar.Add($"삭제 실패: {ex.Message}", Severity.Error);
}
}
private void CloseDialog()
{
isDialogOpen = false;
editingProfile = null;
profileForm = new();
}
private Color GetRiskColor(string level) => level switch
{
"high" => Color.Error,
"normal" => Color.Warning,
"low" => Color.Success,
_ => Color.Default
};
private class TaxProfileForm
{
public int ClientId { get; set; }
public string BusinessType { get; set; } = "";
public string TaxRiskLevel { get; set; } = "normal";
public DateTime? NextFilingDueDate { get; set; }
public string? SpecialNotes { get; set; }
}
}