사용자 매뉴얼·번호알기·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:
taekyoungc
2026-06-08 00:46:51 +09:00
parent 0f1d414f37
commit 8763876f19
77 changed files with 6139 additions and 182 deletions

View File

@@ -3571,6 +3571,71 @@ SQL);
return $this->render('도움말', 'bag/help', []);
}
/**
* 사용자 매뉴얼(설명서) — 목차 첫 페이지로 이동.
*/
public function manual(): \CodeIgniter\HTTP\RedirectResponse
{
$first = (new \App\Libraries\ManualRenderer())->firstSlug();
return redirect()->to(site_url('bag/manual/' . $first));
}
/**
* 사용자 매뉴얼 개별 페이지 (slug = 화이트리스트). 미등록 slug 는 404.
*/
public function manualPage(string $slug): string
{
$renderer = new \App\Libraries\ManualRenderer();
$page = $renderer->find($slug);
$body = $page !== null ? $renderer->render($slug) : null;
if ($page === null || $body === null) {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound('매뉴얼 문서를 찾을 수 없습니다.');
}
return $this->render('사용자 매뉴얼 · ' . $page['title'], 'bag/manual', [
'pages' => $renderer->pages(),
'current' => $slug,
'title' => $page['title'],
'body' => $body,
]);
}
/**
* 도움말 — 번호알기(봉투번호확인). 코드 → 바코드·인쇄숫자·인식번호.
*/
public function numberLookup(): string
{
$code = trim((string) ($this->request->getGet('code') ?? ''));
$result = null;
$error = '';
if ($code !== '') {
$resolved = (new \App\Libraries\BagNumberLookup())->resolve($code, $this->lgIdx());
$result = $resolved;
if (! $resolved['ok']) {
$error = (string) $resolved['message'];
}
}
return $this->render('번호알기', 'bag/number_lookup', [
'code' => $code,
'result' => $result,
'error' => $error,
]);
}
/**
* 번호알기 AJAX 조회.
*/
public function numberLookupResolve()
{
$code = trim((string) ($this->request->getPost('code') ?? $this->request->getGet('code') ?? ''));
$data = (new \App\Libraries\BagNumberLookup())->resolve($code, $this->lgIdx());
return $this->response->setJSON($data);
}
// ══════════════════════════════════════════════
// CRUD — 사이트 레이아웃으로 등록/처리 폼 제공
// ══════════════════════════════════════════════