2025-08-25 17:26:20 +09:00
|
|
|
<?php
|
2025-11-06 17:24:42 +09:00
|
|
|
|
2025-08-25 17:26:20 +09:00
|
|
|
/**
|
|
|
|
|
* 성공/안내/일반 메시지 (비에러)
|
|
|
|
|
* - API 정상 응답의 message 필드용
|
|
|
|
|
* - 도메인 공통 키와 리소스별 하위 그룹을 혼합 사용
|
|
|
|
|
* - 예: return ApiResponse::success($data, __('message.created'));
|
|
|
|
|
*/
|
|
|
|
|
return [
|
|
|
|
|
|
|
|
|
|
// 공통 (CRUD/편의)
|
2025-11-06 17:24:42 +09:00
|
|
|
'fetched' => '조회 성공',
|
|
|
|
|
'created' => '등록 성공',
|
|
|
|
|
'updated' => '수정 성공',
|
|
|
|
|
'deleted' => '삭제 성공',
|
|
|
|
|
'restored' => '복구 성공',
|
|
|
|
|
'toggled' => '상태 변경 성공',
|
2025-08-25 17:26:20 +09:00
|
|
|
'bulk_upsert' => '대량 저장 성공',
|
2025-11-06 17:24:42 +09:00
|
|
|
'reordered' => '정렬 변경 성공',
|
2025-11-26 14:09:31 +09:00
|
|
|
'linked' => '연결 성공',
|
|
|
|
|
'unlinked' => '연결 해제 성공',
|
2025-11-06 17:24:42 +09:00
|
|
|
'no_changes' => '변경 사항이 없습니다.',
|
2025-08-25 17:26:20 +09:00
|
|
|
|
|
|
|
|
// 인증/세션
|
2025-11-06 17:24:42 +09:00
|
|
|
'login_success' => '로그인 성공',
|
2025-08-25 17:26:20 +09:00
|
|
|
'logout_success' => '로그아웃 되었습니다.',
|
|
|
|
|
'signup_success' => '회원가입이 완료되었습니다.',
|
2025-11-10 09:11:41 +09:00
|
|
|
'registered' => '회원가입 처리',
|
2025-11-10 11:17:32 +09:00
|
|
|
'token_refreshed' => '토큰이 갱신되었습니다',
|
2025-08-25 17:26:20 +09:00
|
|
|
|
|
|
|
|
// 테넌트/컨텍스트
|
|
|
|
|
'tenant_switched' => '활성 테넌트가 전환되었습니다.',
|
|
|
|
|
|
|
|
|
|
// 리소스별 세부 (필요 시)
|
2025-11-17 11:22:49 +09:00
|
|
|
'item' => [
|
|
|
|
|
'fetched' => '품목을 조회했습니다.',
|
|
|
|
|
'created' => '품목이 등록되었습니다.',
|
|
|
|
|
'updated' => '품목이 수정되었습니다.',
|
|
|
|
|
'deleted' => '품목이 삭제되었습니다.',
|
2025-11-30 21:06:22 +09:00
|
|
|
'batch_deleted' => '품목이 일괄 삭제되었습니다.',
|
2025-11-17 11:22:49 +09:00
|
|
|
],
|
|
|
|
|
|
2025-08-25 17:26:20 +09:00
|
|
|
'product' => [
|
2025-11-07 02:29:51 +09:00
|
|
|
'fetched' => '제품을 조회했습니다.',
|
|
|
|
|
'category_fetched' => '제품 카테고리를 조회했습니다.',
|
2025-11-06 17:24:42 +09:00
|
|
|
'created' => '제품이 등록되었습니다.',
|
|
|
|
|
'updated' => '제품이 수정되었습니다.',
|
|
|
|
|
'deleted' => '제품이 삭제되었습니다.',
|
|
|
|
|
'toggled' => '제품 상태가 변경되었습니다.',
|
2025-11-07 02:29:51 +09:00
|
|
|
'searched' => '제품을 검색했습니다.',
|
2025-08-25 17:26:20 +09:00
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'bom' => [
|
2025-11-06 17:24:42 +09:00
|
|
|
'fetched' => 'BOM 항목을 조회했습니다.',
|
2025-11-17 11:45:16 +09:00
|
|
|
'created' => 'BOM 항목이 등록되었습니다.',
|
|
|
|
|
'updated' => 'BOM 항목이 수정되었습니다.',
|
|
|
|
|
'deleted' => 'BOM 항목이 삭제되었습니다.',
|
2025-08-25 17:26:20 +09:00
|
|
|
'bulk_upsert' => 'BOM 항목이 저장되었습니다.',
|
2025-11-06 17:24:42 +09:00
|
|
|
'reordered' => 'BOM 정렬이 변경되었습니다.',
|
|
|
|
|
'fetch' => 'BOM 항목 조회',
|
|
|
|
|
'create' => 'BOM 항목 등록',
|
|
|
|
|
'update' => 'BOM 항목 수정',
|
|
|
|
|
'delete' => 'BOM 항목 삭제',
|
|
|
|
|
'restore' => 'BOM 항목 복구',
|
2025-08-25 17:26:20 +09:00
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'category' => [
|
2025-11-07 02:47:30 +09:00
|
|
|
'fetched' => '카테고리를 조회했습니다.',
|
|
|
|
|
'created' => '카테고리가 등록되었습니다.',
|
|
|
|
|
'updated' => '카테고리가 수정되었습니다.',
|
|
|
|
|
'deleted' => '카테고리가 삭제되었습니다.',
|
|
|
|
|
'toggled' => '카테고리 상태가 변경되었습니다.',
|
|
|
|
|
'moved' => '카테고리가 이동되었습니다.',
|
|
|
|
|
'reordered' => '카테고리 정렬순서가 변경되었습니다.',
|
|
|
|
|
'tree_fetched' => '카테고리 트리를 조회했습니다.',
|
2025-11-06 17:24:42 +09:00
|
|
|
'fields_saved' => '카테고리 필드가 저장되었습니다.',
|
2025-08-25 17:26:20 +09:00
|
|
|
'template_saved' => '카테고리 템플릿이 저장되었습니다.',
|
|
|
|
|
'template_applied' => '카테고리 템플릿이 적용되었습니다.',
|
|
|
|
|
],
|
2025-09-11 13:34:20 +09:00
|
|
|
|
2025-11-14 13:45:54 +09:00
|
|
|
'category_field' => [
|
|
|
|
|
'fetched' => '카테고리 필드를 조회했습니다.',
|
|
|
|
|
'created' => '카테고리 필드가 생성되었습니다.',
|
|
|
|
|
'updated' => '카테고리 필드가 수정되었습니다.',
|
|
|
|
|
'deleted' => '카테고리 필드가 삭제되었습니다.',
|
|
|
|
|
'reordered' => '카테고리 필드 정렬이 변경되었습니다.',
|
|
|
|
|
'bulk_upsert' => '카테고리 필드가 일괄 저장되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-09-11 13:34:20 +09:00
|
|
|
'design' => [
|
|
|
|
|
'template_cloned' => 'BOM 템플릿이 복제되었습니다.',
|
2025-11-06 17:24:42 +09:00
|
|
|
'template_diff' => 'BOM 템플릿 차이를 계산했습니다.',
|
2025-09-11 13:34:20 +09:00
|
|
|
],
|
2025-09-24 17:41:26 +09:00
|
|
|
|
|
|
|
|
'model_set' => [
|
2025-11-06 17:24:42 +09:00
|
|
|
'cloned' => '모델셋이 복제되었습니다.',
|
|
|
|
|
'calculated' => 'BOM 계산이 완료되었습니다.',
|
2025-09-24 17:41:26 +09:00
|
|
|
],
|
|
|
|
|
|
|
|
|
|
'estimate' => [
|
2025-11-06 17:24:42 +09:00
|
|
|
'cloned' => '견적이 복제되었습니다.',
|
2025-09-24 17:41:26 +09:00
|
|
|
'status_changed' => '견적 상태가 변경되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 계산 관련
|
|
|
|
|
'calculated' => '계산 완료',
|
2025-09-24 20:35:17 +09:00
|
|
|
|
|
|
|
|
// 설정 관리 (Settings & Configuration 통합)
|
|
|
|
|
'settings' => [
|
2025-11-06 17:24:42 +09:00
|
|
|
'fields_updated' => '필드 설정이 업데이트되었습니다.',
|
|
|
|
|
'fields_bulk_saved' => '필드 설정 일괄 저장이 완료되었습니다.',
|
|
|
|
|
'options_saved' => '옵션 그룹이 저장되었습니다.',
|
|
|
|
|
'options_reordered' => '옵션 값 정렬이 변경되었습니다.',
|
|
|
|
|
'common_code_saved' => '공통 코드가 저장되었습니다.',
|
2025-09-24 20:35:17 +09:00
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 자재 관리 (Products & Materials 통합)
|
2025-11-07 02:37:18 +09:00
|
|
|
'material' => [
|
|
|
|
|
'fetched' => '자재를 조회했습니다.',
|
2025-11-06 17:24:42 +09:00
|
|
|
'created' => '자재가 등록되었습니다.',
|
|
|
|
|
'updated' => '자재가 수정되었습니다.',
|
|
|
|
|
'deleted' => '자재가 삭제되었습니다.',
|
2025-09-24 20:35:17 +09:00
|
|
|
],
|
|
|
|
|
|
2025-12-26 15:18:08 +09:00
|
|
|
// 입고 관리
|
|
|
|
|
'receiving' => [
|
|
|
|
|
'fetched' => '입고를 조회했습니다.',
|
|
|
|
|
'created' => '입고가 등록되었습니다.',
|
|
|
|
|
'updated' => '입고가 수정되었습니다.',
|
|
|
|
|
'deleted' => '입고가 삭제되었습니다.',
|
|
|
|
|
'processed' => '입고처리가 완료되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 재고 관리
|
|
|
|
|
'stock' => [
|
|
|
|
|
'fetched' => '재고를 조회했습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-12-17 20:57:38 +09:00
|
|
|
// 단가 관리
|
|
|
|
|
'pricing' => [
|
|
|
|
|
'created' => '단가가 등록되었습니다.',
|
|
|
|
|
'updated' => '단가가 수정되었습니다.',
|
|
|
|
|
'deleted' => '단가가 삭제되었습니다.',
|
|
|
|
|
'finalized' => '단가가 확정되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-11-07 02:40:18 +09:00
|
|
|
// 거래처 관리
|
|
|
|
|
'client' => [
|
|
|
|
|
'fetched' => '거래처를 조회했습니다.',
|
|
|
|
|
'created' => '거래처가 등록되었습니다.',
|
|
|
|
|
'updated' => '거래처가 수정되었습니다.',
|
|
|
|
|
'deleted' => '거래처가 삭제되었습니다.',
|
|
|
|
|
'toggled' => '거래처 상태가 변경되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-11-07 02:44:11 +09:00
|
|
|
// 사용자 관리
|
|
|
|
|
'user' => [
|
|
|
|
|
'fetched' => '사용자를 조회했습니다.',
|
|
|
|
|
'me_fetched' => '나의 정보를 조회했습니다.',
|
|
|
|
|
'me_updated' => '나의 정보가 수정되었습니다.',
|
|
|
|
|
'password_changed' => '비밀번호가 변경되었습니다.',
|
|
|
|
|
'tenants_fetched' => '나의 테넌트 목록을 조회했습니다.',
|
|
|
|
|
'tenant_switched' => '활성 테넌트가 전환되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-11-07 02:47:30 +09:00
|
|
|
// 테넌트 관리
|
|
|
|
|
'tenant' => [
|
|
|
|
|
'fetched' => '테넌트를 조회했습니다.',
|
|
|
|
|
'created' => '테넌트가 등록되었습니다.',
|
|
|
|
|
'updated' => '테넌트가 수정되었습니다.',
|
|
|
|
|
'deleted' => '테넌트가 삭제되었습니다.',
|
|
|
|
|
'restored' => '테넌트가 복구되었습니다.',
|
2025-12-30 22:58:50 +09:00
|
|
|
'logo_uploaded' => '회사 로고가 업로드되었습니다.',
|
2025-11-07 02:47:30 +09:00
|
|
|
],
|
|
|
|
|
|
2025-11-14 14:09:53 +09:00
|
|
|
'tenant_stat_field' => [
|
|
|
|
|
'fetched' => '통계 필드를 조회했습니다.',
|
|
|
|
|
'created' => '통계 필드가 생성되었습니다.',
|
|
|
|
|
'updated' => '통계 필드가 수정되었습니다.',
|
|
|
|
|
'deleted' => '통계 필드가 삭제되었습니다.',
|
|
|
|
|
'reordered' => '통계 필드 정렬이 변경되었습니다.',
|
|
|
|
|
'bulk_upsert' => '통계 필드가 일괄 저장되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-09-24 20:35:17 +09:00
|
|
|
// 파일 관리
|
|
|
|
|
'file' => [
|
|
|
|
|
'uploaded' => '파일이 업로드되었습니다.',
|
2025-11-06 17:24:42 +09:00
|
|
|
'deleted' => '파일이 삭제되었습니다.',
|
|
|
|
|
'fetched' => '파일 목록을 조회했습니다.',
|
2025-09-24 20:35:17 +09:00
|
|
|
],
|
feat: 파일 저장 시스템 DB 마이그레이션
- enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원
- create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능)
- 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants)
- FolderSeeder stub 생성
- CURRENT_WORKS.md에 Phase 1 진행상황 문서화
fix: 파일 공유 및 삭제 기능 버그 수정
- ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합
- routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요)
- FileShareLink: File, Tenant 클래스 import 추가
- File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용
- FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용
- File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant)
refactor: Swagger 문서 정리 - File 태그를 Files로 통합
- FileApi.php의 모든 태그를 Files로 변경
- 구 파일 시스템 라우트 삭제 (prefix 'file')
- 구 FileController.php 삭제
- 신규 파일 저장소 시스템으로 완전 통합
fix: 모든 legacy 파일 컬럼 nullable 일괄 처리
- 5개 legacy 컬럼을 한 번에 nullable로 변경
* original_name, file_name, file_name_old (string)
* fileable_id, fileable_type (polymorphic)
- foreach 루프로 반복 작업 자동화
- 신규/기존 시스템 간 완전한 하위 호환성 확보
fix: legacy 파일 컬럼 nullable 처리 완료
- file_name, file_name_old 컬럼도 nullable로 변경
- 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보
- Legacy: original_name, file_name, file_name_old (nullable)
- New: display_name, stored_name (required)
fix: original_name 컬럼 nullable 처리
- original_name을 nullable로 변경하여 하위 호환성 유지
- 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능
fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선
- files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by)
- ApiResponse::handle() 메시지 로직 개선 (접미사 제거)
- 다국어 지원을 위한 완성된 문장 구조 유지
- FileUploadRequest 파일 검증 규칙 수정
fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성
- FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant)
- FileStorageController use 문 구문 오류 수정 (/ → \)
- TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가
- 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반)
- 에러 처리 및 로깅
- 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
|
|
|
|
|
|
|
|
// 파일 저장소
|
|
|
|
|
'file_uploaded' => '파일이 업로드되었습니다.',
|
|
|
|
|
'files_moved' => '파일이 이동되었습니다.',
|
|
|
|
|
'file_deleted' => '파일이 삭제되었습니다.',
|
|
|
|
|
'file_restored' => '파일이 복구되었습니다.',
|
|
|
|
|
'file_permanently_deleted' => '파일이 영구 삭제되었습니다.',
|
|
|
|
|
'share_link_created' => '공유 링크가 생성되었습니다.',
|
|
|
|
|
'storage_exceeded_grace_period' => '저장소 용량이 초과되었습니다. 유예 기간이 적용됩니다.',
|
|
|
|
|
|
|
|
|
|
// 폴더 관리
|
|
|
|
|
'folder_created' => '폴더가 생성되었습니다.',
|
|
|
|
|
'folder_updated' => '폴더가 수정되었습니다.',
|
|
|
|
|
'folder_deleted' => '폴더가 비활성화되었습니다.',
|
|
|
|
|
'folders_reordered' => '폴더 순서가 변경되었습니다.',
|
feat: [quote] 견적 API Phase 2-3 완료 (Service + Controller Layer)
Phase 2 - Service Layer:
- QuoteService: 견적 CRUD + 상태관리 (확정/전환)
- QuoteNumberService: 견적번호 채번 (KD-{PREFIX}-YYMMDD-SEQ)
- FormulaEvaluatorService: 수식 평가 엔진 (SUM, IF, ROUND 등)
- QuoteCalculationService: 자동산출 (스크린/철재 제품)
- QuoteDocumentService: PDF 생성 및 이메일/카카오 발송
Phase 3 - Controller Layer:
- QuoteController: 16개 엔드포인트
- FormRequest 7개: Index, Store, Update, BulkDelete, Calculate, SendEmail, SendKakao
- QuoteApi.php: Swagger 문서 (12개 스키마, 16개 엔드포인트)
- routes/api.php: 16개 라우트 등록
i18n 키 추가:
- error.php: quote_not_found, formula_* 등
- message.php: quote.* 성공 메시지
2025-12-04 22:03:40 +09:00
|
|
|
|
|
|
|
|
// 견적 관리
|
|
|
|
|
'quote' => [
|
|
|
|
|
'fetched' => '견적을 조회했습니다.',
|
|
|
|
|
'created' => '견적이 등록되었습니다.',
|
|
|
|
|
'updated' => '견적이 수정되었습니다.',
|
|
|
|
|
'deleted' => '견적이 삭제되었습니다.',
|
|
|
|
|
'bulk_deleted' => '견적이 일괄 삭제되었습니다.',
|
|
|
|
|
'finalized' => '견적이 확정되었습니다.',
|
|
|
|
|
'finalize_cancelled' => '견적 확정이 취소되었습니다.',
|
|
|
|
|
'converted' => '견적이 수주로 전환되었습니다.',
|
|
|
|
|
'calculated' => '견적 자동산출이 완료되었습니다.',
|
|
|
|
|
'pdf_generated' => '견적서 PDF가 생성되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
'quote_email_sent' => '견적서가 이메일로 발송되었습니다.',
|
|
|
|
|
'quote_kakao_sent' => '견적서가 카카오톡으로 발송되었습니다.',
|
2025-12-17 20:13:48 +09:00
|
|
|
|
|
|
|
|
// 휴가 관리
|
|
|
|
|
'leave' => [
|
|
|
|
|
'fetched' => '휴가를 조회했습니다.',
|
|
|
|
|
'created' => '휴가가 신청되었습니다.',
|
|
|
|
|
'updated' => '휴가가 수정되었습니다.',
|
|
|
|
|
'deleted' => '휴가가 삭제되었습니다.',
|
|
|
|
|
'approved' => '휴가가 승인되었습니다.',
|
|
|
|
|
'rejected' => '휴가가 반려되었습니다.',
|
|
|
|
|
'cancelled' => '휴가가 취소되었습니다.',
|
|
|
|
|
'balance_fetched' => '잔여 휴가를 조회했습니다.',
|
|
|
|
|
'balance_updated' => '휴가 일수가 설정되었습니다.',
|
|
|
|
|
],
|
feat: 근무/출퇴근 설정 및 현장 관리 API 구현
- 근무 설정 API (GET/PUT /settings/work)
- 근무유형, 소정근로시간, 연장근로시간, 근무요일, 출퇴근시간, 휴게시간
- 출퇴근 설정 API (GET/PUT /settings/attendance)
- GPS 출퇴근, 허용 반경, 본사 위치 설정
- 현장 관리 API (CRUD /sites)
- 현장 등록/수정/삭제, 활성화된 현장 목록(셀렉트박스용)
- GPS 좌표 기반 위치 관리
마이그레이션: work_settings, attendance_settings, sites 테이블
모델: WorkSetting, AttendanceSetting, Site (BelongsToTenant, SoftDeletes)
서비스: WorkSettingService, SiteService
Swagger 문서 및 i18n 메시지 키 추가
2025-12-17 20:46:37 +09:00
|
|
|
|
feat: [approval] 전자결재 모듈 API 구현
- 마이그레이션 4개 (approval_forms, approval_lines, approvals, approval_steps)
- 모델 4개 (ApprovalForm, ApprovalLine, Approval, ApprovalStep)
- ApprovalService 비즈니스 로직 (양식/결재선 CRUD, 기안함/결재함/참조함, 결재 액션)
- 컨트롤러 3개 (ApprovalFormController, ApprovalLineController, ApprovalController)
- FormRequest 13개 (양식/결재선/문서 검증)
- Swagger 문서 3개 (26개 엔드포인트)
- i18n 메시지/에러 키 추가
- 라우트 26개 등록
2025-12-17 23:23:20 +09:00
|
|
|
// 전자결재 관리
|
|
|
|
|
'approval' => [
|
|
|
|
|
'fetched' => '결재 문서를 조회했습니다.',
|
|
|
|
|
'created' => '결재 문서가 작성되었습니다.',
|
|
|
|
|
'updated' => '결재 문서가 수정되었습니다.',
|
|
|
|
|
'deleted' => '결재 문서가 삭제되었습니다.',
|
|
|
|
|
'submitted' => '결재가 상신되었습니다.',
|
|
|
|
|
'approved' => '결재가 승인되었습니다.',
|
|
|
|
|
'rejected' => '결재가 반려되었습니다.',
|
|
|
|
|
'cancelled' => '결재가 회수되었습니다.',
|
|
|
|
|
'marked_read' => '열람 처리되었습니다.',
|
|
|
|
|
'marked_unread' => '미열람 처리되었습니다.',
|
|
|
|
|
'form_created' => '결재 양식이 등록되었습니다.',
|
|
|
|
|
'form_updated' => '결재 양식이 수정되었습니다.',
|
|
|
|
|
'form_deleted' => '결재 양식이 삭제되었습니다.',
|
|
|
|
|
'line_created' => '결재선이 등록되었습니다.',
|
|
|
|
|
'line_updated' => '결재선이 수정되었습니다.',
|
|
|
|
|
'line_deleted' => '결재선이 삭제되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
feat: 근무/출퇴근 설정 및 현장 관리 API 구현
- 근무 설정 API (GET/PUT /settings/work)
- 근무유형, 소정근로시간, 연장근로시간, 근무요일, 출퇴근시간, 휴게시간
- 출퇴근 설정 API (GET/PUT /settings/attendance)
- GPS 출퇴근, 허용 반경, 본사 위치 설정
- 현장 관리 API (CRUD /sites)
- 현장 등록/수정/삭제, 활성화된 현장 목록(셀렉트박스용)
- GPS 좌표 기반 위치 관리
마이그레이션: work_settings, attendance_settings, sites 테이블
모델: WorkSetting, AttendanceSetting, Site (BelongsToTenant, SoftDeletes)
서비스: WorkSettingService, SiteService
Swagger 문서 및 i18n 메시지 키 추가
2025-12-17 20:46:37 +09:00
|
|
|
// 근무 설정 관리
|
|
|
|
|
'work_setting' => [
|
|
|
|
|
'fetched' => '근무 설정을 조회했습니다.',
|
|
|
|
|
'updated' => '근무 설정이 수정되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 출퇴근 설정 관리
|
|
|
|
|
'attendance_setting' => [
|
|
|
|
|
'fetched' => '출퇴근 설정을 조회했습니다.',
|
|
|
|
|
'updated' => '출퇴근 설정이 수정되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 현장 관리
|
|
|
|
|
'site' => [
|
|
|
|
|
'fetched' => '현장을 조회했습니다.',
|
|
|
|
|
'created' => '현장이 등록되었습니다.',
|
|
|
|
|
'updated' => '현장이 수정되었습니다.',
|
|
|
|
|
'deleted' => '현장이 삭제되었습니다.',
|
|
|
|
|
'active_fetched' => '활성화된 현장 목록을 조회했습니다.',
|
|
|
|
|
],
|
2025-12-17 22:51:17 +09:00
|
|
|
|
2026-01-09 10:18:43 +09:00
|
|
|
// 계약 관리 (시공관리)
|
|
|
|
|
'contract' => [
|
|
|
|
|
'fetched' => '계약을 조회했습니다.',
|
|
|
|
|
'created' => '계약이 등록되었습니다.',
|
|
|
|
|
'updated' => '계약이 수정되었습니다.',
|
|
|
|
|
'deleted' => '계약이 삭제되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-12-17 22:51:17 +09:00
|
|
|
// 보고서 관리
|
|
|
|
|
'report' => [
|
|
|
|
|
'fetched' => '보고서를 조회했습니다.',
|
|
|
|
|
'daily_fetched' => '일일 일보를 조회했습니다.',
|
|
|
|
|
'expense_estimate_fetched' => '지출 예상 내역서를 조회했습니다.',
|
|
|
|
|
'exported' => '보고서가 다운로드되었습니다.',
|
|
|
|
|
'deposit' => '입금',
|
|
|
|
|
'withdrawal' => '출금',
|
|
|
|
|
'purchase' => '매입',
|
|
|
|
|
],
|
2025-12-18 10:56:16 +09:00
|
|
|
|
feat: Phase 5 API 개발 완료 (사용자 초대, 알림설정, 계정관리, 거래명세서)
5.1 사용자 초대 기능:
- UserInvitation 마이그레이션, 모델, 서비스, 컨트롤러, Swagger
- 초대 발송/수락/취소/재발송 API
5.2 알림설정 확장:
- NotificationSetting 마이그레이션, 모델, 서비스, 컨트롤러, Swagger
- 채널별/유형별 알림 설정 관리
5.3 계정정보 수정 API:
- 회원탈퇴, 사용중지, 약관동의 관리
- AccountService, AccountController, Swagger
5.4 매출 거래명세서 API:
- 거래명세서 조회/발행/이메일발송
- SaleService 확장, Swagger 문서화
2025-12-19 14:52:53 +09:00
|
|
|
// 매출 관리
|
|
|
|
|
'sale' => [
|
|
|
|
|
'confirmed' => '매출이 확정되었습니다.',
|
|
|
|
|
'statement_issued' => '거래명세서가 발행되었습니다.',
|
|
|
|
|
'statement_sent' => '거래명세서가 발송되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-12-18 10:56:16 +09:00
|
|
|
// 급여 관리
|
|
|
|
|
'payroll' => [
|
|
|
|
|
'fetched' => '급여를 조회했습니다.',
|
|
|
|
|
'created' => '급여가 등록되었습니다.',
|
|
|
|
|
'updated' => '급여가 수정되었습니다.',
|
|
|
|
|
'deleted' => '급여가 삭제되었습니다.',
|
|
|
|
|
'confirmed' => '급여가 확정되었습니다.',
|
|
|
|
|
'paid' => '급여가 지급 처리되었습니다.',
|
|
|
|
|
'bulk_confirmed' => '급여가 일괄 확정되었습니다.',
|
|
|
|
|
'calculated' => '급여가 일괄 계산되었습니다.',
|
|
|
|
|
'payslip_fetched' => '급여명세서를 조회했습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 급여 설정 관리
|
|
|
|
|
'payroll_setting' => [
|
|
|
|
|
'fetched' => '급여 설정을 조회했습니다.',
|
|
|
|
|
'updated' => '급여 설정이 수정되었습니다.',
|
|
|
|
|
],
|
2025-12-18 11:23:35 +09:00
|
|
|
|
|
|
|
|
// 대시보드
|
|
|
|
|
'dashboard' => [
|
|
|
|
|
'unknown_client' => '미지정',
|
|
|
|
|
],
|
2025-12-18 13:51:40 +09:00
|
|
|
|
|
|
|
|
// AI 리포트
|
|
|
|
|
'ai_report' => [
|
|
|
|
|
'fetched' => 'AI 리포트를 조회했습니다.',
|
|
|
|
|
'generated' => 'AI 리포트가 생성되었습니다.',
|
|
|
|
|
'deleted' => 'AI 리포트가 삭제되었습니다.',
|
|
|
|
|
],
|
2025-12-18 14:21:37 +09:00
|
|
|
// 가지급금 관리
|
|
|
|
|
'loan' => [
|
|
|
|
|
'fetched' => '가지급금을 조회했습니다.',
|
|
|
|
|
'created' => '가지급금이 등록되었습니다.',
|
|
|
|
|
'updated' => '가지급금이 수정되었습니다.',
|
|
|
|
|
'deleted' => '가지급금이 삭제되었습니다.',
|
|
|
|
|
'settled' => '가지급금이 정산되었습니다.',
|
|
|
|
|
'summary_fetched' => '가지급금 요약을 조회했습니다.',
|
|
|
|
|
'interest_calculated' => '인정이자가 계산되었습니다.',
|
|
|
|
|
'interest_report_fetched' => '인정이자 리포트를 조회했습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 내부 서버간 통신
|
|
|
|
|
'internal' => [
|
|
|
|
|
'token_exchanged' => '토큰이 발급되었습니다.',
|
|
|
|
|
],
|
feat: Phase 5 API 개발 완료 (사용자 초대, 알림설정, 계정관리, 거래명세서)
5.1 사용자 초대 기능:
- UserInvitation 마이그레이션, 모델, 서비스, 컨트롤러, Swagger
- 초대 발송/수락/취소/재발송 API
5.2 알림설정 확장:
- NotificationSetting 마이그레이션, 모델, 서비스, 컨트롤러, Swagger
- 채널별/유형별 알림 설정 관리
5.3 계정정보 수정 API:
- 회원탈퇴, 사용중지, 약관동의 관리
- AccountService, AccountController, Swagger
5.4 매출 거래명세서 API:
- 거래명세서 조회/발행/이메일발송
- SaleService 확장, Swagger 문서화
2025-12-19 14:52:53 +09:00
|
|
|
|
|
|
|
|
// 사용자 초대 관리
|
|
|
|
|
'invitation' => [
|
|
|
|
|
'sent' => '초대가 발송되었습니다.',
|
|
|
|
|
'accepted' => '초대가 수락되었습니다.',
|
|
|
|
|
'cancelled' => '초대가 취소되었습니다.',
|
|
|
|
|
'resent' => '초대가 재발송되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 알림 설정 관리
|
|
|
|
|
'notification_setting' => [
|
|
|
|
|
'fetched' => '알림 설정을 조회했습니다.',
|
|
|
|
|
'updated' => '알림 설정이 수정되었습니다.',
|
|
|
|
|
'bulk_updated' => '알림 설정이 일괄 저장되었습니다.',
|
|
|
|
|
'initialized' => '알림 설정이 초기화되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 계정 관리
|
|
|
|
|
'account' => [
|
|
|
|
|
'withdrawn' => '회원 탈퇴가 완료되었습니다.',
|
|
|
|
|
'suspended' => '사용 중지가 완료되었습니다.',
|
|
|
|
|
'agreements_updated' => '약관 동의 정보가 수정되었습니다.',
|
|
|
|
|
],
|
2025-12-19 16:53:49 +09:00
|
|
|
|
|
|
|
|
// 구독 관리
|
|
|
|
|
'subscription' => [
|
|
|
|
|
'cancelled' => '구독이 취소되었습니다.',
|
|
|
|
|
'renewed' => '구독이 갱신되었습니다.',
|
|
|
|
|
'suspended' => '구독이 일시정지되었습니다.',
|
|
|
|
|
'resumed' => '구독이 재개되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 데이터 내보내기
|
|
|
|
|
'export' => [
|
|
|
|
|
'requested' => '내보내기 요청이 접수되었습니다.',
|
|
|
|
|
'completed' => '내보내기가 완료되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
// 결제 관리
|
|
|
|
|
'payment' => [
|
|
|
|
|
'completed' => '결제가 완료되었습니다.',
|
|
|
|
|
'cancelled' => '결제가 취소되었습니다.',
|
|
|
|
|
'refunded' => '환불이 완료되었습니다.',
|
|
|
|
|
],
|
2025-12-22 15:30:38 +09:00
|
|
|
|
|
|
|
|
// 회사 추가 신청 관리
|
|
|
|
|
'company' => [
|
|
|
|
|
'checked' => '사업자등록번호 확인이 완료되었습니다.',
|
|
|
|
|
'request_created' => '회사 추가 신청이 접수되었습니다.',
|
|
|
|
|
'request_approved' => '회사 추가 신청이 승인되었습니다.',
|
|
|
|
|
'request_rejected' => '회사 추가 신청이 반려되었습니다.',
|
|
|
|
|
],
|
2025-12-24 08:54:52 +09:00
|
|
|
|
|
|
|
|
// FCM 푸시 알림 관리
|
|
|
|
|
'fcm' => [
|
|
|
|
|
'sent' => 'FCM 발송이 완료되었습니다.',
|
|
|
|
|
'token_toggled' => '토큰 상태가 변경되었습니다.',
|
|
|
|
|
'token_deleted' => '토큰이 삭제되었습니다.',
|
|
|
|
|
],
|
2025-12-24 19:39:33 +09:00
|
|
|
|
|
|
|
|
// 휴가 관리
|
|
|
|
|
'leave' => [
|
|
|
|
|
'created' => '휴가 신청이 완료되었습니다.',
|
|
|
|
|
'approved' => '휴가가 승인되었습니다.',
|
|
|
|
|
'rejected' => '휴가가 반려되었습니다.',
|
|
|
|
|
'cancelled' => '휴가가 취소되었습니다.',
|
|
|
|
|
'granted' => '휴가가 부여되었습니다.',
|
|
|
|
|
],
|
2025-12-26 15:18:08 +09:00
|
|
|
|
|
|
|
|
// 작업지시 관리
|
|
|
|
|
'work_order' => [
|
|
|
|
|
'fetched' => '작업지시를 조회했습니다.',
|
|
|
|
|
'created' => '작업지시가 등록되었습니다.',
|
|
|
|
|
'updated' => '작업지시가 수정되었습니다.',
|
|
|
|
|
'deleted' => '작업지시가 삭제되었습니다.',
|
|
|
|
|
'status_updated' => '작업지시 상태가 변경되었습니다.',
|
|
|
|
|
'assigned' => '작업지시가 배정되었습니다.',
|
|
|
|
|
'bending_toggled' => '벤딩 항목이 변경되었습니다.',
|
|
|
|
|
'issue_added' => '이슈가 등록되었습니다.',
|
|
|
|
|
'issue_resolved' => '이슈가 해결되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2026-01-14 17:08:59 +09:00
|
|
|
// 검사 관리
|
|
|
|
|
'inspection' => [
|
|
|
|
|
'fetched' => '검사를 조회했습니다.',
|
|
|
|
|
'created' => '검사가 등록되었습니다.',
|
|
|
|
|
'updated' => '검사가 수정되었습니다.',
|
|
|
|
|
'deleted' => '검사가 삭제되었습니다.',
|
|
|
|
|
'completed' => '검사가 완료되었습니다.',
|
|
|
|
|
],
|
|
|
|
|
|
2025-12-26 15:18:08 +09:00
|
|
|
// 작업실적 관리
|
|
|
|
|
'work_result' => [
|
|
|
|
|
'fetched' => '작업실적을 조회했습니다.',
|
|
|
|
|
'created' => '작업실적이 등록되었습니다.',
|
|
|
|
|
'updated' => '작업실적이 수정되었습니다.',
|
|
|
|
|
'deleted' => '작업실적이 삭제되었습니다.',
|
|
|
|
|
'inspection_toggled' => '검사 상태가 변경되었습니다.',
|
|
|
|
|
'packaging_toggled' => '포장 상태가 변경되었습니다.',
|
|
|
|
|
],
|
2026-01-08 11:11:54 +09:00
|
|
|
|
|
|
|
|
// 수주관리
|
|
|
|
|
'order' => [
|
|
|
|
|
'fetched' => '수주를 조회했습니다.',
|
|
|
|
|
'created' => '수주가 등록되었습니다.',
|
|
|
|
|
'updated' => '수주가 수정되었습니다.',
|
|
|
|
|
'deleted' => '수주가 삭제되었습니다.',
|
|
|
|
|
'status_updated' => '수주 상태가 변경되었습니다.',
|
2026-01-08 20:17:40 +09:00
|
|
|
'created_from_quote' => '견적에서 수주가 생성되었습니다.',
|
|
|
|
|
'production_order_created' => '생산지시가 생성되었습니다.',
|
2026-01-16 21:58:57 +09:00
|
|
|
'production_order_reverted' => '생산지시가 되돌려졌습니다.',
|
|
|
|
|
'order_confirmation_reverted' => '수주확정이 취소되었습니다.',
|
2026-01-08 11:11:54 +09:00
|
|
|
],
|
2025-08-25 17:26:20 +09:00
|
|
|
];
|