적립/카드 혜택 게시판

상품권 탭 정보 설명

상품권 탭의 “마일리지 특화” 전체 흐름(카드 생성 → 구매(Lot) → 판매(Sale) → 대시보드 집계)

1) 진입점: 상품권 탭(상단 탭: 정보/지도/시세) + 하단 플로팅 액션 버튼(FAB)
상품권 탭에 들어가면 상단에 정보 / 지도 / 시세 탭이 있고, 정보 탭에서만 FAB(둥근 버튼)를 눌러 아래 액션들을 띄웁니다.
카드 생성, 상품권 구매, 상품권 판매
(부가) 지점 생성 / 구매처 생성

“카드 생성 → 구매 → 판매” 흐름은 상품권 탭의 FAB 메뉴에서 시작됩니다.


2) 카드 생성(= “마일리지 규칙”을 만드는 단계)
사용자가 입력하는 값(카드 규칙)
카드 생성 화면에서 다음을 입력합니다.
cardId: 예) lotte_basic (소문자/숫자/_만)
카드/카드사 이름: 예) 롯데
신용카드: 1마일 원가(원): 예) 1000
체크카드: 1마일 원가(원): 예) 1500
메모(선택)
여기서 핵심은 “적립률 %”가 아니라, 앱 내부에서는 1마일을 얻기 위해 얼마를 써야 하는가(원/마일) 형태로 규칙을 저장한다는 점입니다.
(그래서 이후에 “마일 원가”, “원/마일” 지표로 계산이 이어집니다.)


3) 상품권 구매 입력 = Lot 생성(재고/원가의 출발점)

구매는 앱에서 “Lot(로트)”라는 단위로 쌓입니다.
한 번에 같은 조건으로 산 상품권 묶음(브랜드+결제수단+매입가+수량 등)을 1개 Lot으로 봅니다.

3-1. 구매 화면에서 입력하는 값

상품권 선택: 목록에서 선택
카드 선택: 방금 만든 카드 중 선택 (필수)
구매처(선택): 선택 가능
결제 수단: 신용 / 체크 중 선택 (중요: 나중에 어떤 마일 규칙(신용/체크)을 쓸지 결정)
구매일
액면가(faceValue): 기본 옵션(1만/5만/10만/50만 등)
수량(qty)
매입가(권당, buyUnit)
할인율(discount)
매입가
할인율은 서로 연동됩니다(하나 바꾸면 다른 값이 자동 계산).
메모

3-2. 포인트(“마일리지 특화”의 연결고리)
구매 시점에는 “마일”을 바로 확정 저장하지 않습니다.
대신 나중 판매 단계에서: 이 구매의 cardId, payType(신용/체크), 총 매입금액
이 3가지를 이용해 마일을 계산합니다.

4) 상품권 판매 입력 = 판매 생성(마일/손익 계산이 발생하는 지점)
판매 화면에서는 “판매 건(Sale)”을 만들고, 이때부터 마일/손익/원가(원/마일) 계산이 확정됩니다.

4-1. 판매 화면의 첫 단계: “어떤 구매를 팔 건지” 선택
판매 화면은 먼저 status == open 인 구매 목록만 불러옵니다.
사용자는 그 중 1개 구매를 선택합니다.
구매를 선택하면 기본 판매 수량이 구매의 전체 수량(qty) 으로 자동 채워집니다.
신규 판매 시에는 부분 판매도 가능하게 “판매 수량”을 입력할 수 있습니다.

4-2. 판매 입력값

판매할 구매 선택
판매일
판매가(권당, sellUnit)
할인율(%) (판매가 할인율 연동)
판매 수량(qty) (신규 판매일 때만 입력 가능)
지점(선택): 전역 branches에서 선택 가능 (랭킹 반영용)

