Skip to content

feat(admin): 영업관리 대시보드 + 영업 성과 집계 전면 재정비 - #460

Merged
Jay722J merged 5 commits into
mainfrom
feat/sales-mgr-dashboard
Sep 16, 2026
Merged

Jay722J merged 5 commits into
mainfrom
feat/sales-mgr-dashboard

Conversation

@Jay722J

@Jay722J Jay722J commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

Closes #459

영업 성과 집계 — 세 가지가 틀려 있었다

화면에서는 전부 그럴듯해 보였고, 숫자가 틀려도 오류는 안 났다.

무엇이 틀렸나 어떻게 고쳤나
① 「한 번이라도 밟은 단계」로 세어 배정을 취소해 계약완료로 되돌린 건이 배정완료에 남았다(제보) 견적의 현재 상태만 본다
② 한 고객에게 견적을 여러 번 내면 고객이 여러 명으로 세어졌다(제보) 상담고객·견적완료는 명, 계약부터는 건
③ 기간을 견적 만든 날로 걸러, 지난달에 만들어 이번 달에 계약한 건이 「이번 달 계약」에 없었다 그 단계에 도달한 날로 가른다

①을 상태로 푼 이유: 되돌리는 길이 넷이다(배정 취소·배정 거부·특장사 거부·주문 삭제).
갈래마다 예외를 두면 다음에 생기는 길에서 또 샌다.

②의 「같은 사람」은 고객 서류함과 같은 규칙(이름+생년월일 / 이름+휴대폰)으로 묶는다 —
두 화면의 고객 수가 갈리면 안 된다. 이름 없는 임시저장은 상담고객이 아니다.
견적완료 금액도 고객당 가장 최근 한 건만 더한다(같은 차를 세 번 견적내면 세 배가 됐다).

③에서 전이 이력이 없는 옛 건은 끝이 열린 기간(이번 달)에서만 만든 날로 갈음한다.
견적을 만들기 전에는 계약할 수 없고 오늘 이후는 아직 오지 않았으니, 그 단계도 기간 안이다.
지난 달을 따로 볼 때는 갈음하지 않는다 — 없는 시간을 지어내지 않는다.

곁들여 고친 것

  • 기간 경계를 한국 시각으로 읽는다. new Date('2026-09-01') 은 UTC 자정이라
    시작일 새벽이 빠지고 종료일이 오전 9시에서 잘렸다
  • 전체 합계를 서버가 낸다 — 화면에서 계정별 줄을 더하면 한 고객을 둘이 맡을 때 두 명이 된다
  • 「처리 필요 견적」이 숨긴 견적을 빼지 않았다

영업관리 대시보드 — 관리자 첫 탭 「마이페이지」

카드는 각자 자기 데이터를 부르는 독립된 조각이다. 나중에 격자·배치 저장만 얹으면 그대로 위젯이 된다.

  • 영업 성과 — 상담고객 › 계약완료 › 주문진행 › 인도완료, 이번 달/전체 토글(부른 기간은 들고 있다)
  • 주문 진행 현황 — 배정 대기 › 수락 대기 › 특장 진행 › 부가작업 › 인도 완료 │ 납기일 경과
    (납기일 경과 앞은 꺾쇠가 아니라 세로선 — 다음 단계가 아니라 어디에 있든 늦은 건이다)
  • 배정 요청 대기 — 영업이 아직 안 누른 건 + 담당 영업. 관리자가 할 일은 없어 「열기」도 없다
  • 고객 검색 — 치는 동안 고객이 뜨고, 고르면 그 서류함이 펼쳐진 채 열린다
  • 일정 — 달력. 날짜를 누르면 차량 도착/납기/고객 인도별로 고객명이 나온다

꺾쇠는 격자 좌표로 못 박아 두 숫자의 정확히 한가운데, 숫자 줄 높이에 선다
(실측: 칸 중심 117·301·485·669, 꺾쇠 209·393·577).
목록이 드는 칸은 높이를 못 박아 0건이든 100건이든 카드 크기가 같다.

