# 구현 로그

## 2026-07-01

### 완료

- Laravel 8 프로젝트를 `D:\Server\aa_work`에 생성했습니다.
- 기존 `docs` 폴더는 유지했습니다.
- Laragon PHP 7.4.33 경로를 확인했습니다.
- Composer 2.4.1 실행을 확인했습니다.
- Laravel Framework 8.83.29 실행을 확인했습니다.
- MySQL `aa_work` 데이터베이스를 생성했습니다.
- `.env` DB 설정을 `aa_work` 기준으로 변경했습니다.
- 업무 시스템용 마이그레이션을 생성하고 실행했습니다.
- 업무 시스템용 모델을 생성했습니다.
- 음성 파일 저장용 `storage/app/audio` 폴더를 준비했습니다.
- 루트 `README.md`를 프로젝트 기준으로 정리했습니다.
- 모바일 텍스트 입력 화면을 구현했습니다.
- 텍스트 원본 입력 저장 라우트와 API를 구현했습니다.
- 텍스트 입력 저장 Feature 테스트를 추가했습니다.
- 모바일 직접 녹음 UI를 구현했습니다.
- 음성 파일 업로드 API를 구현했습니다.
- 음성 입력 저장 Feature 테스트를 추가했습니다.
- Laragon Apache vhost `aa_work.test`를 추가했습니다.
- Windows hosts에 `aa_work.test`를 등록했습니다.
- Laravel `APP_URL`을 `http://aa_work.test`로 변경했습니다.
- 브라우저 미지원 또는 보안 정책 차단 상황을 위한 음성 파일 업로드 fallback을 추가했습니다.
- mock 음성 텍스트 변환 서비스를 구현했습니다.
- 음성 원본 입력의 `텍스트 변환` API를 구현했습니다.
- 변환된 텍스트 검수 및 수정 저장 API를 구현했습니다.
- 대시보드에서 음성 항목의 변환, 수정, 저장 UI를 구현했습니다.
- 음성 변환 및 검수 저장 Feature 테스트를 추가했습니다.
- mock AI 분석 서비스를 구현했습니다.
- 검수된 텍스트를 AI 분석 payload로 변환하고 응답 구조를 검증하도록 구현했습니다.
- AI 분석 로그 저장 API를 구현했습니다.
- 대시보드에서 원본 입력의 `AI 분석` 실행 UI와 최근 분석 결과 표시를 구현했습니다.
- AI 분석 Feature 테스트를 추가했습니다.
- AI 분석 결과를 실제 업무로 반영하는 서비스를 구현했습니다.
- 신규 업무 생성, 기존 업무 업데이트, 중복 반영 방지를 구현했습니다.
- 대시보드에서 분석 결과의 `업무 반영` 실행 UI와 반영 완료 표시를 구현했습니다.
- 업무 반영 Feature 테스트를 추가했습니다.
- 사람 등록 및 별칭 관리 기능을 구현했습니다.
- 대시보드에 담당자별 개인 업무 리스트를 추가했습니다.
- 업무 담당자 넘기기 API와 화면 UI를 구현했습니다.
- AI mock 분석에서 이름과 별칭 기반 담당자 매칭을 구현했습니다.
- 사람 관리 및 업무 넘기기 Feature 테스트를 추가했습니다.
- 개요, 입력/AI, 사람, 업무 메뉴로 화면을 분리했습니다.
- 메뉴별 페이지 접근 Feature 테스트를 추가했습니다.
- 담당자 매칭 로직을 `PersonMatchService`로 분리했습니다.
- 이름, 직책, 호칭, 별칭, 조사 결합 표현을 정규화해 담당자를 매칭하도록 구현했습니다.
- `김민수에게`, `김민수대리는`, `김민수씨한테` 같은 표현을 같은 담당자로 인식하는 테스트를 추가했습니다.
- Feature 테스트에 트랜잭션 격리를 적용해 테스트용 사람이 실사용 DB에 남지 않도록 정리했습니다.
- 업무 검수 완료 API와 화면 UI를 구현했습니다.
- 검수 완료 시 `is_review_required`와 `review_reason`을 정리하고 `task_updates`에 이력을 남기도록 구현했습니다.
- 사람 수정 및 비활성화 API와 화면 UI를 구현했습니다.
- 진행 중 업무가 있는 사람은 비활성화하지 못하도록 보호했습니다.
- 확인 필요 업무와 실패 입력을 모아보는 화면을 구현했습니다.
- 전체/개인 일일 리포트 생성 API와 화면 UI를 구현했습니다.
- 실제 OpenAI 분석 드라이버를 추가하고 Responses API 응답의 토큰 사용량을 `ai_usage_logs`에 기록하도록 구현했습니다.
- 텍스트 입력 저장 직후 AI 분석과 업무 반영이 자동 실행되도록 변경했습니다.
- 음성 텍스트 변환 및 변환문 수정 저장 후에도 AI 분석과 업무 반영이 자동 실행되도록 변경했습니다.
- 업무 마감 일시 `tasks.due_at`과 분석 추출 일시 `ai_analysis_logs.extracted_due_at`을 추가했습니다.
- mock AI 분석에서 `오늘`, `내일`, `N월 N일`, `오전/오후 N시`, `HH:MM` 표현을 마감 일시로 추출하도록 구현했습니다.

