92 lines
3.6 KiB
C#
92 lines
3.6 KiB
C#
namespace TaxBaik.Application.Services;
|
|
|
|
using TaxBaik.Application.DTOs;
|
|
using TaxBaik.Domain.Entities;
|
|
using TaxBaik.Domain.Interfaces;
|
|
|
|
public class ClientService(IClientRepository repository)
|
|
{
|
|
public static readonly string[] ServiceTypes =
|
|
["기장", "부동산", "증여·상속", "종합소득세", "법인세", "부가가치세", "기타"];
|
|
|
|
public static readonly string[] TaxTypes =
|
|
["개인사업자", "법인사업자", "면세사업자", "근로소득자", "기타"];
|
|
|
|
public static readonly string[] Sources =
|
|
["홈페이지 문의", "소개", "직접 방문", "카카오 채널", "블로그", "기타"];
|
|
|
|
public async Task<(IEnumerable<Client> Items, int Total)> GetPagedAsync(
|
|
int page, int pageSize, string? status = null, string? search = null, CancellationToken ct = default) =>
|
|
await repository.GetPagedAsync(Math.Max(1, page), Math.Clamp(pageSize, 1, 100), status, search, ct);
|
|
|
|
public async Task<Client?> GetByIdAsync(int id, CancellationToken ct = default) =>
|
|
await repository.GetByIdAsync(id, ct);
|
|
|
|
public async Task<Client?> GetByEmailAsync(string email, CancellationToken ct = default) =>
|
|
await repository.GetByEmailAsync(email, ct);
|
|
|
|
public async Task<Client?> GetByPhoneAsync(string phone, CancellationToken ct = default) =>
|
|
await repository.GetByPhoneAsync(phone, ct);
|
|
|
|
public async Task<int> CountCreatedAtRangeAsync(DateTime startDateUtc, DateTime endDateUtc, CancellationToken ct = default) =>
|
|
await repository.CountByCreatedAtRangeAsync(startDateUtc, endDateUtc, ct);
|
|
|
|
public async Task<int> CreateAsync(CreateClientDto dto, CancellationToken ct = default)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(dto.Name))
|
|
throw new ValidationException("고객명을 입력하세요.");
|
|
|
|
var client = new Client
|
|
{
|
|
Name = dto.Name.Trim(),
|
|
CompanyName = dto.CompanyName?.Trim(),
|
|
Phone = dto.Phone?.Trim(),
|
|
Email = dto.Email?.Trim(),
|
|
ServiceType = dto.ServiceType,
|
|
TaxType = dto.TaxType,
|
|
Status = dto.Status,
|
|
Source = dto.Source,
|
|
Memo = dto.Memo?.Trim()
|
|
};
|
|
|
|
return await repository.CreateAsync(client, ct);
|
|
}
|
|
|
|
public async Task UpdateAsync(int id, CreateClientDto dto, CancellationToken ct = default)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(dto.Name))
|
|
throw new ValidationException("고객명을 입력하세요.");
|
|
|
|
var client = await repository.GetByIdAsync(id, ct)
|
|
?? throw new KeyNotFoundException($"고객 ID {id}를 찾을 수 없습니다.");
|
|
|
|
client.Name = dto.Name.Trim();
|
|
client.CompanyName = dto.CompanyName?.Trim();
|
|
client.Phone = dto.Phone?.Trim();
|
|
client.Email = dto.Email?.Trim();
|
|
client.ServiceType = dto.ServiceType;
|
|
client.TaxType = dto.TaxType;
|
|
client.Status = dto.Status;
|
|
client.Source = dto.Source;
|
|
client.Memo = dto.Memo?.Trim();
|
|
|
|
await repository.UpdateAsync(client, ct);
|
|
}
|
|
|
|
public async Task<int> CreateFromInquiryAsync(string name, string? phone, string? serviceType, CancellationToken ct = default)
|
|
{
|
|
var client = new Client
|
|
{
|
|
Name = name.Trim(),
|
|
Phone = phone?.Trim(),
|
|
ServiceType = serviceType,
|
|
Status = "active",
|
|
Source = "홈페이지 문의"
|
|
};
|
|
return await repository.CreateAsync(client, ct);
|
|
}
|
|
|
|
public async Task DeleteAsync(int id, CancellationToken ct = default) =>
|
|
await repository.DeleteAsync(id, ct);
|
|
}
|