168 lines
9.3 KiB
Plaintext
168 lines
9.3 KiB
Plaintext
@page "/portal"
|
|
@model TaxBaik.Web.Pages.Portal.IndexModel
|
|
@{
|
|
ViewData["Title"] = "마이 포털 - 세무사 백원숙";
|
|
ViewData["Description"] = "고객님의 세무 신고 일정과 상담 이력을 실시간으로 확인하실 수 있는 마이페이지입니다.";
|
|
}
|
|
|
|
<div class="bg-light py-5">
|
|
<div class="container">
|
|
<!-- 상단 헤더 & 환영 문구 -->
|
|
<div class="d-flex flex-wrap justify-content-between align-items-center mb-5 pb-4 border-bottom">
|
|
<div>
|
|
<p class="text-primary fw-bold mb-1">TaxBaik My Portal</p>
|
|
<h1 class="display-6 fw-bold text-dark">안녕하세요, @(User.Identity?.Name)님!</h1>
|
|
@if (Model.ClientInfo != null)
|
|
{
|
|
<p class="text-muted mb-0">
|
|
<i class="bi bi-building"></i> @(string.IsNullOrEmpty(Model.ClientInfo.CompanyName) ? "개인 고객" : Model.ClientInfo.CompanyName)
|
|
| <i class="bi bi-telephone"></i> @Model.ClientInfo.Phone
|
|
</p>
|
|
}
|
|
</div>
|
|
<div class="mt-3 mt-sm-0">
|
|
<form method="post" action="/taxbaik/portal/logout" class="d-inline">
|
|
@Html.AntiForgeryToken()
|
|
<button type="submit" class="btn btn-outline-danger btn-sm">
|
|
<i class="bi bi-box-arrow-right"></i> 로그아웃
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
@if (Model.ClientInfo == null)
|
|
{
|
|
<!-- 연동 대기 경고 -->
|
|
<div class="card border-warning shadow-sm mb-5">
|
|
<div class="card-body p-5 text-center">
|
|
<div class="mb-4">
|
|
<span class="display-1 text-warning"><i class="bi bi-exclamation-triangle-fill"></i></span>
|
|
</div>
|
|
<h3 class="fw-bold text-dark mb-3">고객 정보 연동 대기 중</h3>
|
|
<p class="text-muted max-width-md mx-auto mb-4">
|
|
가입하신 계정 정보(이메일/연락처)와 일치하는 세무 대리 고객 레코드를 찾지 못했습니다.<br />
|
|
세무사 측에서 고객 등록을 완료하거나 관리자 백오피스에서 이메일/전화번호가 일치하도록 지정하면 자동으로 포털 데이터가 활성화됩니다.
|
|
</p>
|
|
<a href="/taxbaik/contact" class="btn btn-primary px-4 py-2">
|
|
<i class="bi bi-chat-dots"></i> 세무사에게 문의하기
|
|
</a>
|
|
</div>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="row g-4">
|
|
<!-- 왼쪽: 세무 신고 현황 (Tax Filings) -->
|
|
<div class="col-lg-8">
|
|
<div class="card glass-card mb-4">
|
|
<div class="card-body p-4">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h3 class="h5 fw-bold text-dark mb-0">
|
|
<i class="bi bi-calendar-check text-primary me-2"></i> 나의 세무 신고 현황
|
|
</h3>
|
|
<span class="badge bg-secondary">총 @(Model.Filings.Count)건</span>
|
|
</div>
|
|
|
|
@if (!Model.Filings.Any())
|
|
{
|
|
<div class="text-center py-5 text-muted">
|
|
<i class="bi bi-folder-x display-4 d-block mb-3 text-secondary"></i>
|
|
등록된 세무 신고 일정이 없습니다.
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th scope="col">신고 종류</th>
|
|
<th scope="col">신고 기한</th>
|
|
<th scope="col">진행 상태</th>
|
|
<th scope="col">메모</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var filing in Model.Filings)
|
|
{
|
|
var dDay = (filing.DueDate - DateTime.Today).Days;
|
|
var statusClass = filing.Status switch
|
|
{
|
|
"filed" => "bg-success-subtle text-success",
|
|
"overdue" => "bg-danger-subtle text-danger",
|
|
_ => "bg-warning-subtle text-warning-emphasis"
|
|
};
|
|
var statusLabel = filing.Status switch
|
|
{
|
|
"filed" => "신고 완료",
|
|
"overdue" => "기한 초과",
|
|
_ => $"D-{dDay}"
|
|
};
|
|
|
|
<tr>
|
|
<td>
|
|
<span class="fw-bold text-dark">@filing.FilingType</span>
|
|
</td>
|
|
<td>
|
|
<span>@filing.DueDate.ToString("yyyy-MM-dd")</span>
|
|
</td>
|
|
<td>
|
|
<span class="badge @statusClass px-2.5 py-1.5 fs-7">@statusLabel</span>
|
|
</td>
|
|
<td class="text-muted small">
|
|
@(string.IsNullOrEmpty(filing.Memo) ? "-" : filing.Memo)
|
|
</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 오른쪽: 상담 이력 요약 (Consulting Activities) -->
|
|
<div class="col-lg-4">
|
|
<div class="card glass-card">
|
|
<div class="card-body p-4">
|
|
<h3 class="h5 fw-bold text-dark mb-4">
|
|
<i class="bi bi-chat-text text-primary me-2"></i> 최근 상담 및 지원 이력
|
|
</h3>
|
|
|
|
@if (!Model.Consultations.Any())
|
|
{
|
|
<div class="text-center py-5 text-muted">
|
|
<i class="bi bi-chat-square-dots display-4 d-block mb-3 text-secondary"></i>
|
|
최근 상담 이력이 없습니다.
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="timeline ps-2">
|
|
@foreach (var activity in Model.Consultations)
|
|
{
|
|
<div class="timeline-item-modern">
|
|
<div class="d-flex justify-content-between align-items-center mb-1">
|
|
<span class="badge bg-primary-subtle text-primary small">@activity.ActivityType</span>
|
|
<small class="text-muted">@activity.ActivityDate.ToString("yyyy-MM-dd")</small>
|
|
</div>
|
|
<p class="text-dark small mb-1 fw-semibold">@activity.Description</p>
|
|
@if (!string.IsNullOrEmpty(activity.Outcome))
|
|
{
|
|
<div class="bg-light p-2 rounded small text-muted mt-1">
|
|
<strong>결과:</strong> @activity.Outcome
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|