diff --git a/brand/LAUNCH-PROGRESS.md b/brand/LAUNCH-PROGRESS.md
index 8b15736..3a85569 100644
--- a/brand/LAUNCH-PROGRESS.md
+++ b/brand/LAUNCH-PROGRESS.md
@@ -139,14 +139,12 @@
## ๐ ๋จ์ ๋ฐฑ๋ก๊ทธ (์ถ์ ํ ์
๋ฐ์ดํธ)
1. **์ฑ ์
๋ฐ์ดํธ ์๋ด** โ ์ ๋ฒ์ ์๋ฆผ + ๊ตฌ๊ธํ๋ ์ด ๋ฐ๋ก๊ฐ๊ธฐ
2. (์ ํ) ์ฒซ ์คํ ์จ๋ณด๋ฉ / Play ์ธ์ฑ ๋ฆฌ๋ทฐ / ์์ฒด ์ธ์ฆ
-3. **์กฐ์ง ๊ณ์ ์ ํ + ๊ธฐํํธ์ฝ ๊ตํ** โ ์ฌ์
์๋ฑ๋กโDUNSโ์ฑ์ด์ , B2B ๊ธฐํํธ์ฝ ๋งค์
-4. **ํฌ์ธํธ ์์ (์ฌ์ฉ๋ยท์ฌ๋กฏ ํ๋งค)** โ ๊ฒฌ์ ~1~1.5์ผ. ๋ฌด๋ฃํ์ ๋์, ์ ๋ฃํ์์ ๋ฌด์ ํ.
- - **AI ํ
์คํธ ์
๋ ฅ**(`/entries/parse`): ์ 5ํ ๋ฌด๋ฃ + **์ถ๊ฐ 10ํ = 300P**
- - **OCR ์์์ฆ ์ธ์**(`/ocr/receipt-ai`): ์ 3ํ ๋ฌด๋ฃ + **์ถ๊ฐ 10ํ = 500P**
- - **๊ณ์ข ์ฌ๋กฏ**: ์ข
๋ฅ๋ณ ๊ธฐ๋ณธ 2๊ฐ(์ ์ฉ๋จ) + **500P๋น +1, ์ต๋ 5๊ฐ**, ๊ตฌ๋งค๋ถ์ **์๊ตฌ**
- - ์ค๊ณ: ์๋ณ ์ฌ์ฉ๋ ํ
์ด๋ธ(`ai_usage`) + ๊ตฌ๋งค ํฌ๋ ๋ง(`ai_credit`) / ๋งค ํธ์ถ ์ `๋ฌด๋ฃ์ฟผํฐโ๊ตฌ๋งคํฌ๋ ๋งโ๊ฑฐ๋ถ(์ถฉ์ ์ ๋)` / ๊ตฌ๋งค๋ PointService๋ก ํฌ์ธํธ ์ฐจ๊ฐ(+ํฌ๋ ๋ง)
- - ํ์ ํ์: โ ์ ๋ฃ=๋ฌด์ ํ โก๊ตฌ๋งคํฉ ์ด์(๊ธฐ๋ณธ์ ๋งค์ ๋ฆฌ์
) โข'1ํ'=AI API ํธ์ถ 1๊ฑด(๋น์ฉ ๊ธฐ์ค) โฃ์ 1์ผ ๋ฆฌ์
- - ์ฐธ๊ณ : AI ํธ์ถ ๋น์ฉ ์ํ ํต์ ํจ๊ณผ. ์ง๊ธ์ `/entries/parse`๊ฐ ๋ฌด๋ฃยท๋ฏธ๊ฒ์ดํธ(์์์ฆยท์ฌ๋ฌด์ฝ๋ฉํธ๋ ์ด๋ฏธ ์ ๋ฃ ๊ฒ์ดํธ) โ ์์ ์์ด ๋จ์ ์ ๋ฃํํ๋ ค๋ฉด WebConfig 1์ค๋ก๋ ๊ฐ๋ฅ
+3. **์กฐ์ง ๊ณ์ ์ ํ** โ ์ฌ์
์๋ฑ๋กโDUNSโ์ฑ์ด์
+4. โ
**ํฌ์ธํธ ์์ ** (2026-07-10 ๊ตฌํ ์๋ฃ)
+ - **๊ณ์ข ์ฌ๋กฏ**: 500P/๊ฐ, ์ต๋ 3๊ฐ, ์๊ตฌ. `extra_wallet_slots` (member ํ
์ด๋ธ)
+ - **AI ํต๊ณ ๋ถ์**: 1000P โ 10ํ ์ด์ฉ๊ถ. `ai_stat_credits` (member ํ
์ด๋ธ)
+ - FREE ํ์์ด ํฌ๋ ๋ง ์์ด AI ์ฝ๋ฉํธ ํธ์ถ ์ 402 โ ํต๊ณ ํ๋ฉด์์ ์์ ์๋ด
+ - PREMIUM ํ์์ AI ์ฝ๋ฉํธ ๋ฌด์ ํ (ํฌ๋ ๋ง ๋ถํ์)
### ๐ค AI ๊ธฐ๋ฅ โ โ
๊ตฌํยท๋ฐฐํฌ ์๋ฃ (2026-07-05)
- ๋ฐฑ์๋: `AiEntryParser`(Claude Haiku 4.5, raw HTTP `/v1/messages`), ํค๋ ์๋ฒ `/opt/sb-backend/.env`(`ANTHROPIC_API_KEY`), ์คํจ/๋ฏธ์ค์ ์ ๊ท์น๊ธฐ๋ฐยทGoogle Vision OCR ํด๋ฐฑ.
@@ -169,12 +167,9 @@
## ๋ค์ ์ธ์
์ฌ๊ฐ ์ง์
0. โ
**[ํด๊ฒฐ] ํ๋ฉด ๊ฐ๋ก ๋ฐ๋ฆผ/์๋ฆผ** โ ์ง์ง ์์ธ์ **iOS input ์๋ํ๋**์์(๋ชจ๋ฌยทCSS ์๋).
- viewport์ maximum-scale ์์ด 16px ๋ฏธ๋ง input ํฌ์ปค์ค ์ ํ์ด์ง ํ๋โ์ฐ์ธก ์๋ฆผ. `maximum-scale=1.0, user-scalable=no` ์ถ๊ฐ๋ก ํด๊ฒฐ(ec130e8). *๊ตํ: "๋ชจ๋ ํ๋ฉด input ํฌ์ปค์ค ์ ๋์ผ" = iOS ์ค ์์ฌ.*
-1. **ํ
์คํฐ 12๋ช
opt-in ์งํ์ํฉ ํ์ธ**(์
์ฒด ์๋ขฐ) โ 12๋ช
+ 14์ผ ์ฐ์ ์ถฉ์กฑ๋๋ฉด **ํ๋ก๋์
์ก์ธ์ค ์ ์ฒญ**(`production-access-draft.md`)
-2. **v4 AAB ๋น๊ณต๊ฐ ํธ๋ ์
๋ก๋** โ versionCode 4(1.0.3) ๋น๋ ์๋ฃ, Play Console ์
๋ก๋ ๋๊ธฐ
- - โ ๏ธ 2026-07-07 ์ถ๊ฐ๋ถ(์ ๊ธฐ๊ฒฐ์ ยท๊ณ์ข๊ฐํธยท์ํ์กฐํยท์์ํ๊ธ ๋ฑ)์ **์นยท์๋ฒ ๋ฐฐํฌ ์๋ฃ** โ ๋ค์ AAB์ ํฌํจํด ๋น๋
-3. **ํฌ์ธํธ ์์ ** โ ๊ฒฌ์ ~1~1.5์ผ. ์ฐฉ์ ์ ์ ์ฑ
4๊ฐ์ง ํ์ ํ์:
- - โ ์ ๋ฃ ํ์ = AI ๋ฌด์ ํ ์ฌ๋ถ โก๊ตฌ๋งค ํฌ๋ ๋ง ์ด์ vs ๋งค์ ๋ฆฌ์
โข1ํ=API ํธ์ถ 1๊ฑด โฃ๋ฆฌ์
๊ธฐ์ค์ผ=์ 1์ผ
-4. **DUNS ๋ฐ๊ธ ๋๊ธฐ** โ ๋ฐ๊ธ ์ Play Console ๊ฐ์ธ์ฌ์
์ ๊ณ์ ์ ํ ๋ง์ ์งํ
-5. (์ ํ) **์์ฑ ์ ์ฉ ๐ค ๋ฒํผ** โ `@capacitor-community/speech-recognition`(ํ์ฌ๋ iOS ํค๋ณด๋ ๋ฐ์์ฐ๊ธฐ๋ก ๋์ฒด ๊ฐ๋ฅ)
-6. **iOS(App Store) ํธ๋** โ ์ค๊ธฐ๊ธฐ ๋น๋ ํ์ธ ์๋ฃ. ์ ํ ๊ฐ๋ฐ์ ์น์ธยท๋ฒ๋คIDยทApp Store ์ฌ์ฌ๋ Play์ ๋
๋ฆฝ ์งํ
+1. **ํ
์คํฐ 12๋ช
opt-in ์งํ์ํฉ ํ์ธ**(์
์ฒด ์๋ขฐ) โ 12๋ช
+ 14์ผ ์ฐ์ ์ถฉ์กฑ๋๋ฉด **ํ๋ก๋์
์ก์ธ์ค ์ ์ฒญ**
+2. **v5 AAB ๋น๊ณต๊ฐ ํธ๋ ์
๋ก๋** โ versionCode 5(1.0.4) ๋น๋ ์๋ฃ, Play Console ์
๋ก๋ ๋๊ธฐ
+ - ํฌ์ธํธ ์์ ํฌํจ ์ด๋ฒ ์์
๋ถ ์๋ฒ ๋ฐฐํฌ ํ์ธ ํ AAB ์
๋ก๋
+3. **DUNS ๋ฐ๊ธ ๋๊ธฐ** โ ๋ฐ๊ธ ์ Play Console ๊ฐ์ธ์ฌ์
์ ๊ณ์ ์ ํ
+4. (์ ํ) **์์ฑ ์ ์ฉ ๐ค ๋ฒํผ** โ `@capacitor-community/speech-recognition`
+5. **iOS(App Store) ํธ๋** โ ์ค๊ธฐ๊ธฐ ๋น๋ ํ์ธ ์๋ฃ. ์ ํ ๊ฐ๋ฐ์ ์น์ธยท๋ฒ๋คIDยทApp Store ์ฌ์ฌ๋ Play์ ๋
๋ฆฝ ์งํ
diff --git a/src/api/accountApi.js b/src/api/accountApi.js
index 8b2e2b3..536e322 100644
--- a/src/api/accountApi.js
+++ b/src/api/accountApi.js
@@ -225,6 +225,14 @@ const realApi = {
return http.delete('/account/all')
},
+ // ํฌ์ธํธ ์์ โ ํํฉ ์กฐํ / ์์ดํ
๊ตฌ๋งค
+ shopStatus() {
+ return http.get('/account/shop/status')
+ },
+ buyShopItem(item) {
+ return http.post('/account/shop/buy', { item })
+ },
+
// ์์์ฆ OCR (๋ฐฑ์๋๊ฐ Google Vision ํธ์ถ โ ์ ์ฒด ํ
์คํธ ๋ฐํ) โ AI ํด๋ฐฑ์ฉ
// suppressNetError: runOcr ์ด ์์ฒด formError ๋ก ์๋ดํ๋ฏ๋ก ์ ์ญ ๋ฐฐ๋ ์ต์
ocrReceipt(blob) {
@@ -271,7 +279,7 @@ const DEMO_WRITES = new Set([
'createRecurring', 'updateRecurring', 'removeRecurring', 'runRecurrings',
'createWallet', 'updateWallet', 'removeWallet', 'reorderWallets',
'createCategory', 'updateCategory', 'removeCategory', 'reorderCategories', 'importCategories',
- 'createTag', 'updateTag', 'removeTag', 'reorderTags', 'confirmEntry', 'ocrReceipt', 'parseReceiptAi', 'aiComment', 'restore', 'deleteAllData',
+ 'createTag', 'updateTag', 'removeTag', 'reorderTags', 'confirmEntry', 'ocrReceipt', 'parseReceiptAi', 'aiComment', 'restore', 'deleteAllData', 'buyShopItem',
'createBudget', 'updateBudget', 'removeBudget', 'setExpectedIncome',
'createHolding', 'updateHolding', 'removeHolding', 'addTrade', 'updateTrade', 'removeTrade',
'refreshPrices', 'refreshAllPrices',
diff --git a/src/router/index.js b/src/router/index.js
index 20b35f0..70d8c35 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -213,6 +213,12 @@ const router = createRouter({
component: () => import('../views/settings/ProfileEditView.vue'),
meta: { requiresAuth: true },
},
+ {
+ path: '/settings/shop',
+ name: 'settings-shop',
+ component: () => import('../views/settings/ShopView.vue'),
+ meta: { requiresAuth: true },
+ },
],
})
diff --git a/src/views/account/AccountDashboardView.vue b/src/views/account/AccountDashboardView.vue
index 4768cd2..0413196 100644
--- a/src/views/account/AccountDashboardView.vue
+++ b/src/views/account/AccountDashboardView.vue
@@ -1,8 +1,11 @@
+
+