📋 기획 및 설계: - PharmQ SaaS 서비스 기획서 작성 - 구독 서비스 라인업 정의 (클라우드PC, AI CCTV, CRM) - DB 스키마 설계 및 API 아키텍처 설계 🗄️ 데이터베이스 구조: - service_products: 서비스 상품 마스터 테이블 - pharmacy_subscriptions: 약국별 구독 현황 테이블 - subscription_usage_logs: 서비스 이용 로그 테이블 - billing_history: 결제 이력 테이블 - 샘플 데이터 자동 생성 (21개 구독, 월 118만원 매출) 🔧 백엔드 API 구현: - 구독 현황 통계 API (/api/subscriptions/stats) - 약국별 구독 조회 API (/api/pharmacies/subscriptions) - 구독 상세 정보 API (/api/pharmacy/{id}/subscriptions) - 구독 생성/해지 API (/api/subscriptions) 🖥️ 프론트엔드 UI 구현: - 대시보드 구독 현황 카드 (월 매출, 구독 수, 구독률 등) - 약국 목록에 구독 상태 아이콘 및 월 구독료 표시 - 약국 상세 페이지 구독 서비스 섹션 추가 - 실시간 구독 생성/해지 기능 구현 ✨ 주요 특징: - 서비스별 색상 코딩 및 이모지 아이콘 시스템 - 실시간 업데이트 (구독 생성/해지 즉시 반영) - 반응형 디자인 (모바일/태블릿 최적화) - 툴팁 기반 상세 정보 표시 📊 현재 구독 현황: - 총 월 매출: ₩1,180,000 - 구독 약국: 10/14개 (71.4%) - AI CCTV: 6개 약국, CRM: 10개 약국, 클라우드PC: 5개 약국 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
297 lines
13 KiB
Markdown
297 lines
13 KiB
Markdown
# PharmQ SaaS 구독 서비스 관리 시스템 기획서
|
|
|
|
## 1. 프로젝트 개요
|
|
|
|
### 1.1 목적
|
|
- PharmQ가 제공하는 다양한 서비스에 대한 약국별 구독 관리
|
|
- SaaS 형태의 과금 서비스 기반 마련
|
|
- 약국별 서비스 이용 현황 실시간 모니터링
|
|
|
|
### 1.2 서비스 라인업
|
|
1. **클라우드 PC** (Proxmox 기반 가상 데스크톱)
|
|
2. **AI CCTV** (인공지능 기반 보안 모니터링)
|
|
3. **CRM** (고객 관계 관리 시스템)
|
|
|
|
## 2. 데이터베이스 스키마 설계
|
|
|
|
### 2.1 새로 추가할 테이블
|
|
|
|
#### 2.1.1 `service_products` - 서비스 상품 마스터
|
|
```sql
|
|
CREATE TABLE service_products (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
product_code VARCHAR(20) UNIQUE NOT NULL, -- 'CLOUD_PC', 'AI_CCTV', 'CRM'
|
|
product_name VARCHAR(100) NOT NULL, -- '클라우드 PC', 'AI CCTV', 'CRM'
|
|
description TEXT, -- 서비스 상세 설명
|
|
monthly_price DECIMAL(10,2) NOT NULL, -- 월 구독료
|
|
setup_fee DECIMAL(10,2) DEFAULT 0, -- 초기 설치비
|
|
is_active BOOLEAN DEFAULT TRUE, -- 서비스 활성화 여부
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
#### 2.1.2 `pharmacy_subscriptions` - 약국별 구독 현황
|
|
```sql
|
|
CREATE TABLE pharmacy_subscriptions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
pharmacy_id INTEGER NOT NULL, -- pharmacy_info.id 참조
|
|
product_id INTEGER NOT NULL, -- service_products.id 참조
|
|
subscription_status VARCHAR(20) NOT NULL, -- 'ACTIVE', 'SUSPENDED', 'CANCELLED'
|
|
start_date DATE NOT NULL, -- 구독 시작일
|
|
end_date DATE, -- 구독 종료일 (NULL이면 무제한)
|
|
next_billing_date DATE, -- 다음 결제일
|
|
monthly_fee DECIMAL(10,2) NOT NULL, -- 실제 적용 월 구독료
|
|
notes TEXT, -- 특이사항
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (pharmacy_id) REFERENCES pharmacy_info(id),
|
|
FOREIGN KEY (product_id) REFERENCES service_products(id),
|
|
UNIQUE(pharmacy_id, product_id) -- 약국-상품당 하나의 구독만
|
|
);
|
|
```
|
|
|
|
#### 2.1.3 `subscription_usage_logs` - 서비스 이용 로그
|
|
```sql
|
|
CREATE TABLE subscription_usage_logs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
subscription_id INTEGER NOT NULL, -- pharmacy_subscriptions.id 참조
|
|
usage_type VARCHAR(50) NOT NULL, -- 'LOGIN', 'API_CALL', 'STORAGE_USE' 등
|
|
usage_amount INTEGER DEFAULT 1, -- 사용량 (로그인 횟수, API 호출 수 등)
|
|
usage_date DATE NOT NULL, -- 사용일
|
|
metadata JSON, -- 추가 메타데이터
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (subscription_id) REFERENCES pharmacy_subscriptions(id)
|
|
);
|
|
```
|
|
|
|
#### 2.1.4 `billing_history` - 결제 이력
|
|
```sql
|
|
CREATE TABLE billing_history (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
subscription_id INTEGER NOT NULL, -- pharmacy_subscriptions.id 참조
|
|
billing_period_start DATE NOT NULL, -- 과금 기간 시작
|
|
billing_period_end DATE NOT NULL, -- 과금 기간 종료
|
|
amount DECIMAL(10,2) NOT NULL, -- 청구 금액
|
|
billing_status VARCHAR(20) NOT NULL, -- 'PENDING', 'PAID', 'OVERDUE', 'CANCELLED'
|
|
billing_date DATE, -- 실제 결제일
|
|
payment_method VARCHAR(50), -- 결제 수단
|
|
invoice_number VARCHAR(100), -- 청구서 번호
|
|
notes TEXT, -- 결제 관련 메모
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (subscription_id) REFERENCES pharmacy_subscriptions(id)
|
|
);
|
|
```
|
|
|
|
### 2.2 기존 테이블 연동
|
|
- `pharmacy_info` 테이블과 `pharmacy_subscriptions` 테이블을 연결
|
|
- 사용자 관리에서 약국별 구독 서비스 현황 표시
|
|
|
|
## 3. 프론트엔드 UI/UX 설계
|
|
|
|
### 3.1 대시보드 개선
|
|
|
|
#### 3.1.1 메인 대시보드 (`/`)
|
|
- **구독 서비스 현황 카드** 추가
|
|
```
|
|
┌─────────────────────────────────────────┐
|
|
│ 📊 구독 서비스 현황 │
|
|
├─────────────────────────────────────────┤
|
|
│ 클라우드 PC │ 12/14 약국 (85.7%) │
|
|
│ AI CCTV │ 8/14 약국 (57.1%) │
|
|
│ CRM │ 10/14 약국 (71.4%) │
|
|
├─────────────────────────────────────────┤
|
|
│ 총 월 매출 │ ₩2,450,000 │
|
|
└─────────────────────────────────────────┘
|
|
```
|
|
|
|
#### 3.1.2 서비스별 상태 인디케이터
|
|
- 각 서비스별 색상 코드 적용
|
|
- 🟢 클라우드 PC (녹색)
|
|
- 🔵 AI CCTV (파란색)
|
|
- 🟡 CRM (노란색)
|
|
|
|
### 3.2 약국 관리 페이지 개선 (`/pharmacy`)
|
|
|
|
#### 3.2.1 약국 목록에 구독 상태 표시
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ 약국명 │ 위치 │ 구독 서비스 │ 월 구독료 │ 액션 │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ 서울약국 │ 서울 강남구 │ 🟢 💻 🔵 📷 🟡 📊 │ ₩180,000 │ ⚙️ │
|
|
│ 부산약국 │ 부산 해운대 │ 🟢 💻 🔵 📷 │ ₩120,000 │ ⚙️ │
|
|
│ 대구약국 │ 대구 중구 │ 🟢 💻 │ ₩60,000 │ ⚙️ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
#### 3.2.2 약국 상세 페이지 구독 탭 추가
|
|
- 기존: 기본정보, 네트워크정보, 연결된 머신
|
|
- **신규**: **구독 서비스** 탭 추가
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ [기본정보] [네트워크정보] [연결된 머신] [구독 서비스] ←← 신규 탭 │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ 📦 구독 중인 서비스 │
|
|
│ │
|
|
│ 🟢 클라우드 PC ₩60,000/월 [관리] │
|
|
│ ├─ 구독기간: 2024.01.15 ~ 무제한 │
|
|
│ ├─ 다음결제: 2025.10.15 │
|
|
│ └─ 상태: 정상 (ACTIVE) │
|
|
│ │
|
|
│ 🔵 AI CCTV ₩80,000/월 [관리] │
|
|
│ ├─ 구독기간: 2024.03.01 ~ 무제한 │
|
|
│ ├─ 다음결제: 2025.10.01 │
|
|
│ └─ 상태: 정상 (ACTIVE) │
|
|
│ │
|
|
│ 📦 구독 가능한 서비스 │
|
|
│ │
|
|
│ 🟡 CRM 시스템 ₩40,000/월 [가입] │
|
|
│ └─ 고객 관계 관리 및 매출 분석 도구 │
|
|
│ │
|
|
│ [+ 새 서비스 구독하기] │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 3.3 새로운 메뉴 추가
|
|
|
|
#### 3.3.1 사이드바 메뉴 구조 개선
|
|
```
|
|
PharmQ Super Admin (PSA)
|
|
├── 📊 대시보드
|
|
├── 🏥 약국 관리
|
|
├── 👥 PQON 사용자 관리
|
|
├── 💻 머신 관리
|
|
├── 🖥️ VM 관리 (VNC)
|
|
├── 📦 구독 서비스 관리 ←← 신규 메뉴
|
|
│ ├── 구독 현황 조회
|
|
│ ├── 서비스 상품 관리
|
|
│ ├── 결제 이력 조회
|
|
│ └── 사용량 통계
|
|
├── 📈 매출 대시보드 ←← 신규 메뉴
|
|
└── 🔗 Medivault
|
|
```
|
|
|
|
#### 3.3.2 구독 서비스 관리 페이지 (`/subscriptions`)
|
|
- **전체 구독 현황 테이블**
|
|
- **서비스별 필터링**
|
|
- **구독 상태별 필터링** (활성/일시정지/해지)
|
|
- **월별 매출 차트**
|
|
|
|
#### 3.3.3 매출 대시보드 (`/revenue`)
|
|
- **월별 매출 트렌드**
|
|
- **서비스별 매출 비중**
|
|
- **약국별 구독료 순위**
|
|
- **신규 구독/해지 통계**
|
|
|
|
## 4. API 설계
|
|
|
|
### 4.1 구독 관리 API
|
|
|
|
#### 4.1.1 구독 현황 조회
|
|
```
|
|
GET /api/subscriptions
|
|
GET /api/subscriptions/pharmacy/{pharmacy_id}
|
|
GET /api/subscriptions/product/{product_code}
|
|
```
|
|
|
|
#### 4.1.2 구독 생성/수정
|
|
```
|
|
POST /api/subscriptions # 새 구독 생성
|
|
PUT /api/subscriptions/{subscription_id} # 구독 정보 수정
|
|
DELETE /api/subscriptions/{subscription_id} # 구독 해지
|
|
```
|
|
|
|
#### 4.1.3 서비스 상품 관리
|
|
```
|
|
GET /api/products # 상품 목록
|
|
POST /api/products # 상품 등록
|
|
PUT /api/products/{product_id} # 상품 수정
|
|
```
|
|
|
|
### 4.2 결제 및 통계 API
|
|
|
|
#### 4.2.1 결제 관련
|
|
```
|
|
GET /api/billing/history/{subscription_id} # 결제 이력
|
|
POST /api/billing/invoice # 청구서 생성
|
|
PUT /api/billing/{billing_id}/status # 결제 상태 업데이트
|
|
```
|
|
|
|
#### 4.2.2 통계 및 리포트
|
|
```
|
|
GET /api/analytics/revenue/monthly # 월별 매출
|
|
GET /api/analytics/subscriptions/summary # 구독 요약
|
|
GET /api/analytics/usage/{subscription_id} # 서비스 사용량
|
|
```
|
|
|
|
## 5. 구현 단계별 로드맵
|
|
|
|
### Phase 1: 기본 구조 구축 (1-2주)
|
|
- [x] 데이터베이스 스키마 생성
|
|
- [ ] 기본 API 엔드포인트 구현
|
|
- [ ] 대시보드 구독 현황 카드 추가
|
|
|
|
### Phase 2: 약국별 구독 관리 (2-3주)
|
|
- [ ] 약국 상세 페이지 구독 탭 추가
|
|
- [ ] 구독 생성/수정/해지 기능
|
|
- [ ] 약국 목록 구독 상태 표시
|
|
|
|
### Phase 3: 서비스 관리 및 통계 (3-4주)
|
|
- [ ] 구독 서비스 관리 메뉴 구현
|
|
- [ ] 매출 대시보드 구현
|
|
- [ ] 사용량 로깅 시스템
|
|
|
|
### Phase 4: 과금 시스템 (4-6주)
|
|
- [ ] 자동 결제 시스템
|
|
- [ ] 청구서 생성
|
|
- [ ] 결제 연동 (포트원/토스페이먼츠 등)
|
|
|
|
## 6. 기술 스택
|
|
|
|
### 6.1 백엔드
|
|
- **Database**: SQLite (개발) → PostgreSQL (운영)
|
|
- **API**: Flask REST API
|
|
- **결제**: 포트원(PortOne) 또는 토스페이먼츠
|
|
|
|
### 6.2 프론트엔드
|
|
- **Framework**: Bootstrap 5 + Jinja2
|
|
- **Charts**: Chart.js 또는 D3.js
|
|
- **Icons**: Font Awesome
|
|
|
|
### 6.3 모니터링
|
|
- **사용량 추적**: Custom logging system
|
|
- **알림**: 결제 실패, 구독 만료 등
|
|
|
|
## 7. 보안 및 컴플라이언스
|
|
|
|
### 7.1 데이터 보안
|
|
- 결제 정보 암호화
|
|
- 개인정보 보호법 준수
|
|
- API 인증/인가 체계
|
|
|
|
### 7.2 백업 및 복구
|
|
- 데이터베이스 일일 백업
|
|
- 결제 데이터 별도 보관
|
|
- 장애 복구 프로세스
|
|
|
|
---
|
|
|
|
## 8. 예상 효과
|
|
|
|
### 8.1 비즈니스 효과
|
|
- **매출 가시화**: 실시간 구독 매출 현황 파악
|
|
- **고객 관리**: 약국별 서비스 이용 패턴 분석
|
|
- **확장성**: 새로운 서비스 추가 용이
|
|
|
|
### 8.2 운영 효율화
|
|
- **자동화**: 구독/해지/결제 프로세스 자동화
|
|
- **모니터링**: 서비스별 이용 현황 실시간 추적
|
|
- **리포팅**: 월별/분기별 매출 리포트 자동 생성
|
|
|
|
---
|
|
|
|
**작성일**: 2025년 9월 11일
|
|
**작성자**: PharmQ Development Team
|
|
**버전**: v1.0 |