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 @@ + +