# ERP API 상세 스펙 > **작성일**: 2025-12-19 > **기준 문서**: [erp-api-development-plan.md](../plans/erp-api-development-plan.md) > **Swagger UI**: http://sam.kr/api-docs/index.html --- ## 📋 공통 사항 ### 인증 모든 API는 다음 인증이 필요합니다: - **API Key**: Header `X-Api-Key` 필수 - **Bearer Token**: Header `Authorization: Bearer {token}` (인증 필요 API) ### 공통 Response 형식 ```json { "success": true, "message": "message.key", "data": { ... } } ``` ### 페이지네이션 Response ```json { "success": true, "message": "message.fetched", "data": { "items": [...], "meta": { "current_page": 1, "per_page": 20, "total": 100, "last_page": 5 } } } ``` ### 공통 Query Parameters (LIST API) | 파라미터 | 타입 | 설명 | 기본값 | |----------|------|------|--------| | page | integer | 페이지 번호 | 1 | | per_page | integer | 페이지당 개수 | 20 | | sort | string | 정렬 필드 | created_at | | order | string | 정렬 방향 (asc/desc) | desc | | search | string | 검색어 | - | --- ## 1. 휴가 관리 (Leaves) ### 1.1 휴가 목록 조회 ``` GET /v1/leaves ``` **Query Parameters:** | 파라미터 | 타입 | 필수 | 설명 | |----------|------|------|------| | status | string | - | pending/approved/rejected/cancelled | | leave_type | string | - | annual/sick/personal/special | | user_id | integer | - | 특정 사용자 필터 | | start_date | date | - | 시작일 필터 (from) | | end_date | date | - | 종료일 필터 (to) | **Response:** ```json { "success": true, "data": { "items": [ { "id": 1, "user_id": 10, "user_name": "홍길동", "leave_type": "annual", "leave_type_name": "연차", "start_date": "2025-12-20", "end_date": "2025-12-22", "days": 3, "reason": "개인 사유", "status": "pending", "created_at": "2025-12-19T10:00:00Z" } ], "meta": {...} } } ``` ### 1.2 휴가 신청 ``` POST /v1/leaves ``` **Request Body:** ```json { "leave_type": "annual", "start_date": "2025-12-20", "end_date": "2025-12-22", "reason": "개인 사유" } ``` ### 1.3 잔여휴가 조회 ``` GET /v1/leaves/balance ``` **Response:** ```json { "success": true, "data": { "annual": { "total": 15, "used": 5, "remaining": 10 }, "sick": { "total": 3, "used": 0, "remaining": 3 }, "special": { "total": 5, "used": 2, "remaining": 3 } } } ``` --- ## 2. 근무/출퇴근 설정 ### 2.1 근무 설정 조회/수정 ``` GET /v1/settings/work PUT /v1/settings/work ``` **Request/Response:** ```json { "work_start_time": "09:00", "work_end_time": "18:00", "lunch_start_time": "12:00", "lunch_end_time": "13:00", "work_days": ["mon", "tue", "wed", "thu", "fri"], "overtime_rate": 1.5, "night_rate": 2.0 } ``` ### 2.2 출퇴근 설정 조회/수정 ``` GET /v1/settings/attendance PUT /v1/settings/attendance ``` **Request/Response:** ```json { "gps_required": true, "gps_radius": 100, "late_threshold_minutes": 10, "early_leave_threshold_minutes": 30, "allow_remote_check": false } ``` ### 2.3 현장 관리 (Sites) #### 현장 목록 ``` GET /v1/sites ``` **Query Parameters:** | 파라미터 | 타입 | 설명 | |----------|------|------| | is_active | boolean | 활성 상태 필터 | | search | string | 현장명 검색 | #### 현장 등록 ``` POST /v1/sites ``` **Request Body:** ```json { "name": "강남 현장", "address": "서울시 강남구 ...", "latitude": 37.5172, "longitude": 127.0473, "radius": 100, "is_active": true, "manager_id": 5, "description": "신축 공사 현장" } ``` --- ## 3. 카드/계좌 관리 ### 3.1 카드 등록 ``` POST /v1/cards ``` **Request Body:** ```json { "card_name": "법인카드1", "card_number": "1234-5678-9012-3456", "card_company": "신한카드", "holder_name": "홍길동", "expiry_date": "2028-12", "limit_amount": 5000000, "is_active": true } ``` **Note:** 카드번호는 암호화되어 저장됩니다 (Laravel Crypt) ### 3.2 계좌 등록 ``` POST /v1/bank-accounts ``` **Request Body:** ```json { "bank_name": "신한은행", "account_number": "110-123-456789", "account_holder": "주식회사 SAM", "account_type": "business", "balance": 10000000, "is_primary": false, "is_active": true } ``` ### 3.3 대표계좌 설정 ``` PATCH /v1/bank-accounts/{id}/set-primary ``` **Note:** 기존 대표계좌는 자동으로 해제됩니다. --- ## 4. 입금/출금 관리 ### 4.1 입금 등록 ``` POST /v1/deposits ``` **Request Body:** ```json { "deposit_date": "2025-12-19", "amount": 1000000, "client_id": 5, "bank_account_id": 1, "payment_method": "transfer", "description": "12월 매출 입금", "reference_no": "DEP-2025-001" } ``` **payment_method 옵션:** transfer(계좌이체), cash(현금), card(카드), check(수표) ### 4.2 입금 요약 조회 ``` GET /v1/deposits/summary ``` **Query Parameters:** | 파라미터 | 타입 | 설명 | |----------|------|------| | start_date | date | 조회 시작일 | | end_date | date | 조회 종료일 | **Response:** ```json { "success": true, "data": { "total_amount": 50000000, "by_payment_method": { "transfer": 30000000, "cash": 15000000, "card": 5000000 }, "count": 45 } } ``` ### 4.3 출금 등록 ``` POST /v1/withdrawals ``` **Request Body:** ```json { "withdrawal_date": "2025-12-19", "amount": 500000, "client_id": 10, "bank_account_id": 1, "payment_method": "transfer", "category": "expense", "description": "사무용품 구입", "reference_no": "WDR-2025-001" } ``` --- ## 5. 매출/매입 관리 ### 5.1 매출 등록 ``` POST /v1/sales ``` **Request Body:** ```json { "sale_date": "2025-12-19", "client_id": 5, "items": [ { "item_name": "상품A", "quantity": 10, "unit_price": 50000, "tax_rate": 10 } ], "supply_amount": 500000, "tax_amount": 50000, "total_amount": 550000, "status": "draft", "due_date": "2025-12-30", "description": "12월 매출" } ``` ### 5.2 매출 확정 ``` POST /v1/sales/{id}/confirm ``` **Note:** 확정 후에는 수정/삭제가 제한됩니다. ### 5.3 거래명세서 조회 ``` GET /v1/sales/{id}/statement ``` **Response:** ```json { "success": true, "data": { "statement_number": "STSL202512190001", "issued_at": null, "sale": { "id": 1, "sale_number": "SL202512190001", ... }, "seller": { "name": "(주)테스트회사", "business_number": "123-45-67890", "representative": "홍길동", "address": "서울시 강남구", "tel": "02-1234-5678", "email": "company@example.com" }, "buyer": { "name": "(주)거래처", "business_number": "987-65-43210", "representative": "김철수", "address": "서울시 서초구", "tel": "02-9876-5432", "email": "client@example.com" }, "items": [ { "description": "12월 매출", "quantity": 1, "unit_price": 1000000, "supply_amount": 1000000, "tax_amount": 100000, "total_amount": 1100000 } ], "summary": { "supply_amount": 1000000, "tax_amount": 100000, "total_amount": 1100000 } } } ``` ### 5.4 거래명세서 발행 ``` POST /v1/sales/{id}/statement/issue ``` **Note:** 확정(confirmed) 상태의 매출만 발행 가능합니다. **Response:** ```json { "success": true, "message": "message.sale.statement_issued", "data": { "statement_number": "STSL202512190001", "issued_at": "2025-12-19T10:30:00+09:00" } } ``` ### 5.5 거래명세서 이메일 발송 ``` POST /v1/sales/{id}/statement/send ``` **Request Body:** ```json { "email": "buyer@example.com", "message": "거래명세서를 발송합니다." } ``` **Note:** email 미입력 시 거래처 이메일로 발송됩니다. **Response:** ```json { "success": true, "message": "message.sale.statement_sent", "data": { "sent_to": "buyer@example.com", "sent_at": "2025-12-19T10:35:00+09:00", "statement_number": "STSL202512190001" } } ``` ### 5.6 매출 요약 ``` GET /v1/sales/summary ``` **Response:** ```json { "success": true, "data": { "total_supply_amount": 10000000, "total_tax_amount": 1000000, "total_amount": 11000000, "confirmed_amount": 8000000, "pending_amount": 3000000, "by_client": [ { "client_id": 5, "client_name": "거래처A", "total": 5000000 } ] } } ``` --- ## 6. 보고서 ### 6.1 일일 일보 ``` GET /v1/reports/daily ``` **Query Parameters:** | 파라미터 | 타입 | 필수 | 설명 | |----------|------|------|------| | date | date | O | 조회 기준일 | **Response:** ```json { "success": true, "data": { "date": "2025-12-19", "previous_balance": 50000000, "deposits": { "total": 5000000, "items": [...] }, "withdrawals": { "total": 2000000, "items": [...] }, "current_balance": 53000000 } } ``` ### 6.2 일일 일보 엑셀 다운로드 ``` GET /v1/reports/daily/export?date=2025-12-19 ``` **Response:** Excel 파일 다운로드 ### 6.3 지출 예상 내역서 ``` GET /v1/reports/expense-estimate ``` **Query Parameters:** | 파라미터 | 타입 | 설명 | |----------|------|------| | year | integer | 조회 연도 | | month | integer | 조회 월 | --- ## 7. 전자결재 ### 7.1 결재 양식 스키마 ```json { "id": 1, "name": "휴가신청서", "code": "LEAVE", "category": "hr", "fields": [ { "key": "leave_type", "label": "휴가유형", "type": "select", "required": true }, { "key": "start_date", "label": "시작일", "type": "date", "required": true }, { "key": "end_date", "label": "종료일", "type": "date", "required": true }, { "key": "reason", "label": "사유", "type": "textarea", "required": true } ], "is_active": true } ``` ### 7.2 결재 문서 작성 ``` POST /v1/approvals ``` **Request Body:** ```json { "form_id": 1, "title": "연차 휴가 신청", "content": { "leave_type": "annual", "start_date": "2025-12-20", "end_date": "2025-12-22", "reason": "개인 사유" }, "approval_line": [ { "user_id": 10, "type": "approval", "order": 1 }, { "user_id": 20, "type": "approval", "order": 2 }, { "user_id": 30, "type": "reference", "order": 3 } ] } ``` ### 7.3 결재 상신 ``` POST /v1/approvals/{id}/submit ``` ### 7.4 결재 승인/반려 ``` POST /v1/approvals/{id}/approve POST /v1/approvals/{id}/reject ``` **Request Body:** ```json { "comment": "승인합니다" // 또는 "반려 사유" } ``` ### 7.5 결재 상태 흐름 ``` draft → pending → approved/rejected ↓ cancelled (회수) ``` --- ## 8. 급여 관리 ### 8.1 급여 등록 ``` POST /v1/payrolls ``` **Request Body:** ```json { "user_id": 10, "pay_year": 2025, "pay_month": 12, "base_salary": 3500000, "allowances": { "position": 200000, "meal": 100000, "transport": 100000 }, "deductions": { "health_insurance": 125000, "long_term_care": 16000, "national_pension": 157500, "employment_insurance": 32000, "income_tax": 85000, "local_tax": 8500 } } ``` ### 8.2 급여 일괄 계산 ``` POST /v1/payrolls/calculate ``` **Request Body:** ```json { "pay_year": 2025, "pay_month": 12, "user_ids": [10, 11, 12] // 빈 배열이면 전체 직원 } ``` ### 8.3 급여명세서 조회 ``` GET /v1/payrolls/{id}/payslip ``` **Response:** ```json { "success": true, "data": { "employee": { "name": "홍길동", "department": "개발팀", "position": "대리" }, "pay_period": "2025-12", "earnings": { "base_salary": 3500000, "allowances": [...] }, "deductions": { "insurance": [...], "tax": [...] }, "gross_pay": 3900000, "total_deductions": 424000, "net_pay": 3476000 } } ``` ### 8.4 급여 설정 (4대보험 요율) ``` GET /v1/settings/payroll PUT /v1/settings/payroll ``` **Request/Response:** ```json { "health_insurance_rate": 3.545, "long_term_care_rate": 12.81, "national_pension_rate": 4.5, "employment_insurance_rate": 0.9, "income_tax_table": "2025" } ``` --- ## 9. 대시보드 ### 9.1 대시보드 요약 ``` GET /v1/dashboard/summary ``` **Response:** ```json { "success": true, "data": { "today": { "attendance_count": 45, "leave_count": 3, "late_count": 2 }, "finance": { "current_balance": 150000000, "today_deposits": 5000000, "today_withdrawals": 2000000 }, "sales": { "month_total": 50000000, "month_confirmed": 40000000 }, "approvals": { "pending": 5, "my_turn": 2 } } } ``` ### 9.2 차트 데이터 ``` GET /v1/dashboard/charts ``` **Query Parameters:** | 파라미터 | 타입 | 설명 | |----------|------|------| | period | string | week/month/quarter/year | **Response:** ```json { "success": true, "data": { "cash_flow": [ { "date": "2025-12-13", "deposits": 1000000, "withdrawals": 500000 }, { "date": "2025-12-14", "deposits": 2000000, "withdrawals": 800000 } ], "top_clients": [ { "client_name": "거래처A", "total": 10000000 }, { "client_name": "거래처B", "total": 8000000 } ] } } ``` --- ## 10. AI 리포트 ### 10.1 AI 리포트 생성 ``` POST /v1/reports/ai/generate ``` **Request Body:** ```json { "report_type": "financial_analysis", "analysis_areas": ["revenue", "expense", "cash_flow"], "period": { "start_date": "2025-12-01", "end_date": "2025-12-31" } } ``` **report_type 옵션:** - `financial_analysis` - 재무 분석 - `cash_flow_analysis` - 현금 흐름 분석 - `revenue_analysis` - 매출 분석 **Response:** ```json { "success": true, "data": { "id": 1, "status": "completed", "report_type": "financial_analysis", "content": { "summary": "12월 재무 현황 분석 결과...", "insights": [...], "recommendations": [...] }, "created_at": "2025-12-19T10:00:00Z" } } ``` --- ## 11. 가지급금 관리 ### 11.1 가지급금 등록 ``` POST /v1/loans ``` **Request Body:** ```json { "user_id": 10, "loan_date": "2025-12-19", "amount": 5000000, "purpose": "업무 관련 선지급", "due_date": "2026-01-31", "interest_rate": 4.6, "status": "active" } ``` ### 11.2 인정이자 계산 ``` POST /v1/loans/calculate-interest ``` **Request Body:** ```json { "loan_ids": [1, 2, 3], "calculation_date": "2025-12-31" } ``` **Response:** ```json { "success": true, "data": [ { "loan_id": 1, "principal": 5000000, "days": 12, "interest_rate": 4.6, "calculated_interest": 7562 } ] } ``` ### 11.3 연도별 인정이자 리포트 ``` GET /v1/loans/interest-report/2025 ``` --- ## 12. 바로빌 세금계산서 ### 12.1 바로빌 설정 ``` PUT /v1/barobill-settings ``` **Request Body:** ```json { "corp_num": "1234567890", "cert_key": "encrypted_key", "is_test_mode": false, "auto_issue": true, "default_email": "tax@company.com" } ``` ### 12.2 세금계산서 발행 ``` POST /v1/tax-invoices/{id}/issue ``` **Response:** ```json { "success": true, "message": "message.tax_invoice.issued", "data": { "id": 1, "issue_no": "20251219-12345678", "status": "issued", "nts_status": "pending", "issued_at": "2025-12-19T10:00:00Z" } } ``` ### 12.3 국세청 전송 상태 조회 ``` GET /v1/tax-invoices/{id}/check-status ``` **Response:** ```json { "success": true, "data": { "id": 1, "nts_status": "transmitted", "nts_message": "국세청 전송 완료", "checked_at": "2025-12-19T11:00:00Z" } } ``` **nts_status 옵션:** - `pending` - 전송 대기 - `transmitted` - 전송 완료 - `failed` - 전송 실패 --- ## 13. 사용자 초대 (Invitations) > Phase 5에서 추가된 API입니다. ### 13.1 초대 목록 조회 ``` GET /v1/users/invitations ``` **Query Parameters:** | 파라미터 | 타입 | 필수 | 설명 | |----------|------|------|------| | status | string | - | pending/accepted/expired/cancelled | | search | string | - | 이메일 검색 | | sort_by | string | - | created_at/expires_at/email | | sort_dir | string | - | asc/desc | | per_page | integer | - | 페이지당 개수 (기본 20) | | page | integer | - | 페이지 번호 | **Response:** ```json { "success": true, "data": { "items": [ { "id": 1, "email": "invited@example.com", "role_id": 2, "role_name": "일반 사용자", "message": "팀에 초대합니다", "status": "pending", "invited_by": 10, "invited_by_name": "홍길동", "expires_at": "2025-12-26T00:00:00Z", "created_at": "2025-12-19T10:00:00Z" } ], "meta": {...} } } ``` **status 옵션:** - `pending` - 대기 중 - `accepted` - 수락됨 - `expired` - 만료됨 - `cancelled` - 취소됨 ### 13.2 사용자 초대 발송 ``` POST /v1/users/invite ``` **Request Body:** ```json { "email": "newuser@example.com", "role_id": 2, "message": "우리 팀에 초대합니다!", "expires_days": 7 } ``` | 필드 | 타입 | 필수 | 설명 | |------|------|------|------| | email | string | ✓ | 초대할 이메일 | | role_id | integer | - | 부여할 역할 ID | | message | string | - | 초대 메시지 (최대 1000자) | | expires_days | integer | - | 만료일 (1~30일, 기본 7일) | **Response:** ```json { "success": true, "message": "message.invitation.sent", "data": { "id": 1, "email": "newuser@example.com", "token": "abc123xyz", "expires_at": "2025-12-26T10:00:00Z" } } ``` ### 13.3 초대 수락 ``` POST /v1/users/invitations/{token}/accept ``` **Request Body:** ```json { "name": "김철수", "password": "securePassword123", "password_confirmation": "securePassword123", "phone": "010-1234-5678" } ``` | 필드 | 타입 | 필수 | 설명 | |------|------|------|------| | name | string | ✓ | 사용자 이름 (최대 100자) | | password | string | ✓ | 비밀번호 (최소 8자) | | password_confirmation | string | ✓ | 비밀번호 확인 | | phone | string | - | 전화번호 (최대 20자) | **Response:** ```json { "success": true, "message": "message.invitation.accepted", "data": { "user_id": 25, "tenant_id": 1, "email": "newuser@example.com", "token": "sanctum_access_token..." } } ``` ### 13.4 초대 취소 ``` DELETE /v1/users/invitations/{id} ``` **Response:** ```json { "success": true, "message": "message.invitation.cancelled", "data": { "id": 1, "cancelled_at": "2025-12-19T15:00:00Z" } } ``` ### 13.5 초대 재발송 ``` POST /v1/users/invitations/{id}/resend ``` **Response:** ```json { "success": true, "message": "message.invitation.resent", "data": { "id": 1, "new_expires_at": "2025-12-26T15:00:00Z", "resent_at": "2025-12-19T15:00:00Z" } } ``` --- ## 14. 알림 설정 (Notification Settings) > Phase 5에서 추가된 API입니다. 모든 API는 `auth:sanctum` 인증이 필요합니다. ### 14.1 알림 설정 조회 ``` GET /v1/users/me/notification-settings ``` **Response:** ```json { "success": true, "data": { "settings": [ { "notification_type": "approval", "type_label": "전자결재", "push_enabled": true, "email_enabled": false, "sms_enabled": false, "in_app_enabled": true, "kakao_enabled": false, "settings": {} }, { "notification_type": "order", "type_label": "수주", "push_enabled": true, "email_enabled": false, "sms_enabled": false, "in_app_enabled": true, "kakao_enabled": false, "settings": {} } ], "types": { "approval": "전자결재", "order": "수주", "deposit": "입금", "withdrawal": "출금", "notice": "공지사항", "system": "시스템", "marketing": "마케팅", "security": "보안" }, "channels": { "push": "푸시 알림", "email": "이메일", "sms": "SMS", "in_app": "인앱 알림", "kakao": "카카오 알림톡" } } } ``` ### 14.2 알림 설정 수정 (단일) ``` PUT /v1/users/me/notification-settings ``` **Request Body:** ```json { "notification_type": "marketing", "push_enabled": true, "email_enabled": true, "sms_enabled": false, "in_app_enabled": true, "kakao_enabled": false, "settings": { "frequency": "daily" } } ``` | 필드 | 타입 | 필수 | 설명 | |------|------|------|------| | notification_type | string | ✓ | 알림 유형 | | push_enabled | boolean | - | 푸시 알림 | | email_enabled | boolean | - | 이메일 알림 | | sms_enabled | boolean | - | SMS 알림 | | in_app_enabled | boolean | - | 인앱 알림 | | kakao_enabled | boolean | - | 카카오 알림톡 | | settings | object | - | 추가 설정 | **notification_type 옵션:** - `approval` - 전자결재 - `order` - 수주 - `deposit` - 입금 - `withdrawal` - 출금 - `notice` - 공지사항 - `system` - 시스템 - `marketing` - 마케팅 - `security` - 보안 **Response:** ```json { "success": true, "message": "message.updated", "data": { "notification_type": "marketing", "push_enabled": true, "email_enabled": true, "sms_enabled": false, "in_app_enabled": true, "kakao_enabled": false, "settings": { "frequency": "daily" } } } ``` ### 14.3 알림 일괄 설정 ``` PUT /v1/users/me/notification-settings/bulk ``` **Request Body:** ```json { "settings": [ { "notification_type": "approval", "push_enabled": true, "email_enabled": true, "in_app_enabled": true }, { "notification_type": "marketing", "push_enabled": false, "email_enabled": false, "in_app_enabled": false } ] } ``` **Response:** ```json { "success": true, "message": "message.bulk_upsert", "data": { "updated_count": 2, "settings": [...] } } ``` --- ## 15. 계정 관리 (Account) > Phase 5에서 추가된 API입니다. 모든 API는 `auth:sanctum` 인증이 필요합니다. ### 15.1 회원 탈퇴 (SAM 완전 탈퇴) ``` POST /v1/account/withdraw ``` **Request Body:** ```json { "password": "currentPassword123", "reason": "not_using", "detail": "서비스를 더 이상 사용할 계획이 없습니다" } ``` | 필드 | 타입 | 필수 | 설명 | |------|------|------|------| | password | string | ✓ | 현재 비밀번호 (확인용) | | reason | string | - | 탈퇴 사유 코드 | | detail | string | - | 상세 사유 (최대 500자) | **reason 옵션:** - `not_using` - 서비스를 더 이상 사용하지 않음 - `difficult` - 사용하기 어려움 - `alternative` - 다른 서비스 이용 - `privacy` - 개인정보 보호 우려 - `other` - 기타 **Response:** ```json { "success": true, "message": "message.account.withdrawn", "data": { "withdrawn_at": "2025-12-19T16:00:00Z" } } ``` > ⚠️ **주의**: 회원 탈퇴 시 모든 테넌트에서 탈퇴되며, 계정은 Soft Delete 처리됩니다. ### 15.2 사용 중지 (특정 테넌트에서만 탈퇴) ``` POST /v1/account/suspend ``` **Response:** ```json { "success": true, "message": "message.account.suspended", "data": { "suspended": true, "new_default_tenant_id": 2 } } ``` > 다른 활성 테넌트가 있으면 해당 테넌트가 기본 테넌트로 설정됩니다. ### 15.3 약관 동의 정보 조회 ``` GET /v1/account/agreements ``` **Response:** ```json { "success": true, "data": { "agreements": { "terms": { "type": "terms", "label": "이용약관", "required": true, "agreed": true, "agreed_at": "2025-01-01T00:00:00Z" }, "privacy": { "type": "privacy", "label": "개인정보 처리방침", "required": true, "agreed": true, "agreed_at": "2025-01-01T00:00:00Z" }, "marketing": { "type": "marketing", "label": "마케팅 정보 수신", "required": false, "agreed": false, "agreed_at": null }, "push": { "type": "push", "label": "푸시 알림 수신", "required": false, "agreed": true, "agreed_at": "2025-06-15T10:00:00Z" }, "email": { "type": "email", "label": "이메일 수신", "required": false, "agreed": false, "agreed_at": null }, "sms": { "type": "sms", "label": "SMS 수신", "required": false, "agreed": false, "agreed_at": null } }, "types": { "terms": "이용약관", "privacy": "개인정보 처리방침", "marketing": "마케팅 정보 수신", "push": "푸시 알림 수신", "email": "이메일 수신", "sms": "SMS 수신" } } } ``` ### 15.4 약관 동의 정보 수정 ``` PUT /v1/account/agreements ``` **Request Body:** ```json { "agreements": [ { "type": "marketing", "agreed": true }, { "type": "email", "agreed": true } ] } ``` | 필드 | 타입 | 필수 | 설명 | |------|------|------|------| | agreements | array | ✓ | 약관 동의 배열 | | agreements[].type | string | ✓ | 약관 유형 | | agreements[].agreed | boolean | ✓ | 동의 여부 | **type 옵션:** - `terms` - 이용약관 (필수) - `privacy` - 개인정보 처리방침 (필수) - `marketing` - 마케팅 정보 수신 - `push` - 푸시 알림 수신 - `email` - 이메일 수신 - `sms` - SMS 수신 **Response:** ```json { "success": true, "message": "message.updated", "data": { "agreements": { "terms": {...}, "privacy": {...}, "marketing": { "type": "marketing", "label": "마케팅 정보 수신", "required": false, "agreed": true, "agreed_at": "2025-12-19T16:30:00Z" }, "email": { "type": "email", "label": "이메일 수신", "required": false, "agreed": true, "agreed_at": "2025-12-19T16:30:00Z" }, "sms": {...} } } } ``` --- ## 📝 에러 코드 | 코드 | 설명 | |------|------| | 400 | 잘못된 요청 (validation 실패) | | 401 | 인증 실패 | | 403 | 권한 없음 | | 404 | 리소스 없음 | | 409 | 충돌 (중복 등) | | 422 | 처리 불가 (비즈니스 로직 오류) | | 500 | 서버 오류 | --- ## 🔗 관련 문서 - [ERP API 목록](./erp-api-list.md) - [ERP API 개발 계획](../plans/erp-api-development-plan.md) - Swagger UI: http://sam.kr/api-docs/index.html