로컬 전용 자동 로그인

개발할 때 비밀번호를 치지 않고 들어간다. 운영에는 라우트가 아예 없다 —
권한 검사를 끄는 것이 아니라 app.ts 가 NODE_ENV=production 이면 붙이지 않는다.
그 위에 127.0.0.1 확인을 겹치고, 화면 쪽 코드는 운영 빌드에서 사라진다(import.meta.env.DEV).

이런 길은 조용히 열린 채로 배포되는 것이 유일한 실패 방식이라 겹마다 검사를 세웠다
(dev-auto-login.test.ts — 배포가 실제로 NODE_ENV=production 으로 띄우는지까지 본다).

DB

스키마 변경 없음. 마이그레이션 없음. 집계는 전부 읽기다.

검증

  • 백엔드 896개 전부 통과(새 검사 13개: 집계 규칙 8 · 자동 로그인 차단 5)
  • 프론트 빌드·타입 통과 · 영문화 사전 검사 통과
  • 로컬 실데이터로 화면 확인 — 상담고객 230명이 고객 서류함 230명과 맞는다
    (전에는 견적 건수를 그대로 세어 373명이었다)

🤖 Generated with Claude Code

준성의 Macbook Pro and others added 5 commits September 16, 2026 12:47
- 관리자 첫 탭 「마이페이지」 — 카드 5장: 이번 달 영업 성과 · 주문 진행 현황 · 배정 요청 대기 · 고객 검색 · 일정(달력)
  · 카드는 각자 자기 데이터를 불러오는 독립 조각 — 나중에 격자·배치 저장만 얹으면 위젯이 된다
  · 달력: 날짜마다 차량 도착·납기·고객 인도. 예정은 흐리게, 실제 완료는 진하게(shared/process/actual 과 같은 규칙)
  · 고객 검색: 이름으로 팝업을 열어 「고객 서류함」을 그대로 쓴다(두 화면이 다른 것을 보여 주면 안 된다)
- 로컬 전용 자동 로그인: 운영이 아닐 때만 라우트를 만들고(routes/dev-auth.ts), 요청이 이 기계에서 온 것만 받는다
  · 로그인 화면은 로컬에서 master@local 로 바로 들어간다(import.meta.env.DEV — 운영 번들에는 이 코드가 없다)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
성과 지표가 세 가지로 틀려 있었다(전부 화면에서는 그럴듯해 보였다).

 ① 「한 번이라도 밟은 단계」로 세어, **배정을 취소해 계약완료로 되돌린 건이
    배정완료에 그대로 남았다**(제보). 되돌리는 길은 넷이라(배정 취소·배정 거부·
    특장사 거부·주문 삭제) 예외를 하나씩 두면 다음 길에서 또 샌다 →
    **견적의 현재 상태**만 본다.
 ② 한 고객에게 견적을 여러 번 내면 **고객이 여러 명**으로 세어졌다(제보) →
    상담고객·견적완료는 **고객 수(명)**, 나머지는 **건수(건)**. 같은 사람인지는
    서류함과 같은 규칙(이름+생년월일/휴대폰)으로 묶는다. 이름 없는 임시저장은
    상담고객이 아니다. 견적완료 금액도 고객당 가장 최근 한 건만 더한다.
 ③ 기간을 견적 **만든 날**로 걸러, 8월에 만들어 9월에 계약한 건이 「9월 계약」에
    없었다 → **그 단계에 도달한 날**로 가른다. 전이 이력이 없는 옛 건은 끝이 열린
    기간(이번 달)에서만 만든 날로 갈음한다.

곁들여 고친 것
 · 기간 경계를 한국 시각으로 읽는다 — `new Date('2026-09-01')` 은 UTC 자정이라
   시작일 새벽이 빠지고 종료일은 오전 9시에서 잘렸다
 · 전체 합계를 서버가 낸다 — 계정별 줄을 더하면 한 고객을 둘이 맡을 때 두 명이 된다
 · 「처리 필요 견적」이 숨긴 견적을 빼지 않았다

