01
개요Overview
종이·엑셀 대장 수기작성 방식을 대체합니다.
| 프로젝트명 | 국순당 소모품 구매신청 / 재고관리 앱 |
| 목적 | 부서별 소모품 구매신청 프로세스 전산화 + 재고 실시간 관리 |
| 개발환경 | Google AI Studio |
| 인증 / DB | Firebase (Authentication, Firestore) |
| 플랫폼 | 반응형 웹앱 (모바일 + PC) |
| 기존 방식 문제 | 종이·엑셀 대장 수기작성 → 이력 누락, 재고파악 지연, 취합 리포트 작업 과다 |
용어문서에서 쓰는 말
- PRD
- 제품요구사항문서. 앱이 해야 할 일을 정의한 문서.
- FS
- 기능명세서. PRD를 실제 개발 단위 기능으로 구체화한 문서.
- 고정품목
- 관리자가 미리 등록·관리하는 표준 소모품 목록.
- 추가품목
- 신청자가 신청 시점에 직접 새로 등록하는 품목. 해당 신청 건에만 한정됩니다.
- 탕비위생품목
- 관리자가 관리하는 탕비실·위생용품 전용 목록.
- 장바구니 신청
- 여러 품목을 한 번에 담아 하나의 신청 건으로 제출하는 방식.
02
대상 사용자Users & Roles
5개 부서, 2단계 권한 구조.
조직 구조Departments
생산지원팀양조1팀양조2팀품질보증팀설비기술팀
부서는 가입 시 본인이 선택하며, 신청·예산·통계의 기준 단위가 됩니다.
역할Role
| 역할 | 설명 |
|---|---|
| 일반회원 | 소모품 신청, 본인 신청현황 조회 |
| 관리자 | 회원승인, 신청처리(승인·거절·취소·구매완료), 재고관리, 예산관리, 리포트 |
관리자는 전체 부서 통합 권한을 가집니다. 최초 관리자 1명은 수동 생성하고, 이후에는 관리자가 다른 회원을 승격합니다.
03
사용자 시나리오User Scenarios
가입부터 리포트 출력까지의 동작 순서.
3-1회원가입 및 로그인
- 이메일로 회원가입(Firebase 이메일 인증), 도메인 제한 없음
- 가입 시 소속 부서 본인 선택
- 관리자 승인 전까지 앱 이용 불가(대기 상태)
- 승인 완료 시 알림 뱃지 수신, 로그인 가능
3-2소모품 신청 · 일반회원
- 품목 종류 선택 — 고정품목 / 추가품목 / 탕비위생품목
- 고정·탕비위생품목: 품목이름 또는 상품코드로 검색 후 선택
- 추가품목: 신규 품목정보 직접 입력, 고유번호 자동 생성(중복 방지)
- 품목·수량을 장바구니에 담아 한 번에 신청
- 단가 기준으로 신청금액 자동 계산
- 신청 완료 후 대기 상태로 등록
- 마이페이지에서 본인 신청현황·상태 확인
- 대기 상태 건은 본인이 직접 취소 가능
- 관리자 승인 시 알림 뱃지 수신
3-3신청 처리 · 관리자
- 부서별 통합 신청 현황 조회
- 신청 건(장바구니 단위) 처리
- 승인 — 구매예정 내역서 대상으로 이동
- 취소 — 반려 통보, 신청자가 수정 후 재제출 가능
- 거절 — 신청 삭제
- 부서별 월 예산 한도 설정, 초과 시 경고 표시
- 구매 완료 처리
- 입고수량 입력
- 재고수량 자동 차감(수동 수정·엑셀 일괄 입력 지원)
- 전체불출내역 데이터로 반영
3-4리포트 · 통계
- 부서별·품목별·기간별(주 / 월 / 분기 / 연) 통계를 표와 그래프로 확인
- 통합신청내역 부서별 엑셀 리포트 출력(월 지정 가능)
- 전체불출내역 PDF 리포트를 기간 선택 후 수동 생성·출력
04
핵심 기능 요구사항Core Requirements
9개 기능 영역.
4-1인증 · 회원관리
- Firebase 이메일 회원가입 / 로그인
- 가입 시 부서 선택 필수
- 관리자 승인 전 서비스 이용 제한
- 관리자 승격 기능(관리자가 관리자 지정)
- 퇴사자 계정 비활성화 — 신청이력은 보존, 삭제하지 않음
4-2품목 관리
- 고정 · 탕비위생품목 — 관리자 CRUD, 품목이름·상품코드·단위·단가 관리
- 추가품목 — 신청 시 생성, 고유번호 자동생성 로직 필요, 해당 신청 건에만 종속(공용목록 미등록)
4-3신청 기능
- 장바구니형 신청 — 여러 품목 동시 담기
- 금액 자동계산 — 단가 × 수량
- 상태 흐름 — 대기 → 승인 / 거절 / 취소
- 본인 취소는 대기 상태에서만 가능
- 신청현황 리스트 · 상세 조회
4-4승인 · 구매 프로세스
- 신청 건 단위 일괄 승인·거절·취소 (품목별 개별승인 없음)
- 승인 시 구매예정 내역서 자동 추가
- 구매완료 처리 시 입고수량 입력 → 전체불출내역 반영
4-5재고 관리
- 품목별 재고수량 관리 — 입고 · 사용 · 재고 자동계산
- 승인·구매완료 처리 시 재고 자동 차감
- 관리자 수동 수정 가능
- 엑셀 일괄 업로드로 재고 일괄 반영
- 최소재고 알림은 미적용(범위 제외)
4-6예산 관리
- 부서별 월 예산 한도 설정
- 초과 시 관리자 화면에 경고 표시
4-7알림
- 인앱 알림 뱃지 방식 (웹푸시 아님)
- 일반회원 — 승인 · 반려 · 거절 통보
- 관리자 — 신규 신청 발생 통보
4-8리포트 · 출력
- 통계 리포트 — 부서별 / 품목별 / 기간별 표 + 그래프
- 통합신청내역 엑셀 출력 (월 지정, 부서별)
- 전체불출내역 PDF 출력 (기간 선택, 수동 생성)
4-9데이터 정책
- 연도가 바뀌면 새 연도 문서로 초기화 — 과거 데이터는 조회만 가능하며 삭제하지 않습니다.
05
비기능 요구사항Non-functional
| 구분 | 내용 |
|---|---|
| 플랫폼 | 반응형 웹 (모바일 · PC 모두 지원) |
| 인증 | Firebase Authentication |
| 데이터저장 | Firebase Firestore |
| 보안 | 이메일 인증 + 관리자 승인 2중 게이트 (도메인 제한 없음) |
| 파일출력 | 엑셀(xlsx), PDF |
| 언어 | 한국어 |
06
범위 제외Out of Scope
이번 개발 범위에 포함하지 않습니다.
Not included
- 최소재고 미달 알림 기능
- 웹푸시 · 카카오톡 · 이메일 알림 (인앱 뱃지만 지원)
- 품목별 개별 승인 / 거절 (신청 건 단위만 지원)
- 신청 시 첨부파일 · 참고링크 첨부
- 추가품목의 공용목록 등록 (신청 건 한정 사용)
- 앱 내 실제 결제 · 구매 처리 (오프라인 구매 후 상태만 기록)
07
참고 자료References
PDF1_전체불출내역
부서별 소모품 불출대장 양식. 전체불출내역 리포트의 참고 양식입니다.
XLSX2_통합신청내역
연간 품목별·월별 구입량 및 금액 집계 양식. 통합신청내역 리포트의 참고 양식입니다.
01
시스템 구성Stack
| 영역 | 사용 기술 |
|---|---|
| 프론트엔드 | Google AI Studio 생성 웹앱 (반응형) |
| 인증 | Firebase Authentication — 이메일 / 비밀번호 |
| 데이터베이스 | Firebase Firestore |
| 파일 저장 | Firebase Storage (엑셀 업로드 등) |
| 엑셀 출력 | SheetJS (xlsx) |
| PDF 출력 | jsPDF 또는 html2pdf |
| 알림 | Firestore 기반 인앱 알림 컬렉션 (웹푸시 미사용) |
02
권한 매트릭스Permissions
O = 가능 · — = 불가
| 기능 | 일반회원 | 관리자 |
|---|---|---|
| 회원가입 / 로그인 | O | O |
| 회원 승인 | — | O |
| 회원 권한 승격 | — | O |
| 품목 신청 (고정 · 추가 · 탕비) | O | — |
| 본인 신청현황 조회 | O | O 전체 |
| 신청 취소 (대기 상태) | O 본인 | O 전체 |
| 신청 승인 / 거절 / 취소 처리 | — | O |
| 구매완료 처리 | — | O |
| 고정 · 탕비 품목 관리 (CRUD) | — | O |
| 재고 수동 수정 / 엑셀 업로드 | — | O |
| 부서 예산 설정 | — | O |
| 통계 리포트 조회 | — | O |
| 통합신청내역 엑셀 출력 | — | O |
| 전체불출내역 PDF 출력 | — | O |
03
데이터 모델Firestore Collections
7개 컬렉션.
users회원
| 필드 | 타입 | 설명 |
|---|---|---|
| uid | string | Firebase Auth UID |
| string | 이메일 | |
| name | string | 이름 |
| department | string | 소속부서 (5개 팀 중 1) |
| role | string | general | admin |
| status | string | pending | approved | disabled |
| createdAt | timestamp | 가입일 |
items고정 · 탕비위생품목
| 필드 | 타입 | 설명 |
|---|---|---|
| itemId | string | 상품코드 (고유값) |
| name | string | 품목명 |
| unit | string | 단위 (EA, 켤레, box 등) |
| price | number | 단가 |
| type | string | fixed | pantry |
| stockQty | number | 현재 재고수량 |
| minStockAlertYn | boolean | false 고정 (기능 미사용) |
| createdAt | timestamp | 등록일 |
| updatedAt | timestamp | 최종수정일 |
한 컬렉션에 담고
type으로 고정 / 탕비를 구분합니다.extraItems추가품목
| 필드 | 타입 | 설명 |
|---|---|---|
| extraItemId | string | 자동 생성 고유번호 (중복검사 포함) |
| requestId | string | 소속 신청 건 ID |
| name | string | 품목명 |
| unit | string | 단위 |
| price | number | 단가 (신청자 입력) |
신청 건에 종속됩니다. 공용목록에는 등록되지 않습니다.
requests신청 건 = 장바구니
| 필드 | 타입 | 설명 |
|---|---|---|
| requestId | string | 신청 건 ID |
| userId | string | 신청자 UID |
| department | string | 신청자 부서 |
| status | string | pending | approved | rejected | canceled | purchased |
| totalAmount | number | 신청금액 합계 (자동계산) |
| createdAt | timestamp | 신청일 |
| processedAt | timestamp | 관리자 처리일 |
| processedBy | string | 처리 관리자 UID |
| canceledReason | string | 취소(반려) 사유 |
| year | number | 귀속 연도 (연도 초기화 기준) |
requestItems신청 품목 라인
| 필드 | 타입 | 설명 |
|---|---|---|
| requestId | string | 상위 신청 건 ID |
| itemType | string | fixed | pantry | extra |
| itemId | string | items 또는 extraItems 참조 |
| itemName | string | 품목명 (스냅샷) |
| unitPrice | number | 단가 (스냅샷) |
| qty | number | 신청수량 |
| lineAmount | number | 단가 × 수량 |
| receivedQty | number | 구매완료 시 입고수량 |
단가·품목명은 스냅샷으로 저장해, 나중에 원본 품목이 바뀌어도 과거 신청 금액이 변하지 않습니다.
budgets부서별 월 예산
| 필드 | 타입 | 설명 |
|---|---|---|
| department | string | 부서명 |
| yearMonth | string | YYYY-MM |
| limitAmount | number | 예산 한도 |
| usedAmount | number | 사용(승인) 누적금액 |
notifications인앱 알림
| 필드 | 타입 | 설명 |
|---|---|---|
| userId | string | 수신자 UID |
| type | string | approved | rejected | canceled | newRequest |
| requestId | string | 관련 신청 건 |
| isRead | boolean | 읽음 여부 |
| createdAt | timestamp | 생성일 |
04
화면 목록Screens
일반회원 9개 · 관리자 13개.
9일반회원
- 로그인 / 회원가입 (부서 선택 포함)
- 승인대기 안내 화면
- 홈 — 신청하기 진입
- 품목 검색·선택 (고정 / 탕비위생 — 이름·상품코드 검색)
- 추가품목 등록 (품목명 · 단위 · 단가 · 수량)
- 장바구니 (담은 품목, 수량 수정, 합계금액)
- 신청 완료 화면
- 내 신청현황 리스트·상세 (상태 필터, 대기 건 취소)
- 알림함 (뱃지)
13관리자
- 회원 승인 관리 (가입대기 승인·거절)
- 회원 관리 (부서·권한 수정, 비활성화)
- 부서별 통합 신청 현황 대시보드
- 신청 상세·처리 (승인·거절·취소, 취소사유 입력)
- 구매예정 내역서 (승인된 건 목록)
- 구매완료 처리 (입고수량 입력 → 재고 자동반영)
- 품목 관리 (고정 · 탕비위생 CRUD)
- 재고 관리 (현재고 조회, 수동수정, 엑셀 업로드)
- 부서별 예산 설정
- 통계 리포트 (표 + 그래프, 기간 필터)
- 통합신청내역 엑셀 출력 (월 선택)
- 전체불출내역 PDF 출력 (기간 선택)
- 알림함 (뱃지)
05
상태 흐름Request Status Flow
신청 건 status의 전이 경로.
대기
pending
본인 취소
취소됨
canceled-by-user완전 종료
관리자 거절
거절
rejected완전 종료 · 신청 삭제 처리
관리자 취소 = 반려
반려
canceled신청자 수정 후 재제출
대기
pending 복귀
관리자 승인
승인
approved구매예정 내역서 등재 → 구매완료 처리 시 입고수량 입력
구매완료
purchased재고 자동 차감 + 전체불출내역 데이터 반영
06
주요 로직 명세Core Logic
6-1추가품목 고유번호 생성
- 규칙 —
EXT-{연도}-{일련번호 6자리}형태 등 기존items.itemId와 겹치지 않는 채번 - 신청 저장 시 extraItems 컬렉션에서 최대 일련번호 조회 후 +1, 트랜잭션으로 중복 방지
6-2신청금액 자동계산
lineAmount = unitPrice × qtyrequests.totalAmount = Σ requestItems.lineAmount
6-3예산 초과 체크
- 승인 시점에
budgets.usedAmount += totalAmount usedAmount > limitAmount이면 관리자 화면에 경고 배지 표시
승인 자체를 막지는 않습니다 — 경고만 노출합니다.
6-4재고 자동 차감
- 구매완료 시
stockQty = stockQty + receivedQty − approvedQty - 관리자가 화면에서 수동 수정 가능 (변경이력 로그 권장)
- 엑셀 일괄 업로드 시 상품코드 기준 매칭 후 일괄 갱신
6-5알림 트리거
| 이벤트 | 수신자 | 알림 타입 |
|---|---|---|
| 회원가입 발생 | 관리자 | newMember |
| 회원가입 승인 | 해당 회원 | memberApproved |
| 신규 신청 제출 | 관리자 | newRequest |
| 신청 승인 | 신청자 | approved |
| 신청 거절 | 신청자 | rejected |
| 신청 취소 (반려) | 신청자 | canceled |
6-6연도 초기화
- 매년 1월 1일 기준 신규
year값으로 신청·통계 데이터 구분 - 리포트·대시보드 기본 조회 범위는 당해 연도. 과거 연도는 별도 선택해 조회만 가능(수정 불가)
07
리포트 출력 명세Reports
7-1통합신청내역XLSX
- 시트 구성 — 고정품목 / 탕비실·위생용품 / 추가발주용품 섹션
- 컬럼 — NO, 품명, 상품코드, 단위, 단가, 1~12월 구입량·구입금액, 누계
- 출력 시 연도 및 월 범위 선택
- 부서 필터 선택 가능 (부서별 출력 지원)
2_통합신청내역.xlsx 양식 기준7-2전체불출내역PDF
- 부서별로 페이지 구성 (부서명 헤더 표시)
- 컬럼 — No, 날짜, 품목, 입고수량, 사용수량, 재고수량, 사용처, 비고
- 구매완료 처리된 신청 건 데이터를 기간 선택 후 수동 생성
1_전체불출내역.pdf 양식 기준7-3통계 리포트화면 + 엑셀
- 필터 — 부서, 품목, 기간 (주 / 월 / 분기 / 연)
- 표 — 선택 조건별 신청수량·금액 집계
- 그래프 — 기간별 추이(라인·바), 부서별 비중(파이·바)
- 엑셀 다운로드 지원
08
예외 · 에러 처리Edge Cases
| 상황 | 처리 |
|---|---|
| 재고보다 많은 수량 신청 | 신청 허용 (재고는 발주로 채워지는 구조). 단, 관리자 화면에 재고부족 표시 |
| 추가품목 중복 채번 | 트랜잭션 처리로 방지 |
| 승인 처리 중 예산초과 | 승인 가능, 경고만 노출 (강제 차단 아님) |
| 미승인 회원 로그인 | 승인대기 안내화면으로 리다이렉트 |
| 비활성화 계정 로그인 | 로그인 차단 안내 |
09
향후 검토Backlog
이번 범위 제외 · 후속 검토 대상.
Deferred
- 최소재고 미달 알림
- 웹푸시 · 이메일 알림 연동
- 품목별 개별 승인
- 신청 첨부파일 · 링크