세 케이스가 outbound 테이블을 축으로 연결된다.
고객이 전화를 걸어온 순간부터 통화 종료까지. A와 B가 주역, 결과는 DB에 "대기" 상태로만 남는다 (확정 없음).
"내일 오후 4시에 커트 돼요?" 수준의 단순 문의. DB 변경 없음, B가 네이버에 read-only 조회만.
여러 턴에 걸친 slot filling. B가 모든 정보를 확보한 뒤에만 DB에 저장하고, 고객에겐 "담당자가 확인 연락드리겠습니다" 안내.
save_booking_request 대신 텍스트로 "tool_code" 를 뱉는 경우 → _retry_save() 가 temperature=0으로 재시도required: customer_name)고객이 날짜/시간을 모를 수 있으므로 전화번호로 역조회. 예약자 이름 대조로 본인 확인.
date="미확인" time="미확인" 으로 접수E가 주역. 관리자가 대기 리스트를 보고 판단, 네이버에 실제 예약/취소를 실행한다. 결과는 CASE 3 아웃바운드로 이어진다.
담당자가 /admin 페이지 진입 → 대기/취소요청 목록 조회.
항목 클릭 → 네이버 가용성 재확인 → 담당자가 OK → 실제 예약 실행.
_to_24h() 로 정규화 후 비교status='실패', 담당자가 수동 확인구조는 2-2와 동일. 네이버에서 취소 실행.
main.py 에 없다. /outbound/{id}/confirm 끝에 추가해야 함/outbound/{id}/cancel) 는 네이버 액션 없이 DB만 변경 — 접수 실수 철회 용도 (네이버엔 아직 예약 안 간 상태)C와 D가 주역. CASE 2에서 생성된 요청을 소비. C는 전화로, D는 문자/알림톡으로.
E가 네이버에 예약 확정 후, C가 즉시 고객에게 전화해서 결과 통보 + 확인 문자 옵션.
C가 발신했으나 고객이 받지 않은 경우 → 음성사서함 대신 D에게 즉시 메시지 요청.
C 개입 없이 D 스케줄러가 자동 발송. 전화 없이 문자만.
/r/abc) 은 D 책임 — 추적용 파라미터 포함 가능E가 예약 확정을 시도했으나 만석 → C가 대안 제시 → 고객 응답을 다시 B 경로로 되돌림.
| 케이스 | 주역 | 트리거 | DB 결과 | 다음 |
|---|---|---|---|---|
| 1. 전화 상담 | A B | 고객 전화 걸어옴 | 대기중 / 취소요청 | → 2 |
| 2. 사용자 실행 | E | 관리자가 리스트에서 선택 | 확정 / 취소 / 실패 | → 3 |
| 3. 아웃바운드 | C D | 2의 결과 + 스케줄러 | notified 플래그 | 종결 (재협상 시 → 1/2 로) |