| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- @page
- @model Admin.Pages.Store.Settlement.IndexModel
- @using Domain.Entities.Store.ValueObject
- @{
- ViewData["Title"] = "게임사 정산";
- }
- <div class="container-fluid">
- <h3>@ViewData["Title"]</h3>
- <hr />
- <partial name="_StatusMessage" />
- <div class="row g-2 mb-2 align-items-center">
- <div class="col-auto search-form__label">
- <label class="col-form-label">게임</label>
- </div>
- <div class="col-12 col-lg-auto">
- <select id="gameID" class="form-select">
- <option value="">전체 게임</option>
- @foreach (var g in Model.Games)
- {
- <option value="@g.Value" selected="@(Model.Query.GameID?.ToString() == g.Value)">@g.Text</option>
- }
- </select>
- </div>
- </div>
- <div class="row g-2 mb-2 align-items-center">
- <div class="col-auto search-form__label">
- <label class="col-form-label">정산 기준 연월</label>
- </div>
- <div class="col-auto">
- <select id="year" class="form-select">
- <option value="">연도</option>
- @{
- var nowY = DateTime.UtcNow.Year;
- for (var y = nowY; y >= nowY - 5; y--)
- {
- <option value="@y" selected="@(Model.Query.Year == y)">@(y)년</option>
- }
- }
- </select>
- </div>
- <div class="col-auto">
- <select id="month" class="form-select">
- <option value="">월</option>
- @for (var m = 1; m <= 12; m++)
- {
- <option value="@m" selected="@(Model.Query.Month == m)">@(m)월</option>
- }
- </select>
- </div>
- <div class="col-auto">
- <div class="btn-group" role="group" aria-label="빠른 선택">
- <button type="button" class="btn btn-sm btn-outline-secondary btn-period" data-period="thisMonth">이번달</button>
- <button type="button" class="btn btn-sm btn-outline-secondary btn-period" data-period="lastMonth">전월</button>
- <button type="button" class="btn btn-sm btn-outline-secondary btn-period" data-period="thisYear">올해</button>
- </div>
- </div>
- </div>
- <div class="row justify-content-center mt-3">
- <div class="col col-sm-auto">
- <button type="button" id="btnSearch" class="btn btn-primary w-100">검색</button>
- </div>
- </div>
- <hr />
- <div class="row g-2 mb-2">
- <div class="col">
- Total : @Model.Total.ToString("N0") |
- 합계 매출 : <strong>@((Model.Totals?.TotalRevenue ?? 0).ToString("N0"))원</strong> |
- 합계 주문 : <strong>@((Model.Totals?.TotalOrders ?? 0).ToString("N0"))건</strong>
- </div>
- <div class="col-auto">
- <select name="perPage" id="perPage" class="form-select w-auto d-inline-block">
- <option value="10" selected="@(Model.Query.PerPage == 10)">10</option>
- <option value="20" selected="@(Model.Query.PerPage == 20)">20</option>
- <option value="50" selected="@(Model.Query.PerPage == 50)">50</option>
- <option value="100" selected="@(Model.Query.PerPage == 100)">100</option>
- </select>
- </div>
- <div class="col-auto">
- <a class="btn btn-success" asp-page="Export" asp-all-route-data="@(new Dictionary<string,string?>{
- { "Query.GameID", Model.Query.GameID?.ToString() },
- { "Query.Year", Model.Query.Year?.ToString() },
- { "Query.Month", Model.Query.Month?.ToString() },
- { "Query.Status", ((int?)Model.Query.Status)?.ToString() }
- })">CSV 다운로드</a>
- </div>
- </div>
- <ul class="nav nav-tabs">
- <li class="nav-item">
- <a class="nav-link @(!Model.Query.Status.HasValue ? "active" : null)" href="?">
- 전체 (@((Model.Counts?.All ?? 0).ToString("N0")))
- </a>
- </li>
- <li class="nav-item">
- <a class="nav-link @(Model.Query.Status == GameSettlementStatus.Pending ? "active" : null)" href="?Query.Status=@((int)GameSettlementStatus.Pending)">
- 정산 대기 (@((Model.Counts?.Pending ?? 0).ToString("N0")))
- </a>
- </li>
- <li class="nav-item">
- <a class="nav-link @(Model.Query.Status == GameSettlementStatus.Settled ? "active" : null)" href="?Query.Status=@((int)GameSettlementStatus.Settled)">
- 정산 완료 (@((Model.Counts?.Settled ?? 0).ToString("N0")))
- </a>
- </li>
- </ul>
- <div class="table-responsive">
- <table class="table table-bordered table-hover mt-3">
- <colgroup>
- <col style="width: 5%;" />
- <col />
- <col style="width: 8%;" />
- <col style="width: 12%;" />
- <col style="width: 8%;" />
- <col style="width: 10%;" />
- <col style="width: 15%;" />
- <col style="width: 12%;" />
- <col style="width: 8%;" />
- </colgroup>
- <thead>
- <tr>
- <th>#</th>
- <th>게임 / 게임사</th>
- <th>정산월</th>
- <th class="text-end">매출(게임사 몫)</th>
- <th class="text-end">주문수</th>
- <th>상태</th>
- <th>처리 일시 / 관리자</th>
- <th>등록 일시</th>
- <th>비고</th>
- </tr>
- </thead>
- @if (Model.List == null || Model.List.Count <= 0)
- {
- <tbody><tr><td colspan="9">No Data.</td></tr></tbody>
- }
- else
- {
- <tbody>
- @foreach (var row in Model.List)
- {
- <tr>
- <td>@row.Num</td>
- <td>
- <strong>@row.GameName</strong>
- <br /><small class="text-muted">@row.GamePublisher</small>
- </td>
- <td>@row.Year.@(row.Month.ToString("00"))</td>
- <td class="text-end">@row.TotalRevenueAmount.ToString("N0") P</td>
- <td class="text-end">@row.OrderCount.ToString("N0")</td>
- <td>
- @if (row.Status == GameSettlementStatus.Pending)
- {
- <span class="badge bg-warning text-dark">@row.StatusText</span>
- }
- else
- {
- <span class="badge bg-success">@row.StatusText</span>
- }
- </td>
- <td>
- @if (row.SettledAt is not null)
- {
- <small>@row.SettledAt<br />@row.SettledByAdminEmail</small>
- }
- else
- {
- <span class="text-muted">-</span>
- }
- </td>
- <td>@row.CreatedAt</td>
- <td>
- <div class="d-xl-flex gap-2 justify-content-center d-grid">
- <a class="btn btn-sm btn-outline-info" href="@row.DetailURL">상세</a>
- </div>
- </td>
- </tr>
- }
- </tbody>
- }
- </table>
- <partial name="_Pagination" model="Model.Pagination" />
- </div>
- </div>
- @section Scripts {
- <script>
- function applyPeriod(p) {
- const now = new Date();
- if (p === "thisMonth") {
- document.getElementById("year").value = now.getFullYear();
- document.getElementById("month").value = now.getMonth() + 1;
- } else if (p === "lastMonth") {
- const last = new Date(now.getFullYear(), now.getMonth() - 1, 1);
- document.getElementById("year").value = last.getFullYear();
- document.getElementById("month").value = last.getMonth() + 1;
- } else if (p === "thisYear") {
- document.getElementById("year").value = now.getFullYear();
- document.getElementById("month").value = "";
- }
- }
- function updateQueryString() {
- let queryParams = new URLSearchParams();
- const gameID = document.getElementById("gameID").value;
- const year = document.getElementById("year").value;
- const month = document.getElementById("month").value;
- const perPage = document.getElementById("perPage").value;
- if (gameID) { queryParams.set("Query.GameID", gameID); }
- if (year) { queryParams.set("Query.Year", year); }
- if (month) { queryParams.set("Query.Month", month); }
- queryParams.set("Query.PerPage", perPage);
- @if (Model.Query.Status.HasValue)
- {
- <text>queryParams.set("Query.Status", "@((int)Model.Query.Status.Value)");</text>
- }
- window.location.href = window.location.pathname + "?" + queryParams.toString();
- }
- $(document).on("click", ".btn-period", function() {
- applyPeriod($(this).data("period"));
- updateQueryString();
- });
- $(document).on("change", "#perPage", updateQueryString);
- $(document).on("click", "#btnSearch", function(e) {
- e.preventDefault();
- updateQueryString();
- });
- </script>
- }
|