diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드1.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드1.jpeg new file mode 100644 index 0000000..3f1f4f5 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드1.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드10.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드10.jpeg new file mode 100644 index 0000000..a4312dd Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드10.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드11.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드11.jpeg new file mode 100644 index 0000000..b939996 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드11.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드12.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드12.jpeg new file mode 100644 index 0000000..501bd5b Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드12.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드13.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드13.jpeg new file mode 100644 index 0000000..0d8ddce Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드13.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드14.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드14.jpeg new file mode 100644 index 0000000..0b5a102 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드14.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드15.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드15.jpeg new file mode 100644 index 0000000..e0a713c Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드15.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드16.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드16.jpeg new file mode 100644 index 0000000..35dda4b Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드16.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드17.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드17.jpeg new file mode 100644 index 0000000..e37402b Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드17.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드18.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드18.jpeg new file mode 100644 index 0000000..0809779 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드18.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드19.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드19.jpeg new file mode 100644 index 0000000..5a58ac9 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드19.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드2.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드2.jpeg new file mode 100644 index 0000000..6149625 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드2.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드20.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드20.jpeg new file mode 100644 index 0000000..67c3f1b Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드20.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드21.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드21.jpeg new file mode 100644 index 0000000..a7e1817 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드21.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드22.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드22.jpeg new file mode 100644 index 0000000..4449bad Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드22.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드23.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드23.jpeg new file mode 100644 index 0000000..2a423fc Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드23.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드24.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드24.jpeg new file mode 100644 index 0000000..c957f3f Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드24.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드25.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드25.jpeg new file mode 100644 index 0000000..ca1a879 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드25.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드26.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드26.jpeg new file mode 100644 index 0000000..67fb874 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드26.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드27.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드27.jpeg new file mode 100644 index 0000000..31f837e Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드27.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드28.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드28.jpeg new file mode 100644 index 0000000..c9f8cda Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드28.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드29.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드29.jpeg new file mode 100644 index 0000000..4ebd9d7 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드29.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드3.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드3.jpeg new file mode 100644 index 0000000..d0a2a96 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드3.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드30.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드30.jpeg new file mode 100644 index 0000000..2218201 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드30.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드31.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드31.jpeg new file mode 100644 index 0000000..dea5672 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드31.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드32.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드32.jpeg new file mode 100644 index 0000000..9f907b9 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드32.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드33.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드33.jpeg new file mode 100644 index 0000000..5f57e85 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드33.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드34.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드34.jpeg new file mode 100644 index 0000000..07a4b90 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드34.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드35.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드35.jpeg new file mode 100644 index 0000000..61bb695 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드35.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드36.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드36.jpeg new file mode 100644 index 0000000..fcb9520 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드36.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드37.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드37.jpeg new file mode 100644 index 0000000..b159d26 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드37.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드38.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드38.jpeg new file mode 100644 index 0000000..09dc2b3 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드38.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드4.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드4.jpeg new file mode 100644 index 0000000..4e23e2c Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드4.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드5.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드5.jpeg new file mode 100644 index 0000000..1eb2c7d Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드5.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드6.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드6.jpeg new file mode 100644 index 0000000..ed4772a Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드6.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드7.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드7.jpeg new file mode 100644 index 0000000..ffc48d4 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드7.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드8.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드8.jpeg new file mode 100644 index 0000000..8678d99 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드8.jpeg differ diff --git a/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드9.jpeg b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드9.jpeg new file mode 100644 index 0000000..a9bd232 Binary files /dev/null and b/plans/SAM_ERP_Storyboard_D1.0_251218/슬라이드9.jpeg differ diff --git a/plans/erp-api-development-plan-d1.0-changes.md b/plans/erp-api-development-plan-d1.0-changes.md new file mode 100644 index 0000000..cf06f6d --- /dev/null +++ b/plans/erp-api-development-plan-d1.0-changes.md @@ -0,0 +1,582 @@ +# SAM ERP API 개발 작업 계획 - D1.0 변경사항 + +> **작성일**: 2025-12-19 +> **기준 문서**: SAM_ERP_Storyboard_D1.0_251218 (38페이지) +> **이전 버전**: SAM_ERP_Storyboard_D0.8_251216 (85페이지) +> **상태**: ✅ Phase 5 완료 | 🔄 Phase 6 진행중 | ⬜ Phase 7 대기 | ⬜ Phase 8 대기 + +--- + +## 📚 참고 문서 + +### 핵심 참고 문서 +| 문서 | 경로 | 용도 | +|------|------|------| +| **기존 개발 계획** | [`erp-api-development-plan.md`](./erp-api-development-plan.md) | D0.8 기준 Phase 1-4 | +| **개발 공통 정책** | [`../guides/PROJECT_DEVELOPMENT_POLICY.md`](../guides/PROJECT_DEVELOPMENT_POLICY.md) | 개발 표준 및 정책 | +| **D0.8 스토리보드** | [`SAM_ERP_Storyboard_D0.8_251216/`](./SAM_ERP_Storyboard_D0.8_251216/) | 이전 버전 UI 참조 | +| **D1.0 스토리보드** | [`SAM_ERP_Storyboard_D1.0_251218/`](./SAM_ERP_Storyboard_D1.0_251218/) | 최신 UI/UX 참조 | + +### 기존 코드 참조 +| 항목 | 경로 | 상태 | +|------|------|------| +| `Board` 모델 | `api/app/Models/Boards/Board.php` | ✅ 존재 | +| `BoardSetting` 모델 | `api/app/Models/Boards/BoardSetting.php` | ✅ 존재 | +| `BoardComment` 모델 | `api/app/Models/Boards/BoardComment.php` | ✅ 존재 | +| `Plan` 모델 | `api/app/Models/Tenants/Plan.php` | ✅ 존재 | +| `Subscription` 모델 | `api/app/Models/Tenants/Subscription.php` | ✅ 존재 | +| `PushNotificationSetting` | `api/app/Models/PushNotificationSetting.php` | ✅ 존재 | + +--- + +## 📊 D1.0 개발 범위 요약 + +| Phase | 구분 | 항목수 | 신규 테이블 | API 수 | 상태 | +|-------|------|--------|------------|--------|------| +| Phase 5 | 기본 확장 | 4개 | 1개 | ~14개 | ✅ 완료 | +| Phase 6 | 핵심 신규 | 2개 | 4개 | ~17개 | 🔄 진행중 | +| Phase 7 | 게시판 연동 | 3개 | 0개 | ~30개 | ⬜ 대기 | +| Phase 8 | SaaS 확장 | 3개 | 0개 | ~10개 | ⬜ 대기 | +| **합계** | | **12개** | **~5개** | **~71개** | | + +--- + +## 🚀 Phase 5: D1.0 기본 확장 (예상 1-2주) + +> 기존 테이블/모델 활용, API 추가 중심 + +### 5.1 사용자 초대 기능 🆕 +> 슬라이드: 2 | 경로: 인사관리 > 사원관리 > 사용자 초대 + +- [ ] **테이블 생성** + - [ ] `user_invitations` 마이그레이션 + ```sql + -- user_invitations (사용자 초대) + id, tenant_id, email, role_id, message, token, + status (pending/accepted/expired), + invited_by, expires_at, accepted_at, + created_at, updated_at + ``` + - [ ] 마이그레이션 실행 및 검증 + +- [ ] **모델 생성** + - [ ] `UserInvitation` 모델 (BelongsToTenant) + - [ ] 관계 정의 (inviter, role) + - [ ] 토큰 생성 헬퍼 + +- [ ] **서비스 구현** + - [ ] `UserInvitationService` 생성 + - [ ] 이메일 초대 발송 로직 + - [ ] 초대 수락 로직 (사원 정보 자동 매핑) + - [ ] 토큰 만료 처리 + +- [ ] **API 엔드포인트** (4개) + - [ ] `POST /v1/users/invite` - 사용자 초대 (이메일 발송) + - [ ] `GET /v1/users/invitations` - 초대 목록 + - [ ] `POST /v1/users/invitations/{token}/accept` - 초대 수락 + - [ ] `DELETE /v1/users/invitations/{id}` - 초대 취소 + +- [ ] **Swagger 문서** + - [ ] `UserInvitationApi.php` 작성 + - [ ] 스키마 정의 (UserInvitation, InviteRequest, AcceptRequest) + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +### 5.2 알림설정 확장 🔄 +> 슬라이드: 19-22 | 경로: 기준정보 > 알림설정 + +**기존 구성요소:** +- `PushNotificationSetting` 모델 존재 (Push 알림용) +- 일반 알림설정은 신규 필요 + +- [ ] **테이블 확장** + - [ ] `notification_settings` 테이블 확인/생성 + ```sql + -- notification_settings (알림 설정) + id, tenant_id, user_id, category, type, + email_enabled, push_enabled, sms_enabled, + created_at, updated_at + ``` + - [ ] Seeder: 기본 알림 유형 17개 등록 + +- [ ] **모델 생성/수정** + - [ ] `NotificationSetting` 모델 (BelongsToTenant) + - [ ] 카테고리별 그룹화 메서드 + +- [ ] **서비스 구현** + - [ ] `NotificationSettingService` 생성 + - [ ] 카테고리별 조회/수정 로직 + - [ ] 사용자별 기본값 생성 로직 + +- [ ] **알림 유형 정의** (17개) + | 카테고리 | 알림 항목 | 기본값 | + |----------|----------|--------| + | 공지 | 공지사항, 이벤트 | OFF, ON | + | 일정 | 부가세 신고, 종합소득세 신고 | OFF, ON | + | 거래처 | 신규 업체 등록, 신용등급 등록 | OFF, ON | + | 근태 | 연차, 출근, 지각, 결근 | OFF, ON, OFF, ON | + | 수주/발주 | 수주 등록, 발주 | OFF, ON | + | 전자결재 | 결재요청, 승인, 반려, 완료 | OFF, ON, OFF, OFF | + | 생산 | 안전재고, 생산완료 | OFF, ON | + +- [ ] **API 엔드포인트** (3개) + - [ ] `GET /v1/settings/notifications` - 알림 설정 조회 + - [ ] `PUT /v1/settings/notifications` - 알림 설정 일괄 수정 + - [ ] `PATCH /v1/settings/notifications/{type}` - 개별 알림 설정 수정 + +- [ ] **Swagger 문서** + - [ ] `NotificationSettingApi.php` 작성 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +### 5.3 계정정보 수정 (탈퇴/사용중지) 🔄 +> 슬라이드: 24 | 경로: 계정정보 + +- [ ] **서비스 구현** + - [ ] `AccountService` 생성/확장 + - [ ] 회원 탈퇴 로직 (모든 테넌트에서 탈퇴, SAM 탈퇴) + - [ ] 사용 중지 로직 (특정 테넌트에서만 중지) + - [ ] 약관 동의 정보 관리 + +- [ ] **API 엔드포인트** (4개) + - [ ] `POST /v1/account/withdraw` - 회원 탈퇴 + - [ ] `POST /v1/account/suspend` - 사용 중지 (특정 테넌트) + - [ ] `GET /v1/account/agreements` - 약관 동의 정보 조회 + - [ ] `PUT /v1/account/agreements` - 약관 동의 정보 수정 + +- [ ] **Swagger 문서** + - [ ] `AccountApi.php` 확장 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +### 5.4 매출 상세 확장 (거래명세서) 🔄 +> 슬라이드: 9 | 경로: 회계관리 > 매출관리 > 매출 상세 + +**기존 구성요소:** +- `Sale` 모델, `SaleService` 존재 +- `TaxInvoice` 모델 존재 (세금계산서) + +- [ ] **서비스 확장** + - [ ] `SaleService` 확장 + - [ ] 거래명세서 조회 로직 + - [ ] 거래명세서 발행 로직 + - [ ] 거래명세서 이메일 발송 로직 + +- [ ] **API 엔드포인트** (3개) + - [ ] `GET /v1/sales/{id}/statement` - 거래명세서 조회 + - [ ] `POST /v1/sales/{id}/statement/issue` - 거래명세서 발행 + - [ ] `POST /v1/sales/{id}/statement/send` - 거래명세서 이메일 발송 + +- [ ] **Swagger 문서** + - [ ] `SaleApi.php` 확장 (거래명세서 관련 추가) + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +## 🔨 Phase 6: D1.0 핵심 신규 개발 (예상 2-3주) + +> 신규 테이블 + API 전체 신규 구현 + +### 6.1 악성채권 추심관리 🆕 +> 슬라이드: 10-13 | 경로: 회계관리 > 악성채권 추심관리 + +- [ ] **테이블 생성** (3개) + - [ ] `bad_debts` 마이그레이션 + ```sql + -- bad_debts (악성채권) + id, tenant_id, client_id, debt_amount, status, + overdue_days, assigned_user_id, occurred_at, closed_at, + is_active, options(json), + created_by, updated_by, deleted_by, + created_at, updated_at, deleted_at + ``` + - [ ] `bad_debt_documents` 마이그레이션 + ```sql + -- bad_debt_documents (필요 서류) + id, bad_debt_id, document_type, file_id, + created_at + ``` + - [ ] `bad_debt_memos` 마이그레이션 + ```sql + -- bad_debt_memos (메모) + id, bad_debt_id, content, created_by, created_at + ``` + - [ ] 마이그레이션 실행 및 검증 + +- [ ] **모델 생성** (3개) + - [ ] `BadDebt` 모델 (BelongsToTenant, SoftDeletes) + - 상태 상수: COLLECTING, LEGAL_ACTION, RECOVERED, BAD_DEBT + - 관계: client, assignedUser, documents, memos + - [ ] `BadDebtDocument` 모델 + - 문서 유형: business_license, tax_invoice, additional + - [ ] `BadDebtMemo` 모델 + +- [ ] **서비스 구현** + - [ ] `BadDebtService` 생성 + - [ ] 악성채권 등록/수정/삭제 로직 + - [ ] 상태 전이 로직 (추심중→법적조치→회수완료/대손처리) + - [ ] 요약 통계 (총 채권, 상태별 금액) + - [ ] 서류 첨부/삭제 로직 + - [ ] 메모 추가/삭제 로직 + +- [ ] **API 엔드포인트** (11개) + - [ ] `GET /v1/bad-debts` - 악성채권 목록 + - [ ] `POST /v1/bad-debts` - 악성채권 등록 + - [ ] `GET /v1/bad-debts/summary` - 상단 요약 (총 채권, 상태별 금액) + - [ ] `GET /v1/bad-debts/{id}` - 악성채권 상세 + - [ ] `PUT /v1/bad-debts/{id}` - 악성채권 수정 + - [ ] `DELETE /v1/bad-debts/{id}` - 악성채권 삭제 + - [ ] `PATCH /v1/bad-debts/{id}/toggle` - 설정 ON/OFF + - [ ] `POST /v1/bad-debts/{id}/documents` - 서류 첨부 + - [ ] `DELETE /v1/bad-debts/{id}/documents/{docId}` - 서류 삭제 + - [ ] `POST /v1/bad-debts/{id}/memos` - 메모 추가 + - [ ] `DELETE /v1/bad-debts/{id}/memos/{memoId}` - 메모 삭제 + +- [ ] **Swagger 문서** + - [ ] `BadDebtApi.php` 작성 + - [ ] 스키마 정의 (BadDebt, BadDebtDocument, BadDebtMemo, Summary) + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +### 6.2 팝업관리 🆕 +> 슬라이드: 15-16 | 경로: 기준정보 > 팝업관리 + +- [ ] **테이블 생성** (1개) + - [ ] `popups` 마이그레이션 + ```sql + -- popups (팝업) + id, tenant_id, target_type, target_id, + title, content, status, + started_at, ended_at, + created_by, updated_by, deleted_by, + created_at, updated_at, deleted_at + ``` + - [ ] 마이그레이션 실행 및 검증 + +- [ ] **모델 생성** + - [ ] `Popup` 모델 (BelongsToTenant, SoftDeletes) + - target_type: all, department + - status: active, inactive + - 활성 팝업 스코프 (기간 + 상태 체크) + +- [ ] **서비스 구현** + - [ ] `PopupService` 생성 + - [ ] 팝업 CRUD 로직 + - [ ] 활성 팝업 조회 로직 (로그인 후 노출용) + - [ ] 기간 유효성 검사 로직 + +- [ ] **API 엔드포인트** (6개) + - [ ] `GET /v1/popups` - 팝업 목록 (관리자용) + - [ ] `POST /v1/popups` - 팝업 등록 + - [ ] `GET /v1/popups/active` - 활성 팝업 목록 (사용자용) + - [ ] `GET /v1/popups/{id}` - 팝업 상세 + - [ ] `PUT /v1/popups/{id}` - 팝업 수정 + - [ ] `DELETE /v1/popups/{id}` - 팝업 삭제 + +- [ ] **Swagger 문서** + - [ ] `PopupApi.php` 작성 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +## 📋 Phase 7: D1.0 게시판 연동 (예상 1-2주) + +> 기존 Board 모델 활용, API 엔드포인트 추가 + +**기존 구성요소 (api 프로젝트):** +- `Board` 모델: is_system, board_type, board_code, name, extra_settings +- `BoardSetting` 모델: 커스텀 필드 정의 +- `BoardComment` 모델: 댓글 +- `Post` 모델: 게시글 (확인 필요) + +### 7.1 게시판관리 🆕 +> 슬라이드: 17-18 | 경로: 기준정보 > 게시판관리 + +- [ ] **기존 모델 확인/확장** + - [ ] `Board` 모델 확인 + - [ ] `BoardSetting` 모델 확인 + - [ ] 필요시 필드 추가 (allow_comments, max_pinned 등) + +- [ ] **서비스 구현** + - [ ] `BoardSettingService` 생성 + - [ ] 테넌트별 게시판 CRUD 로직 + - [ ] 디폴트 게시판 생성 로직 (공지사항, 나의 게시글) + +- [ ] **API 엔드포인트** (5개) + - [ ] `GET /v1/board-settings` - 게시판 설정 목록 + - [ ] `POST /v1/board-settings` - 게시판 생성 + - [ ] `GET /v1/board-settings/{id}` - 게시판 설정 상세 + - [ ] `PUT /v1/board-settings/{id}` - 게시판 설정 수정 + - [ ] `DELETE /v1/board-settings/{id}` - 게시판 삭제 + +- [ ] **Swagger 문서** + - [ ] `BoardSettingApi.php` 작성 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +### 7.2 게시판 (사용자용) 🆕 +> 슬라이드: 3-7 | 경로: 게시판 + +- [ ] **기존 모델 확인/확장** + - [ ] `Post` 모델 확인/생성 + - [ ] 상단 노출 필드 (is_pinned, pinned_at) + - [ ] 댓글 허용 필드 (allow_comments) + - [ ] 조회수 필드 (view_count) + +- [ ] **서비스 구현** + - [ ] `PostService` 생성 + - [ ] 게시글 CRUD 로직 + - [ ] 상단 노출 로직 (최대 5개 제한) + - [ ] 조회수 증가 로직 + - [ ] 나의 게시글 조회 로직 + +- [ ] **API 엔드포인트** (10개) + - [ ] `GET /v1/boards` - 게시판 목록 (탭용) + - [ ] `GET /v1/boards/{code}/posts` - 게시글 목록 + - [ ] `POST /v1/boards/{code}/posts` - 게시글 등록 + - [ ] `GET /v1/boards/{code}/posts/{id}` - 게시글 상세 + - [ ] `PUT /v1/boards/{code}/posts/{id}` - 게시글 수정 + - [ ] `DELETE /v1/boards/{code}/posts/{id}` - 게시글 삭제 + - [ ] `GET /v1/posts/my` - 나의 게시글 + - [ ] `POST /v1/posts/{id}/comments` - 댓글 등록 + - [ ] `PUT /v1/posts/{id}/comments/{commentId}` - 댓글 수정 + - [ ] `DELETE /v1/posts/{id}/comments/{commentId}` - 댓글 삭제 + +- [ ] **Swagger 문서** + - [ ] `BoardApi.php` 작성 (사용자용) + - [ ] `PostApi.php` 작성 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +### 7.3 고객센터 🆕 +> 슬라이드: 30-38 | 경로: 고객센터 + +**기존 구성요소:** +- 시스템 게시판 (is_system = true) 활용 +- board_type으로 구분: notice, event, faq, inquiry + +- [ ] **게시판 시드 데이터** + - [ ] `notice` - SAM 공지사항 (시스템) + - [ ] `event` - 이벤트 (시스템) + - [ ] `faq` - FAQ (시스템, 카테고리 필드) + - [ ] `inquiry` - 1:1 문의 (테넌트별) + +- [ ] **서비스 확장** + - [ ] `SupportService` 생성 + - [ ] 공지사항 조회 (시스템 게시판) + - [ ] 이벤트 조회 (진행중/종료) + - [ ] FAQ 조회 (카테고리별) + - [ ] 1:1 문의 CRUD + 답변 + +- [ ] **API 엔드포인트** (15개) + - [ ] `GET /v1/support/notices` - 공지사항 목록 + - [ ] `GET /v1/support/notices/{id}` - 공지사항 상세 + - [ ] `GET /v1/support/events` - 이벤트 목록 + - [ ] `GET /v1/support/events/{id}` - 이벤트 상세 + - [ ] `GET /v1/support/faqs` - FAQ 목록 + - [ ] `GET /v1/support/faqs/categories` - FAQ 카테고리 목록 + - [ ] `GET /v1/support/inquiries` - 1:1 문의 목록 + - [ ] `POST /v1/support/inquiries` - 1:1 문의 등록 + - [ ] `GET /v1/support/inquiries/{id}` - 1:1 문의 상세 + - [ ] `PUT /v1/support/inquiries/{id}` - 1:1 문의 수정 + - [ ] `DELETE /v1/support/inquiries/{id}` - 1:1 문의 삭제 + - [ ] `POST /v1/support/inquiries/{id}/comments` - 댓글 등록 + - [ ] `PUT /v1/support/inquiries/{id}/comments/{cid}` - 댓글 수정 + - [ ] `DELETE /v1/support/inquiries/{id}/comments/{cid}` - 댓글 삭제 + - [ ] `POST /v1/support/inquiries/{id}/reply` - 관리자 답변 (관리자용) + +- [ ] **Swagger 문서** + - [ ] `SupportApi.php` 작성 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +## 💼 Phase 8: D1.0 SaaS 확장 (예상 1-2주) + +> 기존 Plan/Subscription/Payment 모델 활용 + +### 8.1 구독관리 🆕 +> 슬라이드: 28 | 경로: 구독관리 + +**기존 구성요소:** +- `Plan` 모델: name, code, price, features(json) +- `Subscription` 모델: tenant_id, plan_id, started_at, ended_at, status + +- [ ] **서비스 확장** + - [ ] `SubscriptionService` 확장 + - [ ] 현재 구독 정보 조회 로직 + - [ ] 사용량 조회 로직 (사용자 수, 저장공간, API 호출) + - [ ] 자료 내보내기 로직 (비동기 처리) + - [ ] 서비스 해지 로직 (데이터 보관 정책) + +- [ ] **API 엔드포인트** (5개) + - [ ] `GET /v1/subscriptions/current` - 현재 구독 정보 + - [ ] `GET /v1/subscriptions/usage` - 사용량 조회 + - [ ] `POST /v1/subscriptions/export` - 자료 내보내기 요청 + - [ ] `GET /v1/subscriptions/export/{id}` - 내보내기 상태 조회 + - [ ] `POST /v1/subscriptions/cancel` - 서비스 해지 + +- [ ] **Swagger 문서** + - [ ] `SubscriptionApi.php` 작성 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +### 8.2 결제내역 🆕 +> 슬라이드: 29 | 경로: 결제내역 + +**기존 구성요소:** +- `Payment` 모델: subscription_id, amount, payment_method, paid_at, status + +- [ ] **서비스 확장** + - [ ] `PaymentService` 확장 + - [ ] 결제 내역 목록 조회 로직 + - [ ] 거래명세서 생성 로직 + +- [ ] **API 엔드포인트** (2개) + - [ ] `GET /v1/payments` - 결제 내역 목록 + - [ ] `GET /v1/payments/{id}/statement` - 거래명세서 조회 + +- [ ] **Swagger 문서** + - [ ] `PaymentApi.php` 작성 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +### 8.3 회사 추가 🔄 +> 슬라이드: 25-27 | 경로: 회사정보 + +- [ ] **서비스 구현** + - [ ] `CompanyService` 생성 + - [ ] 사업자등록번호 유효성 검사 (바로빌 연동) + - [ ] 회사 추가 신청 로직 (매니저 알림) + - [ ] 신청 목록 조회 (관리자용) + +- [ ] **API 엔드포인트** (3개) + - [ ] `POST /v1/companies/check` - 사업자등록번호 유효성 검사 + - [ ] `POST /v1/companies/request` - 회사 추가 신청 + - [ ] `GET /v1/companies/requests` - 회사 추가 신청 목록 (관리자용) + +- [ ] **Swagger 문서** + - [ ] `CompanyApi.php` 작성 + +- [ ] **테스트** + - [ ] Feature 테스트 작성 + - [ ] 수동 API 테스트 + +--- + +## 📋 기획 확인 필요 항목 + +> ⚠️ API 구현 전 비즈니스 로직 확정 필요 + +### D1.0 신규 확인 필요 +- [ ] 사용자 초대 시 권한 범위 (테넌트 단위 vs 전사) +- [ ] 악성채권 자동 판정 조건 (연체일수 기준, 기본 90일?) +- [ ] 팝업 노출 우선순위 (복수 팝업 시) +- [ ] 서비스 해지 시 데이터 보관 기간 +- [ ] 자료 내보내기 포맷 (Excel, CSV, JSON) +- [ ] 상단 노출 게시글 최대 개수 (기본 5개) +- [ ] 1:1 문의 상담분류 목록 (문의하기, 신고하기, 건의사항, 서비스 오류) + +### 기존 확인 사항 (D0.8) +- [ ] 테넌트: 신청→승인→만료→해지 전이 조건 +- [ ] 전자결재→회계: 지출결의서 승인 시 출금 자동 생성? +- [ ] 바로빌 API 비용 확인 + +--- + +## 📝 작업 일지 + +### 2025-12-19 +- [x] D1.0 스토리보드 분석 완료 (38페이지) +- [x] D0.8 대비 변경사항 식별 (신규 8개, 수정 4개) +- [x] D1.0 개발 계획 문서 작성 (Phase 5-8) +- [x] 기존 코드베이스 분석 (Board, Plan, Subscription 모델 확인) + +### YYYY-MM-DD +- [ ] (작업 내용 기록) + +--- + +## ✅ 완료 기준 + +### Phase 5 완료 조건 (기본 확장) +- [ ] 사용자 초대 API 구현 완료 +- [ ] 알림설정 API 확장 완료 +- [ ] 계정정보 API 확장 완료 +- [ ] 매출 거래명세서 API 구현 완료 +- [ ] Swagger 문서 완성 +- [ ] Pint 코드 포맷팅 완료 + +### Phase 6 완료 조건 (핵심 신규) +- [ ] 악성채권 추심관리 전체 구현 +- [ ] 팝업관리 전체 구현 +- [ ] 마이그레이션 검증 완료 +- [ ] Swagger 문서 완성 + +### Phase 7 완료 조건 (게시판 연동) +- [ ] 게시판관리 API 구현 완료 +- [ ] 게시판 (사용자용) API 구현 완료 +- [ ] 고객센터 API 구현 완료 +- [ ] 시드 데이터 (시스템 게시판) 등록 + +### Phase 8 완료 조건 (SaaS 확장) +- [ ] 구독관리 API 구현 완료 +- [ ] 결제내역 API 구현 완료 +- [ ] 회사 추가 API 구현 완료 +- [ ] 자료 내보내기 기능 구현 + +### 전체 완료 조건 +- [ ] 모든 D1.0 API 구현 완료 (~71개) +- [ ] Swagger 문서 100% +- [ ] 통합 테스트 통과 +- [ ] 프론트엔드 연동 준비 완료 + +--- + +## 🔗 관련 링크 + +- **기존 개발 계획**: [`erp-api-development-plan.md`](./erp-api-development-plan.md) +- **API Swagger UI**: http://sam.kr/api-docs/index.html +- **개발 공통 정책**: [`../guides/PROJECT_DEVELOPMENT_POLICY.md`](../guides/PROJECT_DEVELOPMENT_POLICY.md) +- **D1.0 스토리보드**: [`SAM_ERP_Storyboard_D1.0_251218/`](./SAM_ERP_Storyboard_D1.0_251218/) \ No newline at end of file