- 매뉴얼: 전체 검색 박스(slug별 hit 카운트·스니펫)와 본문 하이라이트 추가
- ManualRenderer::plainText()/search(), Bag::manualSearch(), bag/manual/search 라우트
- 사이드바 소메뉴 선택 아이콘 변경: 닫기처럼 보이던 × → ▸, + → · (정적/동적 일관)
- 워크스페이스: 탭 목록을 sessionStorage에 저장·복원
- 관리자 페이지 이동 후 복귀·새로고침해도 열어둔 탭 유지(세션 범위)
- 복원으로 무의미해진 beforeunload 새로고침 경고 제거
- e2e: 관리자 이동 후 탭 복원 케이스 추가
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 매뉴얼: 화면(소메뉴)별 용어·버튼·필드 설명으로 확장 + 기본정보 페이지 신규,
개요에 용어 사전 추가 (종량제 지식 없는 사용자 대상)
- "이 화면 설명" 버튼: 화면 경로→매뉴얼 매핑(Config\Manual::screenHelp,
manual_help_url_for_path). 워크스페이스 탭은 새 탭으로, 직접 페이지는 새 창으로
- 워크스페이스: 개별 탭 새로고침(↻) 버튼, 탭 2개 이상일 때만 새로고침 경고,
사이드바 하단 링크(매뉴얼 등)도 탭으로 열기
- 임베드: 탭 내 링크/폼 embed 유지(중첩 헤더 방지), 매뉴얼 리다이렉트 embed 유지
- 사이드바 하단: 종합그래프 → 사용자 매뉴얼 링크
- 최근 방문 메뉴: embed 페이지에도 방문 기록, 대시보드는 storage 이벤트로 실시간 갱신
- E2E qa_sweep 추가(주요 화면 콘솔/오버레이/매뉴얼/도움말 매핑 점검)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- /workspace: 헤더+사이드바+탭바+iframe 패널. 메뉴 클릭=탭 열기,
전환해도 폼·스크롤·조회결과 등 작업 상태 유지(세션 동안)
- 로그인 후 / = 워크스페이스(첫 탭=대시보드). iframe 내부는 임베드 렌더
- 임베드 레이아웃(bag/layout/embed): 헤더·사이드바 없이 본문만
- 임베드 판정: ?embed=1 또는 Sec-Fetch-Dest=iframe (iframe 내 링크·폼·
리다이렉트까지 중첩 크롬 없이 처리)
- iframe 안 세션만료 시 상위 창을 로그인으로 전환(auth/_shell)
- 포털 헤더에 워크스페이스 진입 링크, E2E(workspace.spec) 추가
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 카카오 지도(지도 2/3 + 판매소 목록 1/3, 높이 고정·스크롤), 목록 클릭 시 줌인
- 지오코딩 폴백(정밀→도로명→지번→키워드→행정동)으로 마커 표시
- 메뉴검색: 자동완성 드롭다운 + 기본 "최근 방문 메뉴"(localStorage, 뒤로가기/bfcache 갱신)
- 메뉴검색 박스 녹색(#009688), 지도와 높이 일치
- resolveLgLabel: 선택 지자체 실제 이름 사용, '(데모)' 문구 제거
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 사이트 업무 페이지: 공통 셸 bag/layout/portal(헤더+대메뉴 클릭+좌측 사이드바 소메뉴)
- 관리자 페이지: admin/layout 을 동일 포털 셸로 재작성(관리자 메뉴 트리, 폴백)
- 메인(/): gov-portal 대시보드, 종량제 실데이터만(재고/주문/승인/활동로그)
- 로그인/회원가입/2차인증/TOTP: 공통 auth/_shell 로 통일, 사이트 공통 로고
- 버튼색 통일: btn-search 등 주요 버튼을 #243a5e(메뉴바 네이비보다 살짝 밝게),
밝은 파랑 채움 버튼(#2b4c8c/#1e548a)도 동일 색으로
- gov_portal_nav_context() 임의 메뉴 트리 수용, 업무 셸은 실제 bag/* 링크 유지
- Admin\Menu 권한거부 리다이렉트 admin/dashboard(404) → admin 수정
- E2E redesign.spec.js 추가, 기능 무변경
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
실사 저장값이 페이지 이동 후 원복되지 않도록 저장/조회 경로를 보강하고, 코드 범위 보정과 bis 간 동기화를 추가했다. 또한 메뉴 관리를 레벨4 이상으로 제한하고 메뉴 변경 사항을 모든 지자체에 일괄 반영하도록 동기화 로직을 도입했다.
Made-with: Cursor
Add config and server-level DB identity fields (host/port/user, @@hostname/@@port/@@version) to packaging-units db_diag so production can verify the exact runtime DB endpoint.
Capture detailed runtime context when /bag/code-kinds and /bag/code-details fail so production logs reveal the exact exception source and request/session scope.
Preserve the selected site mt_idx in the UI and use a separate effective mt_idx for data fallback, so choosing site no longer appears as admin.
Made-with: Cursor
CT-01: 페이지네이션
- 커스텀 Tailwind 페이저 뷰 (components/pager.php)
- 18개 admin 컨트롤러 findAll() → paginate(20) 전환
- Bag 컨트롤러 7개 리스트도 paginate 적용
- 19개 admin index 뷰에 페이저 링크 추가
CT-02: 엑셀 저장
- export_helper.php (UTF-8 BOM CSV)
- 발주/판매/지정판매소/재고 4개 엑셀 내보내기 라우트+메서드
- 해당 뷰에 "엑셀저장" 버튼 추가
CT-03: 인쇄
- print_header.php (지자체명/제목/결재란 컴포넌트)
- admin/bag 레이아웃에 @media print CSS 추가
- 23개 뷰에 인쇄 버튼 + print_header 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- /bag/inventory/adjust: 재고 수량 조정 (실사 설정/증가/감소)
- 재고 관리 페이지에 "재고 조정" 버튼 추가
- 봉투 수불 관리에 입고/판매/불출 바로가기 버튼 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Bag 컨트롤러에 create/store 메서드 추가 (불출/발주/입고/판매/주문)
- bag용 create 뷰 5개 생성 (form action을 /bag/*로 변경)
- 모든 등록/취소 버튼을 /admin/* → /bag/*로 변경
- 사이트 레이아웃이 CRUD 전체에서 유지됨
- playwright.production.config.js 추가 (도메인 테스트용)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Bag 컨트롤러 신규 (기본정보/발주입고/불출/재고/판매/판매현황/수불/통계/창/도움말)
- 사이트 공통 레이아웃 bag/layout/main.php 추출
- /bag/* 라우트 10개 등록 (Routes.php)
- bag-site.spec.js E2E 테스트 11개 추가
- Playwright timeout 30s→60s, waitForURL 15s→30s
- P4 지자체관리자 접근 테스트 3개로 분리
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- SalesReport 컨트롤러 (판매대장, 일계표, 기간별판매, 수불현황)
- 판매대장: 일자별/기간별 모드 전환, 판매소별 품목 집계
- 일계표: 당일 판매 + 당월 누계 병렬 표시
- 기간별 판매현황: 품목별 판매/반품/합계 + 총합계
- 봉투 수불현황: 현재재고/입고/판매/불출 4섹션 그리드 레이아웃
- E2E 테스트 6개 전체 통과
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- P2-19: LocalGovernment edit/update/delete 추가, 목록에 수정/비활성 버튼
- P2-20: PasswordChange 컨트롤러 + View (현재 비밀번호 검증 후 변경)
- P2-21: 로그인 5회 연속 실패 시 30분 lock
- member 테이블에 mb_login_fail_count, mb_locked_until 컬럼 추가
- Auth::login에 lock 체크/실패 카운트 증가/성공 시 리셋 로직
- E2E 테스트 4개 전체 통과
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 4개 테이블 생성 (sales_agency, manager, company, free_recipient)
- 4개 Model + 4개 Controller + 12개 View
- 담당자: 소속(S)/직위(T) 코드 연동
- 업체: 협회/제작업체/회수업체 유형 분류
- 무료대상자: 무상지급구분(H)/동코드(D) 연동
- 모두 지자체별 멀티테넌시 적용
- 24개 라우트 추가
- E2E 테스트 9개 전체 통과
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- packaging_unit, packaging_unit_history 테이블 생성
- PackagingUnitModel, PackagingUnitHistoryModel
- PackagingUnit 컨트롤러 (목록/등록/수정/삭제/이력)
- 박스당팩수 x 팩당낱장수 = 총낱장수 자동 계산
- 변경 시 자동 이력 기록
- E2E 테스트 3개 전체 통과
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- bag_price, bag_price_history 테이블 생성
- BagPriceModel, BagPriceHistoryModel
- BagPrice 컨트롤러 (목록/등록/수정/삭제/이력)
- 단가 변경 시 자동 이력 기록 (트랜잭션)
- 기간 필터 조회 (적용시작일/종료일)
- 봉투코드(O) 드롭다운 연동
- E2E 테스트 5개 전체 통과
- 스크린샷 2개 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CodeKindModel + CodeKind 컨트롤러 (목록/등록/수정/삭제)
- CodeDetailModel + CodeDetail 컨트롤러 (종류별 세부코드 CRUD)
- View: code_kind/(index,create,edit), code_detail/(index,create,edit)
- 라우트: /admin/code-kinds/*, /admin/code-details/*
- E2E 테스트 7개 전체 통과
- 스크린샷 2개 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>