4-3. 판매 저장 직전에 일어나는 핵심 계산(마일리지 특화의 핵심)
여기서부터가 “마일리지 특화” 포인트입니다.
총 매입금액 buyTotal = (판매수량) * (Lot.buyUnit
링크 미리보기 생성 중… https://Lot.buyUnit
링크 미리보기 생성 중… https://Lot.buyUnit
링크 미리보기 생성 중… https://Lot.buyUnit
링크 미리보기 생성 중… https://Lot.buyUnit
)
총 판매금액 sellTotal = (판매수량) * (sellUnit)
손익 profit = sellTotal - buyTotal
마일 규칙 조회(신용/체크 분기)
구매에 저장된 payType이 신용이면 카드의 creditPerMileKRW, 체크면 checkPerMileKRW 을 읽어옵니다.

마일계산 miles = round(buyTotal / (perMileKRW))
즉 “이번 거래에서 쓴(=매입) 금액을 기준으로, 그 카드 규칙에 따르면 마일이 몇 점이냐”를 계산합니다.

원/마일(costPerMile) 계산
costPerMile = -profit / miles (miles가 0이면 0 처리)
손익이 음수(손해)라면 -profit은 양수가 되어 “마일을 얻기 위해 실제로 얼마를 비용으로 냈는지(원/마일)” 형태가 됩니다.
손익이 양수(이득)면 원/마일이 음수가 나올 수도 있는데, 그 자체가 “마일도 얻고 돈도 벌었다”는 의미가 됩니다.

4-4. “여러 개를 입력한다”가 가능한 구조(부분 판매 → 구매 분할)
판매 저장 후, 신규 판매인 경우:전체 수량을 다 팔면: 해당 구매의 status를 sold로 바꿉니다.
부분만 팔면: 구매를 2개로 쪼갭니다.
원본 구매: 판매된 수량만 남기고 status = sold
새 구매: 남은 수량으로 새로운 구매 문서를 만들어 status = open 유지
→ 그래서 사용자 입장에서는 “한 번 구매한 상품권 구매에서 판매를 여러 번 나눠 입력”하는 것이 가능합니다(실제로는 상품권 구매가 분할되어 재고가 유지됨).

5) 상품권 “정보” 화면에서 이 데이터들이 어떻게 보이고 집계되는지
정보 탭(= 상품권 대시보드/캘린더/일간)은 기본적으로:Lots(구매들) Sales(판매들) 불러와서 합산/비교합니다.

5-1. 대시보드에서 보는 지표가 “마일” 중심인 이유
대시보드에 아래가 나옵니다(요약):총 매입금액(= lots의 buyUnit*qty 합)
총 판매금액(= sales의 sellTotal 합)
총 손익(= sales의 profit 합)
누적 마일(= sales의 miles 합)
평균 마일원가(원/마일)
전체 sumMiles와 sumProfit로 다시 계산해서 보여줍니다.
보유 잔여(미판매) 등
즉 핵심 KPI가 “얼마에 샀고/팔았고” 뿐 아니라
"그 과정에서 카드 규칙으로 마일이 몇 점 발생했고, 결과적으로 원/마일이 얼마냐”로 설계되어 있어서 “마일리지 특화”라고 볼 수 있습니다.

6) (추가로 중요한 디테일) 구매/판매 ‘수정’ 시 처리
구매(Lot) 수정/삭제, 판매(Sale) 수정은 화면 내에 있고,
편집 진입 시 땅콩(재화) 20개를 소모하는 확인 절차가 있습니다.
특히 Lot이 이미 sold인 상태에서 구매 내용을 수정하면, 연결된 Sale들의 buyTotal/profit/miles/costPerMile도 같이 재계산해서 업데이트하는 로직이 들어가 있습니다.

→ 구매원가가 바뀌면 마일/원가 계산이 연쇄적으로 바뀌기 때문에, 이것도 “마일리지 특화”에 맞춘 일관성 처리입니다.
댓글 · 1
{{comments[0].author.nickname}}
{{comments[0].content}}
대댓글 좋아요{{comments[0].likes}} 신고
첫번째 댓글을 입력해주세요.