79492184d0
- WBS-CRM-02: 상담 이력 (consultations 테이블 V008, ClientDetail.razor) - WBS-CRM-03: 문의→고객 전환 (V009 client_id FK, InquiryDetail 고객등록 버튼) - WBS-CRM-04: 신고 일정 캘린더 (tax_filings 테이블 V010, TaxFilingList.razor) - WBS-CRM-05: 문의 상태 5단계 확장 (V011, InquiryStatus enum, InquiryList 탭) - WBS-MKT-04: 시즌 시뮬레이터 어드민 페이지 (SeasonSimulator.razor) - WBS-UX-04: 개인정보처리방침 /taxbaik/privacy, 이용약관 /taxbaik/terms - Dashboard.razor 마감 임박 신고 위젯 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
51 lines
2.0 KiB
C#
51 lines
2.0 KiB
C#
namespace TaxBaik.Application.Services;
|
|
|
|
using TaxBaik.Domain.Entities;
|
|
using TaxBaik.Domain.Interfaces;
|
|
|
|
public class TaxFilingService(ITaxFilingRepository repository)
|
|
{
|
|
public static readonly string[] FilingTypes =
|
|
["부가가치세", "종합소득세", "법인세", "원천징수", "종합부동산세", "증여세", "상속세", "기타"];
|
|
|
|
public static readonly string[] Statuses =
|
|
["pending", "filed", "overdue"];
|
|
|
|
public static readonly Dictionary<string, string> StatusLabels = new()
|
|
{
|
|
["pending"] = "신고 예정",
|
|
["filed"] = "신고 완료",
|
|
["overdue"] = "기한 초과",
|
|
};
|
|
|
|
public async Task<IEnumerable<TaxFiling>> GetByClientIdAsync(int clientId, CancellationToken ct = default) =>
|
|
await repository.GetByClientIdAsync(clientId, ct);
|
|
|
|
public async Task<IEnumerable<TaxFiling>> GetUpcomingAsync(int daysAhead = 30, CancellationToken ct = default) =>
|
|
await repository.GetUpcomingAsync(daysAhead, ct);
|
|
|
|
public async Task<TaxFiling?> GetByIdAsync(int id, CancellationToken ct = default) =>
|
|
await repository.GetByIdAsync(id, ct);
|
|
|
|
public async Task<int> CreateAsync(TaxFiling filing, CancellationToken ct = default)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(filing.FilingType))
|
|
throw new ValidationException("신고 유형을 선택하세요.");
|
|
if (filing.ClientId <= 0)
|
|
throw new ValidationException("고객을 선택하세요.");
|
|
if (filing.DueDate == default)
|
|
throw new ValidationException("신고 기한을 입력하세요.");
|
|
return await repository.CreateAsync(filing, ct);
|
|
}
|
|
|
|
public async Task UpdateAsync(TaxFiling filing, CancellationToken ct = default)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(filing.FilingType))
|
|
throw new ValidationException("신고 유형을 선택하세요.");
|
|
await repository.UpdateAsync(filing, ct);
|
|
}
|
|
|
|
public async Task DeleteAsync(int id, CancellationToken ct = default) =>
|
|
await repository.DeleteAsync(id, ct);
|
|
}
|