[할인코드확장 PR1] DB 마이그레이션 + 모델 — apply_scope enum + discount_code_items polymorphic

ID: eb6864dd-352e-4798-a21e-472af05f4834

높음 완료

## 목표
할인코드 적용 범위를 Product 전용에서 Expert::Course + Study::Course까지 확장하기 위한 DB/모델 기반 작업

## 변경 사항

### 마이그레이션 1: add_apply_scope_to_discount_codes
- discount_codes 테이블에 apply_scope string 컬럼 추가 (default: "all", null: false)
- 데이터 이관: applies_to_all: true → apply_scope: "all", false → "specific"
- applies_to_all 컬럼은 아직 제거하지 않음 (ignored_columns 먼저)

### 마이그레이션 2: create_discount_code_items
- discount_code_items 테이블 생성: discount_code_id(FK), discountable_type(string), discountable_id(uuid)
- 복합 유니크 인덱스: [discount_code_id, discountable_type, discountable_id]
- discount_code_products 데이터를 discount_code_items로 이관 (discountable_type: "Product")

### 모델
- DiscountCodeItem 모델 생성 (polymorphic belongs_to :discountable)
- DiscountCode: apply_scope enum (all/report/education/specific), ignored_columns += ["applies_to_all"]
- DiscountCode#applicable_to? 로직 변경: scope 기반

## 완료 기준
- [ ] 마이그레이션 up/down 정상 동작
- [ ] 기존 데이터 이관 정상
- [ ] DiscountCode apply_scope enum 동작
- [ ] DiscountCodeItem polymorphic 연관 동작
- [ ] 기존 테스트 전수 통과
- [ ] 새 모델 테스트 추가

## 관련 파일
- app/models/discount_code.rb
- app/models/discount_code_product.rb
- 신규: app/models/discount_code_item.rb
- test/models/discount_code_test.rb
- test/fixtures/discount_codes.yml

첨부 이미지

이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)

JPEG, PNG, GIF, WebP / 최대 10MB

담당자: 미배정
생성일: 2026년 04월 15일 08:04

활동 로그

  • 팀리드 상태 변경: 리뷰 → 완료

    2026년 04월 15일 08:37:44

  • 팀리드 상태 변경: 진행 중 → 리뷰

    2026년 04월 15일 08:12:36

  • 팀리드 상태 변경: 백로그 → 진행 중

    2026년 04월 15일 08:07:17

  • 팀리드 기능 계획 수립 - 할인코드 적용 범위 확장

    2026년 04월 15일 08:04:55

    상세 보기

    ## 기능 개요
    - 할인코드 적용 범위를 Product(report/credit_pack)에서 Expert::Course(교육프로그램) + Study::Course(온라인강좌)까지 확장
    - apply_scope enum (all/report/education/specific) + polymorphic discount_code_items 조인테이블

    ## 분석 결과
    - 영향 범위: 모델 3개, 서비스 4개, 컨트롤러 3개, 뷰 2개, 마이그레이션 2개
    - 기존 패턴: string enum, Result 패턴 (Data.define), Payments::CheckoutService 재사용
    - 핵심: CheckoutService가 이미 discount_amount/discount_code_id 지원 → Expert 연동 간단

    ## 생성된 티켓 (5개)
    1. [할인코드확장 PR1] DB + 모델 (priority: high)
    2. [할인코드확장 PR2] ValidationService (priority: high)
    3. [할인코드확장 PR3] Expert/Study 서비스 (priority: high)
    4. [할인코드확장 PR4] Admin UI (priority: medium)
    5. [할인코드확장 PR5] 결제 UI + 정리 (priority: medium)

    ## 리스크
    - 기존 할인코드 깨짐 → ignored_columns + 기존 테스트 전수 통과로 방어
    - 데이터 이관 → 마이그레이션 트랜잭션 + 롤백 검증

    ## 기술적 결정
    - applies_to_all → apply_scope string enum (프로젝트 컨벤션 일관성)
    - 2단계 제거 패턴 (ignored_columns → 컬럼 삭제)
    - polymorphic 조인테이블로 Product/Expert::Course/Study::Course 통합

  • 팀리드 상태 변경: 할 일 → 백로그

    2026년 04월 15일 08:04:37