Product Requirements & Functional Spec

국순당 소모품 구매신청 및 재고관리 앱부서별 구매신청 프로세스 전산화 · 재고 실시간 관리

Google AI Studio Firebase Auth + Firestore 반응형 웹 (모바일 · PC) 한국어
01

개요Overview

종이·엑셀 대장 수기작성 방식을 대체합니다.

프로젝트명국순당 소모품 구매신청 / 재고관리 앱
목적부서별 소모품 구매신청 프로세스 전산화 + 재고 실시간 관리
개발환경Google AI Studio
인증 / DBFirebase (Authentication, Firestore)
플랫폼반응형 웹앱 (모바일 + PC)
기존 방식 문제종이·엑셀 대장 수기작성 → 이력 누락, 재고파악 지연, 취합 리포트 작업 과다

용어문서에서 쓰는 말

PRD
제품요구사항문서. 앱이 해야 할 일을 정의한 문서.
FS
기능명세서. PRD를 실제 개발 단위 기능으로 구체화한 문서.
고정품목
관리자가 미리 등록·관리하는 표준 소모품 목록.
추가품목
신청자가 신청 시점에 직접 새로 등록하는 품목. 해당 신청 건에만 한정됩니다.
탕비위생품목
관리자가 관리하는 탕비실·위생용품 전용 목록.
장바구니 신청
여러 품목을 한 번에 담아 하나의 신청 건으로 제출하는 방식.
02

대상 사용자Users & Roles

5개 부서, 2단계 권한 구조.

조직 구조Departments

생산지원팀양조1팀양조2팀품질보증팀설비기술팀
부서는 가입 시 본인이 선택하며, 신청·예산·통계의 기준 단위가 됩니다.

역할Role

역할설명
일반회원소모품 신청, 본인 신청현황 조회
관리자회원승인, 신청처리(승인·거절·취소·구매완료), 재고관리, 예산관리, 리포트
관리자는 전체 부서 통합 권한을 가집니다. 최초 관리자 1명은 수동 생성하고, 이후에는 관리자가 다른 회원을 승격합니다.
03

사용자 시나리오User Scenarios

가입부터 리포트 출력까지의 동작 순서.

3-1회원가입 및 로그인

  1. 이메일로 회원가입(Firebase 이메일 인증), 도메인 제한 없음
  2. 가입 시 소속 부서 본인 선택
  3. 관리자 승인 전까지 앱 이용 불가(대기 상태)
  4. 승인 완료 시 알림 뱃지 수신, 로그인 가능

3-2소모품 신청 · 일반회원

  1. 품목 종류 선택 — 고정품목 / 추가품목 / 탕비위생품목
  2. 고정·탕비위생품목: 품목이름 또는 상품코드로 검색 후 선택
  3. 추가품목: 신규 품목정보 직접 입력, 고유번호 자동 생성(중복 방지)
  4. 품목·수량을 장바구니에 담아 한 번에 신청
  5. 단가 기준으로 신청금액 자동 계산
  6. 신청 완료 후 대기 상태로 등록
  7. 마이페이지에서 본인 신청현황·상태 확인
  8. 대기 상태 건은 본인이 직접 취소 가능
  9. 관리자 승인 시 알림 뱃지 수신

3-3신청 처리 · 관리자

  1. 부서별 통합 신청 현황 조회
  2. 신청 건(장바구니 단위) 처리
    • 승인 — 구매예정 내역서 대상으로 이동
    • 취소 — 반려 통보, 신청자가 수정 후 재제출 가능
    • 거절 — 신청 삭제
  3. 부서별 월 예산 한도 설정, 초과 시 경고 표시
  4. 구매 완료 처리
    • 입고수량 입력
    • 재고수량 자동 차감(수동 수정·엑셀 일괄 입력 지원)
    • 전체불출내역 데이터로 반영

3-4리포트 · 통계

  1. 부서별·품목별·기간별(주 / 월 / 분기 / 연) 통계를 표와 그래프로 확인
  2. 통합신청내역 부서별 엑셀 리포트 출력(월 지정 가능)
  3. 전체불출내역 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 = 가능 · — = 불가

기능일반회원관리자
회원가입 / 로그인OO
회원 승인O
회원 권한 승격O
품목 신청 (고정 · 추가 · 탕비)O
본인 신청현황 조회OO 전체
신청 취소 (대기 상태)O 본인O 전체
신청 승인 / 거절 / 취소 처리O
구매완료 처리O
고정 · 탕비 품목 관리 (CRUD)O
재고 수동 수정 / 엑셀 업로드O
부서 예산 설정O
통계 리포트 조회O
통합신청내역 엑셀 출력O
전체불출내역 PDF 출력O
03

