Skip to content

[BE2-D] 결제·환불 관리자 화면 #25

Description

@yesung05

작업 내용

docs/백엔드_기능명세.md Module D 섹션 참고.

신규 파일: backend/api/admin/payments.py. backend/dao/payment_dao.py
get_payment_by_order_id, list_payments, mark_refunded 추가.
backend/schemas/payment_schemas.pyPaymentAdminOut 추가.

사용자측 결제(POST /api/payments)는 이미 완료되어 있으므로 건드리지 않는다.

API

Method Path 응답
GET /api/admin/payments (쿼리: status, date_from, date_to) list[PaymentAdminOut]
GET /api/admin/payments/{id} PaymentAdminOut
POST /api/admin/payments/{id}/refund {reason} PaymentAdminOut

★ 환불 시 반드시 함께 처리 (포인트·쿠폰 원상복구)

  • 적립 포인트 회수 + 사용(차감) 포인트 반환: adjust_points(db, order.user_id, -(order.points_earned - order.points_used))
  • 쿠폰 원상복구: order.user_coupon_id가 있으면 restore_coupon() 호출
  • Order.statusCANCELLED로 전이 — 이때는 [BE2-E] 주문 관리자 화면 (목록/상태 전이) #24(Module E)의 상태 전이 검증을 거치지 않고
    order_dao.update_order_status를 직접 호출 (완료된 주문도 환불 가능해야 함)
  • 이미 환불된 결제 재환불 시도 시 409 (중복 환불로 포인트 이중 회수되는 사고 방지)
  • current_points가 음수로 내려가는 것은 이번 스코프에서 허용 (하한 체크 없음)

완료 기준

  • 환불 처리 후 Payment.status=REFUNDED, Order.status=CANCELLED 동시 반영
  • 환불 후 고객 포인트가 "적립 회수 + 사용분 반환" 정확히 반영
  • 쿠폰을 쓴 주문 환불 시 해당 쿠폰이 재사용 가능 상태로 복구
  • 이미 환불된 결제 재환불 시도 시 409

참고

docs/백엔드_기능명세.md Module D. 선행 조건: #21(Module C의 adjust_points/mark_coupon_used/restore_coupon),
#24(Module E의 update_order_status). 문서상으로도 실제 착수 순서가 가장 나중인 모듈.

Metadata

Metadata

Assignees

Labels

admin관리자 화면/API 관련 작업phase2Phase 2: 백엔드 로직 보완 + 관리자 화면routerFastAPI 라우터

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions