From ee7a1fb4711cdd68bd18bd52dca74c1a709c1fe0 Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Tue, 30 Jun 2026 23:02:41 +0900 Subject: [PATCH 1/2] =?UTF-8?q?docs(brand):=20=EB=B0=B1=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=97=90=20AI=20=EA=B8=B0=EB=8A=A5(=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EB=B3=B4=EC=A1=B0=C2=B7=EC=9E=AC=EB=AC=B4=20=EC=BD=94=EB=A9=98?= =?UTF-8?q?=ED=8A=B8)=20=EC=B6=94=EA=B0=80=20=E2=80=94=20=EC=B6=9C?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=84=20=EC=A0=81=EC=9A=A9=20=ED=9D=AC=EB=A7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- brand/LAUNCH-PROGRESS.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/brand/LAUNCH-PROGRESS.md b/brand/LAUNCH-PROGRESS.md index 13a7593..5040e7c 100644 --- a/brand/LAUNCH-PROGRESS.md +++ b/brand/LAUNCH-PROGRESS.md @@ -110,6 +110,15 @@ 5. (선택) 첫 실행 온보딩 / Play 인앱 리뷰 / 생체 인증 / 외화 환율 자동 고도화 6. **조직 계정 전환 + 기프트콘 교환** — 사업자등록→DUNS→앱이전, B2B 기프트콘 매입 +### 🤖 AI 기능 (★ 정식 출시 전 적용 희망) +- 전제: **LLM API 키**(Claude Haiku 4.5 권장 — 학습 미사용·톤 우수·저렴 / 또는 Gemini 무료쿼터) + **개인정보처리방침·데이터안전 갱신**(제3자 LLM 추가). 백엔드 프록시·키 서버보관·실패 시 폴백. +- **AI 입력 보조** (편의성, 1순위) + - ① **자연어 한 줄 입력** — "어제 스타벅스 5천원" → 폼 자동 채움(기존 parseText를 LLM 기반으로). 음성=기기STT+① + - ② **영수증 사진 → AI 구조화** — 멀티모달 LLM이 총액·날짜·가맹점·분류 추천(기존 Vision OCR 보강/대체) + - ③ **자동 분류 추천** — 가맹점/메모→분류 제안 + - 원칙: AI는 폼 prefill만, **사용자 확인 후 저장** +- **AI 재무 코멘트** — 자산·수입·예상지출 기반 한마디("이러다 파산각" 등). 일1회 캐시·집계수치만 전송. + --- ## 🔨 빌드 상태 From afbec5e3c3cafc75c0f64cedcd6b038326d2973d Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Tue, 30 Jun 2026 23:23:08 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EB=B6=84=EB=A5=98=20=EC=95=84?= =?UTF-8?q?=EC=BD=94=EB=94=94=EC=96=B8=20=ED=99=94=EB=A9=B4=20=EA=B5=90?= =?UTF-8?q?=EC=A0=95=20=E2=80=94=20=EB=B6=84=EB=A5=98=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EB=A1=A4=EB=B0=B1=20=C2=B7=20=EB=82=B4=EC=97=AD=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CategoryView(분류 관리): 잘못 적용된 대분류 아코디언 제거, 소분류 항상 표시로 복원 - AccountView(내역 추가/수정): 2단 드롭다운 → 대분류 아코디언으로 교체 · 대분류 클릭 → 소분류 펼침(없으면 바로 선택) · 소분류 클릭 → 즉시 선택 / 선택 항목 초록 하이라이트 · 수정 진입 시 해당 대분류 자동 펼침 유지 Co-Authored-By: Claude Sonnet 4.6 --- src/views/account/AccountView.vue | 157 +++++++++++++++++++++-------- src/views/account/CategoryView.vue | 60 +---------- 2 files changed, 120 insertions(+), 97 deletions(-) diff --git a/src/views/account/AccountView.vue b/src/views/account/AccountView.vue index d810d16..475b0fa 100644 --- a/src/views/account/AccountView.vue +++ b/src/views/account/AccountView.vue @@ -276,25 +276,27 @@ async function loadCategories() { categories.value = [] } } -// 현재 구분(수입/지출)에 맞는 분류 + 편집 중 현재 값 보존 -// ===== 분류: 대분류 → 소분류 2단 선택 (긴 드롭다운 스크롤 방지) ===== -const categoryMajor = ref('') // 선택된 대분류 이름 -// 현재 구분의 대분류(부모 없음) 이름 + 편집 중 현재 대분류 보존 -const majorOptions = computed(() => { - const names = categories.value - .filter((c) => c.type === form.type && c.parentId == null) - .map((c) => c.name) - if (categoryMajor.value && !names.includes(categoryMajor.value)) names.unshift(categoryMajor.value) - return names -}) -// 선택된 대분류의 소분류 이름 목록 (없으면 대분류 자체가 분류) -const subOptions = computed(() => { - const major = categories.value.find( - (c) => c.type === form.type && c.parentId == null && c.name === categoryMajor.value, - ) - if (!major) return [] - return categories.value.filter((c) => c.parentId === major.id).map((c) => c.name) -}) +// ===== 분류: 대분류 아코디언 → 소분류 선택 ===== +const categoryMajor = ref('') // 펼쳐진 대분류 이름 +// 현재 구분의 대분류 객체 목록 +const majorOptionsData = computed(() => + categories.value.filter((c) => c.type === form.type && c.parentId == null) +) +// 특정 대분류의 소분류 객체 목록 +function subsByMajor(majorId) { + return categories.value.filter((c) => c.parentId === majorId) +} +// 대분류 클릭: 소분류 있으면 펼침 토글, 없으면 바로 선택 +function onMajorClick(major) { + if (categoryMajor.value === major.name) { + categoryMajor.value = '' + form.category = '' + } else { + categoryMajor.value = major.name + if (!subsByMajor(major.id).length) form.category = major.name + else form.category = '' + } +} // form.category 로부터 대분류 추론 (편집 진입 시) function syncCategoryMajor() { const cur = form.category @@ -310,10 +312,7 @@ function syncCategoryMajor() { categoryMajor.value = cur } } -// 대분류 변경: 소분류 있으면 소분류 선택 대기 / 없으면 대분류가 곧 분류 -function onMajorChange() { - form.category = subOptions.value.length ? '' : categoryMajor.value -} + // 필터용 전체 분류명 (중복 제거) const allCategoryNames = computed(() => [...new Set(categories.value.map((c) => c.name))]) @@ -1121,16 +1120,28 @@ onMounted(async () => {