데이터 모델Firestore Collections

7개 컬렉션.

users회원

필드타입설명
uidstringFirebase Auth UID
emailstring이메일
namestring이름
departmentstring소속부서 (5개 팀 중 1)
rolestringgeneral | admin
statusstringpending | approved | disabled
createdAttimestamp가입일

items고정 · 탕비위생품목

필드타입설명
itemIdstring상품코드 (고유값)
namestring품목명
unitstring단위 (EA, 켤레, box 등)
pricenumber단가
typestringfixed | pantry
stockQtynumber현재 재고수량
minStockAlertYnbooleanfalse 고정 (기능 미사용)
createdAttimestamp등록일
updatedAttimestamp최종수정일
한 컬렉션에 담고 type으로 고정 / 탕비를 구분합니다.

extraItems추가품목

필드타입설명
extraItemIdstring자동 생성 고유번호 (중복검사 포함)
requestIdstring소속 신청 건 ID
namestring품목명
unitstring단위
pricenumber단가 (신청자 입력)
신청 건에 종속됩니다. 공용목록에는 등록되지 않습니다.

requests신청 건 = 장바구니

필드타입설명
requestIdstring신청 건 ID
userIdstring신청자 UID
departmentstring신청자 부서
statusstringpending | approved | rejected | canceled | purchased
totalAmountnumber신청금액 합계 (자동계산)
createdAttimestamp신청일
processedAttimestamp관리자 처리일
processedBystring처리 관리자 UID
canceledReasonstring취소(반려) 사유
yearnumber귀속 연도 (연도 초기화 기준)

requestItems신청 품목 라인

필드타입설명
requestIdstring상위 신청 건 ID
itemTypestringfixed | pantry | extra
itemIdstringitems 또는 extraItems 참조
itemNamestring품목명 (스냅샷)
unitPricenumber단가 (스냅샷)
qtynumber신청수량
lineAmountnumber단가 × 수량
receivedQtynumber구매완료 시 입고수량
단가·품목명은 스냅샷으로 저장해, 나중에 원본 품목이 바뀌어도 과거 신청 금액이 변하지 않습니다.

budgets부서별 월 예산

필드타입설명
departmentstring부서명
yearMonthstringYYYY-MM
limitAmountnumber예산 한도
usedAmountnumber사용(승인) 누적금액

notifications인앱 알림

필드타입설명
userIdstring수신자 UID
typestringapproved | rejected | canceled | newRequest
requestIdstring관련 신청 건
isReadboolean읽음 여부
createdAttimestamp생성일
04

화면 목록Screens

일반회원 9개 · 관리자 13개.

9일반회원

  1. 로그인 / 회원가입 (부서 선택 포함)
  2. 승인대기 안내 화면
  3. 홈 — 신청하기 진입
  4. 품목 검색·선택 (고정 / 탕비위생 — 이름·상품코드 검색)
  5. 추가품목 등록 (품목명 · 단위 · 단가 · 수량)
  6. 장바구니 (담은 품목, 수량 수정, 합계금액)
  7. 신청 완료 화면
  8. 내 신청현황 리스트·상세 (상태 필터, 대기 건 취소)
  9. 알림함 (뱃지)

13관리자

  1. 회원 승인 관리 (가입대기 승인·거절)
  2. 회원 관리 (부서·권한 수정, 비활성화)
  3. 부서별 통합 신청 현황 대시보드
  4. 신청 상세·처리 (승인·거절·취소, 취소사유 입력)
  5. 구매예정 내역서 (승인된 건 목록)
  6. 구매완료 처리 (입고수량 입력 → 재고 자동반영)
  7. 품목 관리 (고정 · 탕비위생 CRUD)
  8. 재고 관리 (현재고 조회, 수동수정, 엑셀 업로드)
  9. 부서별 예산 설정
  10. 통계 리포트 (표 + 그래프, 기간 필터)
  11. 통합신청내역 엑셀 출력 (월 선택)
  12. 전체불출내역 PDF 출력 (기간 선택)
  13. 알림함 (뱃지)
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 × qty
  • requests.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

  • 최소재고 미달 알림
  • 웹푸시 · 이메일 알림 연동
  • 품목별 개별 승인
  • 신청 첨부파일 · 링크