사용자 매뉴얼·번호알기·gov-portal 대시보드와 메뉴 동선·수불 리포트를 보강한다.
- 사용자 매뉴얼: league/commonmark 기반 bag/manual(로그인 전용), ManualRenderer + Config\Manual manifest, 콘텐츠 8종, E2E - 번호알기(봉투번호확인): bag/number-lookup, BagNumberLookup, E2E - gov-portal 대시보드 시안(기본/strip)·기본코드관리 화면 - 메뉴 관리: 등록·수정 후 메뉴 화면 유지, 수정 버튼 클릭 시 상단 스크롤 - 수불/분석 리포트(LOT 수불·반품/파기·수급계획·추이) 표시 보강 - .gitignore: docs/ → /docs/ 앵커링(최상위 개발문서만 제외, app/Docs는 추적) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -9,8 +9,19 @@ $rows = is_array($rows ?? null) ? $rows : [];
|
||||
$bagProducts = is_array($bagProducts ?? null) ? $bagProducts : [];
|
||||
$bagKindOptions = is_array($bagKindOptions ?? null) ? $bagKindOptions : [];
|
||||
$agencies = is_array($agencies ?? null) ? $agencies : [];
|
||||
$exportQuery = (string) ($exportQuery ?? 'search=1');
|
||||
$queried = (bool) ($queried ?? false);
|
||||
$exportParams = array_filter([
|
||||
'search' => '1',
|
||||
'start_date' => $startDate,
|
||||
'end_date' => $endDate,
|
||||
'agg_mode' => $aggMode,
|
||||
'bag_code' => $bagCode,
|
||||
'bag_kind' => $bagKind,
|
||||
'sa_idx' => $saIdx > 0 ? (string) $saIdx : '',
|
||||
], static fn ($v) => $v !== null && $v !== '');
|
||||
$excelUrl = $queried
|
||||
? base_url('bag/flow/export') . '?' . http_build_query($exportParams)
|
||||
: '';
|
||||
$fmt = static fn ($n): string => number_format((int) $n);
|
||||
|
||||
$printExtraLines = [];
|
||||
@@ -18,6 +29,13 @@ if ($queried) {
|
||||
$aggLabel = $aggMode === 'daily' ? '일자별' : '기간별';
|
||||
$printExtraLines[] = '조회기간: ' . $startDate . ' ~ ' . $endDate . ' (' . $aggLabel . ')';
|
||||
}
|
||||
|
||||
$tipPage = "조회 기간 동안 봉투 품목별 입고·출고·잔량을 집계하는 수불표입니다.\n"
|
||||
. "· 집계방식: 일자별(날짜마다) / 기간별(기간 합계)\n"
|
||||
. "· 전일재고: 조회 시작일 전날 기준 재고(입고·반품·기타 − 출고 누적)\n"
|
||||
. "· 입고: 입고·반품·기타 / 출고: 판매·일반·무료불출·반품·기타\n"
|
||||
. "· 대행소 선택 시 판매 열만 해당 대행소 소속 판매소 기준\n"
|
||||
. "조회 후 표·엑셀·인쇄에 반영됩니다.";
|
||||
?>
|
||||
<div class="flow-print-sheet">
|
||||
<?= view('components/print_header', [
|
||||
@@ -27,9 +45,17 @@ if ($queried) {
|
||||
|
||||
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel no-print">
|
||||
<div class="flex flex-wrap items-center justify-between gap-y-2">
|
||||
<span class="text-sm font-bold text-gray-700">기간별 봉투 수불 현황</span>
|
||||
<span class="text-sm font-bold text-gray-700 inline-flex items-center gap-1">
|
||||
기간별 봉투 수불 현황
|
||||
<?= view('components/field_tooltip', ['text' => $tipPage, 'placement' => 'below']) ?>
|
||||
</span>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<a href="<?= base_url('bag/flow/export?' . esc($exportQuery, 'attr')) ?>" class="bg-green-700 text-white px-3 py-1 rounded-sm text-sm hover:bg-green-800">엑셀저장</a>
|
||||
<?php if ($excelUrl !== ''): ?>
|
||||
<a href="<?= esc($excelUrl, 'attr') ?>" target="_blank" rel="noopener noreferrer"
|
||||
class="bg-green-700 text-white px-3 py-1 rounded-sm text-sm hover:bg-green-800">엑셀저장</a>
|
||||
<?php else: ?>
|
||||
<span class="bg-gray-300 text-gray-600 px-3 py-1 rounded-sm text-sm cursor-not-allowed" title="조회 후 이용">엑셀저장</span>
|
||||
<?php endif; ?>
|
||||
<button type="button" onclick="window.print()" class="border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50">인쇄</button>
|
||||
<a href="<?= base_url('dashboard') ?>" class="border border-gray-400 text-gray-700 px-3 py-1 rounded-sm text-sm hover:bg-gray-50">종료</a>
|
||||
</div>
|
||||
@@ -103,7 +129,6 @@ if ($queried) {
|
||||
<button type="submit" class="bg-btn-search text-white px-4 py-1 rounded-sm">조회</button>
|
||||
<a href="<?= base_url('bag/flow') ?>" class="text-gray-500 hover:text-gray-800 px-2">초기화</a>
|
||||
</form>
|
||||
<p class="text-xs text-gray-500 mt-1">전일재고 = 조회 시작일 전날 기준 품목별 재고(입고·반품·기타 − 출고 누적). 대행소 선택 시 <strong>판매</strong>만 해당 대행소 소속 판매소 기준입니다.</p>
|
||||
</section>
|
||||
|
||||
<?php if (! $queried): ?>
|
||||
@@ -186,6 +211,26 @@ if ($queried) {
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.field-tip { position: relative; display: inline-flex; vertical-align: middle; }
|
||||
.field-tip-btn {
|
||||
display: inline-flex; align-items: center; justify-content: center;
|
||||
width: 14px; height: 14px; font-size: 10px; font-weight: 700; line-height: 1;
|
||||
color: #6b7280; background: #f3f4f6; border: 1px solid #d1d5db; border-radius: 50%;
|
||||
cursor: help; user-select: none;
|
||||
}
|
||||
.field-tip-btn:hover, .field-tip-btn:focus { color: #1d4ed8; border-color: #93c5fd; background: #eff6ff; outline: none; }
|
||||
.field-tip-panel {
|
||||
position: absolute; z-index: 60; left: 50%; transform: translateX(-50%);
|
||||
bottom: calc(100% + 6px); width: max-content; max-width: 300px;
|
||||
padding: 0.35rem 0.5rem; border-radius: 4px;
|
||||
background: #1f2937; color: #f9fafb; font-size: 11px; font-weight: 500; line-height: 1.35;
|
||||
text-align: left; white-space: pre-line; box-shadow: 0 2px 8px rgba(0,0,0,.15);
|
||||
opacity: 0; visibility: hidden; pointer-events: none; transition: opacity .12s, visibility .12s;
|
||||
}
|
||||
.field-tip--below .field-tip-panel { bottom: auto; top: calc(100% + 6px); }
|
||||
.field-tip:hover .field-tip-panel,
|
||||
.field-tip:focus-within .field-tip-panel { opacity: 1; visibility: visible; }
|
||||
|
||||
.flow-lbl-print { display: none; }
|
||||
|
||||
@media screen {
|
||||
|
||||
Reference in New Issue
Block a user