Skip to content

Conversation

@MathToML
Copy link
Owner

🌱 SPEC 개요

SPEC 상세

  • ID: RECEIPT-004
  • 버전: 0.0.1 (INITIAL, draft)
  • 우선순위: medium
  • 의존성: RECEIPT-001, RECEIPT-002

주요 기능

  • 키워드 검색 (businessPurpose, 300ms debounce)
  • 카테고리 필터 (식비/교통/숙박/기타)
  • 날짜 범위 필터
  • 금액 범위 필터
  • 제출 상태 필터

🚧 구현 계획

TDD 단계

  1. RED: 실패하는 테스트 작성
  2. GREEN: 최소한의 코드로 테스트 통과
  3. REFACTOR: 코드 품질 개선

인수 기준

  • 복합 필터링 지원
  • 성능 최적화 (Debounce, 쿼리 제한)
  • 접근성 및 UX 고려

📄 생성된 문서

  • .moai/specs/SPEC-RECEIPT-004/spec.md: EARS 명세서
  • .moai/specs/SPEC-RECEIPT-004/plan.md: TDD 계획
  • .moai/specs/SPEC-RECEIPT-004/acceptance.md: 인수 기준

🔜 다음 단계

/alfred:2-build SPEC-RECEIPT-004를 통해 TDD 구현 시작

📋 체크리스트

  • 테스트 커버리지 85% 이상
  • Firestore 복합 인덱스 생성
  • 성능 최적화
  • 문서화 (Living Document)

🏷️ @tag 추적성


SPEC-First TDD 방법론에 따라 구현됩니다.

@tag:RECEIPT-001-GREEN

- Firebase 초기화 및 firebase_options.dart 생성
- GoRouter 기반 라우팅 시스템 구축 (/login, /, /upload)
- 익명 로그인 페이지 구현 (LoginPage)
- 인증 상태 기반 자동 리다이렉트
- ReceiptListPage: 로그아웃 버튼 및 FAB 네비게이션 추가
- ReceiptUploadPage: 뒤로가기 버튼 추가
- 기본 widget_test.dart 업데이트

변경 파일:
- lib/main.dart (완전 재작성)
- lib/firebase_options.dart (생성)
- lib/pages/receipt_list_page.dart
- lib/pages/receipt_upload_page.dart
- test/widget_test.dart
- firebase.json (Firebase CLI 생성)
@tag:RECEIPT-004-SPEC

## SPEC 개요
- ID: RECEIPT-004
- 버전: 0.0.1 (INITIAL, draft)
- 우선순위: medium
- 의존성: RECEIPT-001, RECEIPT-002

## 핵심 기능
- 키워드 검색 (businessPurpose, 300ms debounce)
- 카테고리 필터 (식비/교통/숙박/기타)
- 날짜 범위 필터
- 금액 범위 필터
- 제출 상태 필터

## 생성 파일
- .moai/specs/SPEC-RECEIPT-004/spec.md (EARS 명세서)
- .moai/specs/SPEC-RECEIPT-004/plan.md (TDD 계획)
- .moai/specs/SPEC-RECEIPT-004/acceptance.md (인수 기준)

## 다음 단계
/alfred:2-build SPEC-RECEIPT-004
@tag:RECEIPT-004-RED

## 테스트 파일 생성
- test/utils/receipt_filter_test.dart (256 LOC, 16개 테스트)
- test/utils/debounce_test.dart (91 LOC, 4개 테스트)

## 테스트 시나리오
### 필터링 로직 (receipt_filter_test.dart)
- 키워드 검색 (대소문자 구분 없음, businessPurpose 필드)
- 카테고리 필터 (식비/교통/숙박/기타)
- 날짜 범위 필터 (시작일 ~ 종료일)
- 금액 범위 필터 (최소 ~ 최대)
- 제출 상태 필터 (isSubmitted)
- 복합 필터 조합
- 입력 검증 (날짜/금액 범위)

### 디바운싱 (debounce_test.dart)
- 300ms 지연 타이머 검증
- 타이머 취소 검증
- 재입력 시 타이머 리셋
- dispose 시 타이머 정리

## TDD 단계
현재: RED (테스트 작성 완료, 실패 예상)
다음: GREEN (최소 구현으로 테스트 통과)

## SPEC 참조
.moai/specs/SPEC-RECEIPT-004/spec.md
@tag:RECEIPT-004-GREEN

## 구현 파일 (7개 신규, 3개 수정)

### 신규 생성
1. lib/utils/debounce.dart (25 LOC)
   - 300ms 디바운싱 유틸리티
   - Timer 기반 구현

2. lib/utils/receipt_filter.dart (95 LOC)
   - 클라이언트 사이드 필터링 로직
   - 7개 필터 옵션 지원

3. lib/pages/receipts/receipt_search_page.dart (231 LOC)
   - 메인 검색 페이지 UI
   - StreamBuilder 기반 실시간 필터링

4. lib/widgets/receipt_filter_widget.dart (207 LOC)
   - ReceiptFilterWidget (검색 폼)
   - ActiveFiltersBadge (활성 필터 표시)

### 수정
5. lib/services/firestore_service.dart (+25 LOC)
   - getReceiptsForSearch() 메서드 추가

6. lib/main.dart (+5 LOC)
   - /search 라우트 추가

7. pubspec.yaml (+1 LOC)
   - intl: ^0.20.2 추가

## 핵심 기능
- 키워드 검색 (300ms debounce, businessPurpose)
- 카테고리 필터 (식비/교통/숙박/기타)
- 날짜 범위 필터 (DatePicker)
- 금액 범위 필터 (최소~최대)
- 제출 상태 필터 (제출됨/대기중)
- 필터 초기화 버튼
- 활성 필터 배지 표시

## 기술 스택
- Firestore 쿼리 (100개 제한)
- 클라이언트 필터링 (키워드, 금액)
- Material 3 UI

## 테스트 결과
- 20개 테스트 모두 통과 ✅
- flutter analyze: 0 issues ✅

## TDD 단계
현재: GREEN (테스트 통과)
다음: REFACTOR (코드 품질 개선)
@tag:RECEIPT-004-DOCS

## 문서 동기화 내역
- SPEC 상태: draft → completed
- 버전: 0.0.1 → 0.1.0
- HISTORY 섹션 추가 (v0.1.0 구현 완료)

## 생성 파일
- .moai/indexes/tags-index.md (TAG 체인 매핑)
- .moai/reports/sync-report.md (동기화 보고서)

## TAG 체인 무결성
✅ @SPEC:RECEIPT-004 (1개)
✅ @test:RECEIPT-004 (2개, 20 tests)
✅ @code:RECEIPT-004 (5개)
✅ 고아 TAG 없음

## 구현 요약
- 키워드 검색 (300ms debounce)
- 카테고리 필터 (식비/교통/숙박/기타)
- 날짜 범위 필터
- 금액 범위 필터
- 제출 상태 필터
- 필터 초기화 기능
@MathToML MathToML marked this pull request as ready for review October 18, 2025 09:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants