- 한 화면에서 기간·품목구분(봉투/음식물/폐기물)·집계방식·표시컬럼 선택, 제목 지정 후 조회/인쇄
- 컬럼 13종 선택, 상세/품목별 집계 지원, 실판매(bag_sale) 기준
- 계정별(mb_idx) 프리셋 저장/불러오기/삭제 (report_preset 테이블)
- report_preset 테이블 없으면 프리셋만 비활성, 리포트는 정상 동작
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
기존 전역 localStorage 방식(모든 메뉴 일괄 적용)을 화면 경로(메뉴키) 기준
계정별 DB 저장으로 변경. A−/A+ 조정 시 해당 화면만 조정·저장되고, 다음
방문·재로그인 시 각 화면의 저장값이 서버 주입으로 복원된다.
- member_menu_font_scale 테이블 + 저장 엔드포인트(bag/pref/font-scale)
- member_font_scale_for() 헬퍼로 렌더 시 현재 화면 저장값 주입
- admin/portal/embed 레이아웃 + 워크스페이스(탭 iframe)에 적용
· 워크스페이스는 포커스된 탭(메뉴)만 조정, 디바운스 저장으로 CSRF 경합 방지
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
공용 CI4 pager 템플릿(components/pager.php)을 페이지 번호 대신
무한 스크롤 방식으로 교체. 화면 하단 도달 시(IntersectionObserver) 다음
페이지 HTML을 받아 리스트 표에 이어붙이고, '더보기' 버튼을 폴백으로 둔다.
Config\Pager의 default 템플릿이라 전체 리스트 화면에 일괄 적용된다.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
관리자 레이아웃 body의 select-none 때문에 의견 본문을 선택·복사할 수 없던
문제를 opt-in 클래스(.fb-selectable)로 해제. 목록형·전체보기 화면에 적용하고,
목록형은 텍스트 선택 중 행 클릭 시 상세로 이동하지 않도록 가드 추가.
(의견 상세 화면은 이미 동일 방식으로 적용됨)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 발주 등록: 폼(좌)·발주품목 선택(우, 스크롤)·발주 이력(하단) 재배치, 수량→박스수량
- 발주담당(담당자) 선택 항목 추가(bo_manager_idx), 등록/변경 시 저장
- 발주 이력 발주일 클릭 → 발주 내역 보기 모달(변경/삭제 버튼), 삭제·취소 발주는 두 버튼 숨김
- 발주 변경: 변경구분 라디오 제거, 원 발주번호(LOT)·이력 안내 표시, 취소 시 발주 등록 화면으로 이동
- 발주 등록 화면에서도 삭제 가능(정상 발주만), 삭제 후 등록 화면 복귀
- 삭제 화면에서 삭제 대상 발주 내역 표시
- 발주 상세 JSON 엔드포인트(bag/order/detail-json) 추가
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 현재 필터(기간·판매소·대행소·카테고리·크기) 적용 결과 기준 집계
- 용량별(리터별): 크기 오름차순, 판매량·판매금액 합계
- 품목별: 봉투/음식물/폐기물 3분류, 판매량·판매금액 합계
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 리스트(좌)/상세정보(우) 좌우 배치, 상세를 라벨-값 폼 형태로 변경
- 리스트 컬럼(번호·대표자·상호·구군(동코드)·지정일·구역·상태) + 컬럼별 정렬
- 페이징 제거 → 전체 로드 후 패널 내 스크롤
- 주소로 동 기본코드(D) 산출해 저장·표시(ds_dong_code), 등록 시 주소 선택하면 동코드 표시
- 인쇄·엑셀저장을 관리 화면에도 추가(엑셀에 동코드·지정일 포함)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 메뉴/화면/매뉴얼 명칭을 '발주파일 생성'으로 변경(메뉴 rename 마이그레이션 SQL 포함)
- 발주파일(seed) 생성 전 '내용 확인' 미리보기 추가(암호화 전 발주 메타·품목 표시)
· GET bag/order/lot-seed/preview 신설, 생성/미리보기 데이터 구성 공용화
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 하위 메뉴를 다른 상위 메뉴 아래로 드래그해 재부모(상위 변경) 지원
- 순서+상위+깊이를 함께 저장하는 MenuModel::setStructure() 추가(자식수 재계산)
- 드래그 중 화면 상/하단 근처에서 자동 스크롤
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
의견 처리 상태 셀렉트박스에 '답변 완료'(answered) 옵션을 추가하고
목록 배지 색상(teal)을 지정한다. fb_status는 VARCHAR라 DB 변경 불필요.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
지정판매소 판매의 dev-saleable-barcodes API를 재사용해, 주문 선택 시
그 판매소·주문 기준의 판매 테스트용 바코드 후보를 표로 표시한다.
바코드를 클릭하면 봉투코드 스캔칸에 자동 입력되어 테스트가 쉬워진다.
스캔 성공 시 후보 목록도 갱신(판매된 팩 제외). 개발 완료 후 제거 예정.
지정판매소 판매의 스캔 로직(resolveDesignatedSaleBarcode 등)을 재사용해
전화접수 관리 화면에서 바로 봉투코드를 스캔하면:
- 접수 리스트에서 선택된 주문의 판매소로 즉시 판매처리(bag_sale 기록,
재고 차감, 팩/박스코드 sold 전환, 전량 판매 시 so_received=1)
- 해당 품목의 포장량(soi_packed_qty)에 스캔 수량 누적 반영(수정 불가 표시)
- 포장 명세를 실제 스캔한 봉투코드 내역(봉투코드·수량·팩/박스/낱장)으로 표시
- 라우트: POST bag/order/phone/manage/scan → Bag::phoneOrderManageScan (JSON, 즉시 처리)
- 잔량 한도는 접수량(soi_qty), 중복/미등록/재고없음 바코드 거부
- CSRF는 쿠키+regenerate 환경이라 응답에 새 토큰을 실어 다음 스캔에 갱신
- phoneOrderManage 페이로드에 주문별 스캔 내역(scans)·포장량 집계 포함
표가 화면에 맞는 높이(약 52vh)로 표시되고 나머지 품목은 스크롤로 보이게
한다. 스크롤 시 2행 그룹 헤더는 상단에, 합계 행은 하단에 sticky로 고정.
- 2번째 헤더행 top 오프셋은 JS가 첫 헤더행 offsetHeight로 계산(zoom 무관).
- 컨테이너 padding 제거로 헤더 위쪽 틈으로 행이 비치는 현상 방지.
table-layout: fixed + colgroup으로 전 컬럼 폭을 고정해, 판매수량
자릿수가 바뀌어도 다른 컬럼 위치가 좌우로 움직이지 않게 한다.
검증 중 발견해 함께 수정:
- "봉투종류" 컬럼을 width:auto로 두면 화면이 좁거나 텍스트 확대 시
0으로 찌부러지는 문제가 있어, 최장 품목명 실측 기준 고정폭(11rem)으로 변경.
- "구분" 컬럼(4.5rem)이 "음식물 스티커"·"대형폐기물 스티커" 라벨보다 좁아
옆 컬럼과 텍스트가 겹치던 문제를 8rem으로 넓혀 해결.
- 공간이 부족하면 기존 overflow-auto로 표 전체가 가로 스크롤된다.
h-full로 데이터 행을 늘려 표를 꽉 채우던 방식이, 행이 2~3개뿐일 때
각 행을 400px 이상으로 늘려버려 오히려 어색했다. h-full을 제거해
행 높이는 상단부터 항상 일정한(원래) 크기로 표시되고, 남는 공간은
빈 공간으로 유지되도록 되돌린다. 카드 높이 동기화(syncListHeight)는
그대로 유지되어 카드 간 높이 불일치는 계속 없다.
- /admin/feedback/all: 모든 의견을 상세 클릭 없이 전체 내용+첨부이미지로
세로 나열, 상단 빠른이동 앵커(#fb-{id})로 특정 건 바로 스크롤
- 각 항목에 상태·메모 인라인 저장 폼 포함(저장 후 같은 위치로 복귀)
- 목록형(index) 화면에 "전체보기(스크롤)" 링크 추가
- #5/#6/#12 전화 주문 접수: 판매수량 입력 중 엔터키 → 다음 봉투 종류 수량칸으로 이동
- #7 주문접수 관리: 배달일을 접수일 이전으로 변경 불가(클라이언트 min + 서버 검증)
- #9 주문접수 관리: 주문수정저장·영수증출력·주문취소 버튼을 접수품목내역 타이틀 옆으로 이동
- #10 주문접수 관리: 접수리스트 하단에 건수·금액 합계 표시(취소 제외)
- #13 전화 주문 접수: 접수표 행·열 간격 축소(한 화면 표시)
- #14 주문접수 관리: 포장명세 봉투종류~봉투코드 컬럼 간격 조정
- #16 판매대장: 품목 필터 순서 변경(일반용→재사용→공공용→음식물→폐기물)
- #18 재고 현황: 종류~계 사이 간격 축소(표 최대폭 제한)
- #20/#21 주문접수 관리: 화면명 '주문접수 관리'로 변경, 조회 기준 배달일→접수일,
기본 조회일=오늘(초기화 시 당일), 접수번호 매일 1번부터 시작
- #23 담당자 구분 라벨 '구·군' → '지자체'
- 그리드 items-start 제거 → 접수 리스트 카드가 지정판매소 정보 카드와 같은 높이로 정렬
- 접수 리스트 카드를 flex 컬럼으로, 스크롤 영역을 flex-1 min-h-0로 하여 카드 높이를 꽉 채움
- 리스트 테이블에 h-full 적용 → 데이터 행이 적을 때 행 높이가 늘어나 표 하단 공백 제거(많을 땐 스크롤)
- 접수 리스트(전화) 카드를 넓게, 지정판매소 정보 카드를 좁게 비율 조정
- 접수 품목 내역/포장 명세 표 헤더를 sticky 처리하고 높이를 행 4개 기준으로 고정
- 그리드 items-start 적용해 접수 리스트 카드 하단 빈 공간 제거
- 포장 명세 품목을 soi_idx 내림차순으로 정렬
.data-table thead th { background: transparent } 규칙이 Tailwind bg-gray-50 클래스보다
CSS 우선순위가 높아 헤더가 투명해짐 → 스크롤 시 아래 행 텍스트가 헤더와 겹쳐 보임.
인라인 style로 배경을 강제 지정해 해결.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- export_*: 모든 엑셀/CSV 다운로드를 'export' 액션으로 자동 기록(파일명 포함)
- 인쇄: 레이아웃 beforeprint beacon → bag/activity/print-log 가 'print' 액션 기록(화면·경로)
- 활동 로그 뷰어에 엑셀 다운로드/인쇄 라벨·배지·필터·요약 추가
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- '내용' 컬럼: 대상명+작업(예: 업체 'OO' 수정), 변경 항목(라벨: 전→후) 인라인 표시
- 로그인(member housekeeping 수정)은 '로그인'으로 구분 표시
- 컬럼 한글 라벨(정확매칭+접미사 추정), 레코드 이름 자동 추출
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Auditable 트레잇: 모델 insert/update/delete 시 activity_log 자동 기록
(조회 제외, before/after JSON, 민감필드 마스킹, 사용자/IP)
- 도메인 모델 28개에 적용 (로그성 테이블 제외)
- 관리자 전용 조회: Admin\ActivityLog (기간/작업/대상/사용자 필터 + 상세 변경내역)
- 라우트 admin/access/activity-logs(+상세), 메뉴 '활동 로그' 추가
- 테넌트 분리: 슈퍼=전체, 지자체관리자=소속 지자체만
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 로그인 페이지에 캐시 금지 헤더(no-store) 추가 → 뒤로가기 시 서버 재요청
- bfcache 복원(pageshow persisted) 시 새로고침 → 로그인 상태면 대시보드로 리다이렉트
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>