Add SNS Marketing Campaign feature

- Add cash_cc_balance to User model (withdrawable CC)
- Create SnsShareSubmission model for SNS share verification
- Add marketing campaign settings to SystemSettings
- Add reward_type to ReferralReward model
- Create /api/sns-share endpoints for submission and verification
- Add referral signup reward logic (10CC on signup)
- Create /sns-share user page for SNS sharing
- Create /admin/sns-shares management page
- Add marketing settings UI to admin settings page
- Add SNS Shares menu to admin sidebar

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
AutonetSellCar Deploy
2026-01-03 18:21:17 +09:00
parent 718c5b0474
commit 7c943d8553
17 changed files with 1414 additions and 6 deletions

View File

@@ -11,6 +11,7 @@ from .vehicle_share import VehicleShare, ShareReward
from .withdrawal import WithdrawalRequest
from .referral import ReferralReward
from .notification import Notification
from .sns_share import SnsShareSubmission
from .push_subscription import PushSubscription, UserNotificationPreference
from .performance_check import CarPerformanceCheck
from .car_specification import CarSpecification
@@ -52,6 +53,7 @@ __all__ = [
"WithdrawalRequest",
"ReferralReward",
"Notification",
"SnsShareSubmission",
"PushSubscription",
"UserNotificationPreference",
"ExchangeRate",

View File

@@ -16,10 +16,13 @@ class ReferralReward(Base):
# 피추천인 (추천받아 가입한 사람)
referred_user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
# 결제 금액 (피추천인이 충전한 금액 USD)
payment_amount = Column(Float, nullable=False)
# 보상 유형: "signup" (가입 시), "payment" (결제 시)
reward_type = Column(String(20), default="payment")
# 보상 금액 (결제 금액의 X%)
# 결제 금액 (피추천인이 충전한 금액 USD, signup인 경우 0)
payment_amount = Column(Float, default=0.0)
# 보상 금액 (결제 금액의 X% 또는 고정 CC)
reward_amount = Column(Float, nullable=False)
# 보상 상태: pending(대기), credited(적립), withdrawn(출금)

View File

@@ -47,6 +47,22 @@ class SystemSettings(Base):
exchange_rate_weight_rub = Column(Float, default=0.0) # RUB (러시아 루블) 가중치
exchange_rate_weight_cny = Column(Float, default=0.0) # CNY (중국 위안) 가중치
# 마케팅 캠페인 설정
marketing_enabled = Column(Boolean, default=False) # 마케팅 캠페인 활성화
marketing_start_date = Column(DateTime(timezone=True), nullable=True) # 캠페인 시작일
marketing_end_date = Column(DateTime(timezone=True), nullable=True) # 캠페인 종료일
# SNS 공유 보상 설정
sns_share_reward_cc = Column(Float, default=3.0) # SNS 공유 보상 CC (기본 3CC)
referral_signup_reward_cc = Column(Float, default=10.0) # 레퍼럴 가입 보상 CC (기본 10CC)
# 이벤트 CC 유효기간 (개월)
event_cc_validity_months = Column(Integer, default=6) # 이벤트 CC 유효기간 (기본 6개월)
# 출금 설정
withdrawal_enabled = Column(Boolean, default=True) # 출금 기능 활성화
min_withdrawal_usd = Column(Float, default=10.0) # 최소 출금 금액 (USD)
# 타임스탬프
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())

View File

@@ -0,0 +1,35 @@
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Text
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from ..database import Base
class SnsShareSubmission(Base):
"""SNS 공유 제출 및 검증 모델"""
__tablename__ = "sns_share_submissions"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
car_id = Column(Integer, ForeignKey("cars.id"), nullable=False)
# SNS 정보
platform = Column(String(20), nullable=False) # twitter, instagram, facebook
sns_url = Column(String(500), nullable=False) # 공유 게시물 URL
# 상태
status = Column(String(20), default="pending") # pending, approved, rejected
rejected_reason = Column(Text, nullable=True) # 거부 사유
# CC 보상
reward_cc = Column(Float, default=3.0) # 기본 3CC 보상
rewarded_at = Column(DateTime(timezone=True), nullable=True) # 보상 지급 시각
# 타임스탬프
submitted_at = Column(DateTime(timezone=True), server_default=func.now())
verified_at = Column(DateTime(timezone=True), nullable=True) # 검증 시각
verified_by = Column(Integer, ForeignKey("users.id"), nullable=True) # 검증한 관리자
# Relationships
user = relationship("User", foreign_keys=[user_id], backref="sns_submissions")
car = relationship("Car", backref="sns_shares")
verifier = relationship("User", foreign_keys=[verified_by])

View File

@@ -24,7 +24,8 @@ class User(Base):
is_active = Column(Boolean, default=True)
is_admin = Column(Boolean, default=False)
is_dealer = Column(Boolean, default=False) # Dealer status
cc_balance = Column(Float, default=3.0) # CC coin balance, 3 free on signup
cc_balance = Column(Float, default=3.0) # 프로모션 CC (출금 불가) - 가입보너스, SNS공유, 레퍼럴
cash_cc_balance = Column(Float, default=0.0) # 현금성 CC (출금 가능) - 딜러수수료 88%
referral_code = Column(String(8), unique=True, index=True) # Unique referral code for sharing
referred_by = Column(String(8), nullable=True) # Referral code of the user who referred this user