[크레딧통합 PR1] DB 마이그레이션 — balance decimal 변환 + 데이터 이관

ID: e52b4db2-1665-4d52-abad-0e0953592423

높음 리뷰

## 설명
개인 크레딧(UserCredit)의 balance를 integer → decimal(10,1)로 변환하고, diagnosis_balance 잔액을 balance로 이관합니다.

### 마이그레이션 내용
1. `user_credits.balance`: integer → decimal(10,1), default: 0.0
2. `credit_transactions.amount`: integer → decimal(10,1)
3. `credit_transactions.balance_after`: integer → decimal(10,1)
4. 데이터 이관: `UPDATE user_credits SET balance = balance + (diagnosis_balance * 0.2)`
5. `UserCredit`에 `self.ignored_columns += ["diagnosis_balance"]` 추가 (2단계 제거 패턴)

### 주의사항
- migrate/rollback/migrate 3단계 검증 필수
- development DB 카운트 변동 없음 확인
- 기존 구매자 없으므로 이관 리스크 낮음

## 완료 기준
- [ ] 마이그레이션 migrate/rollback/migrate 통과
- [ ] `balance` 컬럼이 decimal(10,1) 타입
- [ ] `credit_transactions.amount/balance_after`가 decimal(10,1)
- [ ] 기존 데이터 이관 완료 (balance에 diagnosis_balance * 0.2 합산)
- [ ] `ignored_columns`에 diagnosis_balance 추가
- [ ] development DB 카운트 변동 없음

## 의존성
없음 (첫 번째 작업)

## 관련 파일
- `db/migrate/YYYYMMDD_unify_credit_balance.rb` (신규)
- `app/models/user_credit.rb`

첨부 이미지

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

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

담당자: 팀리드
생성일: 2026년 03월 30일 11:34

활동 로그

  • 팀리드 크레딧 통합 PR1~PR5 전체 구현 완료

    2026년 03월 30일 12:16:25

    상세 보기

    ## 수정된 기능
    - 2가지 개인 크레딧(리포트/진단) → 단일 크레딧으로 통합
    - 1크레딧 = 19,800원, 리포트=1.0, 심화진단=0.2, 추천보상=0.2
    - 워크스페이스 선물: 1크레딧 단위, 자기 선물 가능
    - diagnosis_balance 컬럼 DB에서 완전 제거

    ## 변경 규모
    - 39 파일, +187 / -1,030 lines
    - 삭제: DiagnosisCreditPurchaseService, DiagnosisCreditsController, 진단 크레딧 구매 뷰/JS

    ## UX/UI 검토 결과
    - 전체 평가: 기능적 통과, P2/P3 개선사항은 후속 작업
    - 선물 모달 2종 통합, 사이드바 단일 뱃지, 크레딧 대시보드 단일 잔액

    ## 테스트/보안 검증
    - 1635 runs, 13 failures, 8 errors (모두 크레딧 무관 기존 이슈)
    - 크레딧 관련 실패: 0건
    - add!에 lock! 추가 (race condition 방지)
    - BigDecimal 사용으로 부동소수점 오류 방지

    ## 해결된 문제
    - ConfirmationService 테스트가 workspace_id 분기 미반영 → 수정 완료
    - admin 뷰 하드코딩 한국어 → i18n 처리

    ## 남은 이슈
    - blog/posts Dangerous Send (크레딧 무관, 별도 티켓 필요)
    - Payment.diagnosis_credit enum 유지 (기존 레코드 3건 존재)

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

    2026년 03월 30일 11:53:49

  • 팀리드 크레딧 통합 작업 시작 - PR1~PR5 순차 진행

    2026년 03월 30일 11:41:25

    상세 보기

    ## 작업 계획
    - 목표: 2가지 개인 크레딧(리포트/진단)을 단일 크레딧으로 통합
    - 접근 방식: PR1→PR2→PR3→PR4→PR5 순차 진행 (의존성 체인)

    ## 현재 상태
    - 보드 현황: backlog 9 / todo 11 / in_progress 1 / review 9 / done 158
    - PR1: DB 마이그레이션 (balance decimal 변환)
    - PR2: 모델 통합
    - PR3: 서비스 통합
    - PR4: 컨트롤러/라우트 통합
    - PR5: 뷰/UI/i18n 통합

  • 팀리드 티켓 클레임 완료

    2026년 03월 30일 11:41:19

  • 팀리드 기능 계획 수립 — 크레딧 시스템 통합

    2026년 03월 30일 11:35:57

    상세 보기

    ## 기능 개요
    - 2가지 개인 크레딧(리포트/진단)을 단일 크레딧으로 통합
    - 1크레딧 = 19,800원 (세전 18,000원 + VAT 10%)
    - 강점 리포트 = 1.0 크레딧, 심화 진단 = 0.2 크레딧
    - 워크스페이스 → 개인 크레딧 선물 (자기 선물 포함)

    ## 분석 결과
    - 영향 범위: 모델 6개, 서비스 7개, 컨트롤러 5개, 뷰 11개, JS 1개, i18n 4언어
    - 삭제 대상: DiagnosisCreditPurchaseService, DiagnosisCreditsController, 진단 크레딧 구매 뷰/JS

    ## 생성된 티켓 (5개)
    1. [크레딧통합 PR1] DB 마이그레이션 (priority: high)
    2. [크레딧통합 PR2] 모델 통합 (priority: high)
    3. [크레딧통합 PR3] 서비스 통합 (priority: high)
    4. [크레딧통합 PR4] 컨트롤러/라우트 통합 (priority: high)
    5. [크레딧통합 PR5] 뷰/UI/i18n 통합 (priority: medium)

    ## 기술적 결정
    - balance: integer → decimal(10,1) (0.2 단위 차감)
    - diagnosis_balance: 2단계 제거 패턴 (ignored_columns → 별도 마이그레이션)
    - credit_type: 기존 이력 유지, 신규 "unified"
    - DiagnosisType#credit_cost로 진단별 차감량 캡슐화

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

    2026년 03월 30일 11:35:34