대시보드(마이페이지) 카드 재배치 — 지시대로
 · 영업 성과: 한 줄을 가득 채우고 **상담고객 › 계약완료 › 주문진행 › 인도완료**
 · 주문 진행 현황: 여섯 칸이 폭을 똑같이 나눈다
 · 배정 요청 대기: 칸 높이를 못 박고 목록만 구른다 · 「열기」 제거(영업이 누르는 일)
   · 담당 영업을 나란히 적는다
 · 고객 검색: 치는 동안 고객이 아래로 뜨고 거기서 고른다 · 고르면 그 서류함이 펼쳐진다
 · 일정: 날짜를 누르면 차량 도착·납기·고객 인도별로 **고객명**이 나온다

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
설명 문구를 카드마다 한 줄씩 달았더니 제목 줄이 문장으로 뒤덮여, 정작 봐야 할
숫자가 뒤로 밀렸다(지시). 설명이 필요할 만큼 헷갈리는 칸이면 이름을 고칠 일이지
옆에 주석을 다는 일이 아니다 — Card 에서 note 자리를 없앴다.

영업 성과는 **이번 달과 전체를 오가며** 본다. 이번 달만 보면 지금까지 판 것이
안 보이고, 전체만 보면 이번 달이 되고 있는지 알 수 없다. 한 번 부른 기간은
카드가 들고 있다가 다시 쓴다 — 토글을 오갈 때마다 기다리지 않는다.

기간을 바꾸면 다시 불러야 하므로 성과 조회를 **카드가 직접** 한다(부모가 들고
있으면 부모가 기간을 알아야 한다). 카드는 독립된 조각으로 둔다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
꺾쇠를 flex 로 늘어놓고 alignSelf 로 세웠더니, 「이름+숫자+아래 줄」 전체의
한가운데에 서서 정작 맞춰야 할 **숫자 줄과 어긋났고**, 칸 안 글자가 왼쪽 정렬이라
뒷 숫자에 딸려 붙은 것처럼 보였다(제보).

격자로 바꿔 줄(이름/숫자/아래)과 칸을 좌표로 못 박았다. 칸 안은 가운데 정렬 —
그래야 꺾쇠가 두 숫자의 정확히 한가운데에 선다(실측: 칸 중심 117·301·485·669,
꺾쇠 209·393·577).

주문 진행 현황에도 같은 줄을 쓴다. 다만 「납기일 경과」 앞은 꺾쇠가 아니라 세로선이다 —
다음 단계가 아니라 어디에 있든 늦은 건이라, 꺾쇠로 이으면 인도 완료 다음 단계로 읽힌다.

임시저장(만든 견적 수)은 깔때기에서 뺐다. 견적 수와 고객 수는 단위가 달라
「607건 › 38% › 228명」이 이탈률로 읽혔다 — 활동량이라 이름 옆(견적 N건)에 적는다.

배정 요청 대기·고객 검색의 목록 칸은 높이를 절반(208→104)으로 줄였다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
비밀번호 없이 들어오는 길은 **조용히 열린 채로 배포되는 것**이 유일한 실패 방식이다 —
화면에 표시도 없고 오류도 안 난다. 막는 겹을 하나씩 검사로 세운다.

 · NODE_ENV=production 이면 꺼진다(값이 없으면 개발로 본다)
 · 운영으로 띄운 앱에는 /api/v1/dev/login 이 아예 없다(404·쿠키 없음)
 · 라우트가 붙어도 127.0.0.1 에서 온 요청만 받는다
 · 배포가 실제로 NODE_ENV=production 으로 띄운다 — 이게 거짓이면 위가 다 무의미하다
 · 화면 쪽 코드는 import.meta.env.DEV 로 운영 빌드에서 사라진다

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Jay722J
Jay722J merged commit 22a0ded into main Sep 16, 2026
4 checks passed
@Jay722J
Jay722J deleted the feat/sales-mgr-dashboard branch September 16, 2026 05:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

영업관리 대시보드(마이페이지) + 영업 성과 집계 전면 재정비

1 participant