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>
101 lines
4.0 KiB
C#
101 lines
4.0 KiB
C#
namespace TaxBaik.Infrastructure.Repositories;
|
|
|
|
using Dapper;
|
|
using TaxBaik.Domain.Entities;
|
|
using TaxBaik.Domain.Interfaces;
|
|
|
|
public class InquiryRepository(IDbConnectionFactory connectionFactory) : BaseRepository(connectionFactory), IInquiryRepository
|
|
{
|
|
public async Task<int> CreateAsync(Inquiry inquiry, CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
return await conn.QueryFirstAsync<int>(
|
|
@"INSERT INTO inquiries (name, phone, email, service_type, message, status, ip_address, created_at)
|
|
VALUES (@Name, @Phone, @Email, @ServiceType, @Message, @Status, @IpAddress, NOW())
|
|
RETURNING id",
|
|
inquiry);
|
|
}
|
|
|
|
public async Task<Inquiry?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
return await conn.QueryFirstOrDefaultAsync<Inquiry>(
|
|
@"SELECT id, name, phone, email, service_type, message, status, ip_address,
|
|
client_id, admin_memo, created_at, updated_at
|
|
FROM inquiries WHERE id = @Id",
|
|
new { Id = id });
|
|
}
|
|
|
|
public async Task<(IEnumerable<Inquiry> Items, int Total)> GetPagedAsync(
|
|
int page, int pageSize, string? status = null, CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
var offset = (page - 1) * pageSize;
|
|
|
|
using var reader = await conn.QueryMultipleAsync(
|
|
@"SELECT id, name, phone, email, service_type, message, status, ip_address,
|
|
client_id, admin_memo, created_at, updated_at
|
|
FROM inquiries
|
|
WHERE @Status::text IS NULL OR status = @Status
|
|
ORDER BY created_at DESC
|
|
LIMIT @PageSize OFFSET @Offset;
|
|
|
|
SELECT COUNT(*) FROM inquiries
|
|
WHERE @Status::text IS NULL OR status = @Status;",
|
|
new { Status = status, PageSize = pageSize, Offset = offset });
|
|
|
|
var items = (await reader.ReadAsync<Inquiry>()).ToList();
|
|
var total = await reader.ReadFirstAsync<int>();
|
|
|
|
return (items, total);
|
|
}
|
|
|
|
public async Task<int> CountAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
return await conn.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM inquiries");
|
|
}
|
|
|
|
public async Task<int> CountThisMonthAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
return await conn.ExecuteScalarAsync<int>(
|
|
@"SELECT COUNT(*)
|
|
FROM inquiries
|
|
WHERE created_at >= date_trunc('month', NOW())
|
|
AND created_at < date_trunc('month', NOW()) + INTERVAL '1 month'");
|
|
}
|
|
|
|
public async Task<int> CountByStatusAsync(string status, CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
return await conn.ExecuteScalarAsync<int>(
|
|
"SELECT COUNT(*) FROM inquiries WHERE status = @Status",
|
|
new { Status = status });
|
|
}
|
|
|
|
public async Task UpdateStatusAsync(int id, string status, CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
await conn.ExecuteAsync(
|
|
"UPDATE inquiries SET status = @Status, updated_at = NOW() WHERE id = @Id",
|
|
new { Id = id, Status = status });
|
|
}
|
|
|
|
public async Task UpdateAdminMemoAsync(int id, string? adminMemo, CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
await conn.ExecuteAsync(
|
|
"UPDATE inquiries SET admin_memo = @AdminMemo, updated_at = NOW() WHERE id = @Id",
|
|
new { Id = id, AdminMemo = adminMemo });
|
|
}
|
|
|
|
public async Task LinkClientAsync(int inquiryId, int clientId, CancellationToken cancellationToken = default)
|
|
{
|
|
using var conn = Conn();
|
|
await conn.ExecuteAsync(
|
|
"UPDATE inquiries SET client_id = @ClientId, updated_at = NOW() WHERE id = @Id",
|
|
new { Id = inquiryId, ClientId = clientId });
|
|
}
|
|
}
|