### 확인된 로컬 경로

```text
C:\laragon\bin\php\php-7.4.33-nts-Win32-vc15-x64\php.exe
C:\laragon\bin\composer\composer.phar
```

### 생성된 주요 테이블

- `users`
- `user_aliases`
- `raw_inputs`
- `tasks`
- `task_updates`
- `ai_analysis_logs`
- `daily_reports`
- `ai_usage_logs`

### 구현된 라우트

- `GET /`: 모바일 입력 대시보드
- `POST /inputs/text`: 화면 텍스트 입력 저장
- `POST /api/text-inputs`: API 텍스트 입력 저장, AI 분석, 업무 자동 반영
- `POST /api/voice-inputs`: API 음성 파일 업로드 및 원본 입력 저장
- `POST /api/raw-inputs/{rawInput}/transcribe`: 음성 원본 입력 텍스트 변환, AI 분석, 업무 자동 반영
- `PATCH /api/raw-inputs/{rawInput}/text`: 변환문 검수 및 수정 저장, AI 분석, 업무 자동 반영
- `POST /api/raw-inputs/{rawInput}/analyze`: 원본 입력 AI 분석 및 분석 로그 저장
- `POST /api/ai-analysis-logs/{aiAnalysisLog}/apply`: AI 분석 결과를 업무로 반영
- `POST /api/people`: 사람 등록 및 별칭 저장
- `PATCH /api/people/{user}`: 사람 정보 및 별칭 수정
- `POST /api/people/{user}/deactivate`: 사람 비활성화
- `POST /api/tasks/{task}/transfer`: 업무 담당자 변경
- `POST /api/tasks/{task}/review-complete`: 업무 검수 완료 처리
- `POST /api/reports/daily`: 전체/개인 일일 리포트 생성
- `GET /inputs`: 입력/AI 처리 화면
- `GET /people`: 사람 관리 및 개인 업무 화면
- `GET /tasks`: 전체 업무 및 업무 넘기기 화면
- `GET /reviews`: 확인 필요 업무 및 실패 입력 화면
- `GET /reports`: 전체/개인 일일 리포트 화면

### 로컬 도메인

```text
http://aa_work.test
```

vhost 파일:

```text
C:\laragon\etc\apache2\sites-enabled\auto.aa_work.test.conf
```

DocumentRoot:

```text
D:/Server/aa_work/public
```

### 생성된 주요 모델

- `User`
- `UserAlias`
- `RawInput`
- `Task`
- `TaskUpdate`
- `AiAnalysisLog`
- `DailyReport`
- `AiUsageLog`

### 검증

다음 검증을 통과했습니다.

```text
php -l app/Models/*.php
php -l database/migrations/*.php
php artisan config:clear
php artisan route:list
php artisan test
http://aa_work.test HTTP 200
```

최신 테스트 결과:

```text
Tests: 27 passed
```

### 현재 테스트 가능 범위

- `http://aa_work.test` 접속
- 텍스트 입력 저장
- 최근 원본 입력 조회
- 브라우저 직접 녹음 후 서버 업로드
- 브라우저 녹음이 막히는 경우 음성 파일 선택 업로드
- `raw_inputs`의 `text`, `voice` 저장 확인
- 음성 원본 입력 mock 텍스트 변환
- 변환문 검수 및 수정 저장
- mock AI 분석 실행
- AI 분석 로그 저장 및 최근 분석 결과 조회
- AI 분석 결과 업무 반영
- 신규 업무 생성과 기존 업무 업데이트
- 중복 반영 방지
- 사람 등록 및 별칭 저장
- 별칭 기반 담당자 매칭
- 담당자별 개인 업무 리스트
- 업무 담당자 넘기기
- 기능별 메뉴 접근
- 담당자 문구 정규화 매칭
- 업무 검수 완료 처리
- 사람 수정 및 비활성화
- 확인 필요 업무와 실패 입력 조회
- 전체/개인 일일 리포트 생성
- OpenAI 분석 드라이버 요청/응답 처리 및 토큰 사용량 기록
- 텍스트 입력 한 번으로 담당자, 업무 내용, 마감일, 마감시간 자동 반영
- 음성 변환 후 담당자, 업무 내용, 마감일, 마감시간 자동 반영

### 참고

현재 음성 변환은 `TRANSCRIPTION_DRIVER=mock` 상태지만, 업무 분석은 기본 설정을 `AI_ANALYSIS_DRIVER=openai`로 변경했습니다. OpenAI 키는 `.env`에 직접 저장하지 않고 `D:\Server\_secret\indyeve0_apikey.php`의 `OPENAI_API_KEY_LOCAL` 상수에서 읽습니다. 테스트도 mock 분석을 강제하지 않고 실제 OpenAI API 연결을 사용합니다. 다음 단계에서는 로그인/권한, 운영 배포 설정을 정리하면 됩니다.

Composer 설치 중 Laravel 8 의존성에 대한 보안 권고가 일부 확인되었습니다. Laravel 8은 PHP 7.4에서 가능한 현실적인 선택이지만, 장기 운영 전에는 PHP 8.2 이상과 최신 Laravel 업그레이드를 검토하는 것이 좋습니다.

루트에 `.git` 폴더가 있으나 비어 있어 현재는 정상 Git 저장소로 인식되지 않습니다.
