2025-11-07 17:53:42 +09:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Laravel Validation 한국어 번역
|
|
|
|
|
* - validation 에러 메시지 및 필드명 정의
|
|
|
|
|
*/
|
|
|
|
|
return [
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Validation Language Lines
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
| Laravel 기본 validation 규칙별 메시지 정의
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
'accepted' => ':attribute을(를) 동의해야 합니다.',
|
|
|
|
|
'active_url' => ':attribute은(는) 유효한 URL이 아닙니다.',
|
|
|
|
|
'after' => ':attribute은(는) :date 이후 날짜여야 합니다.',
|
|
|
|
|
'after_or_equal' => ':attribute은(는) :date 이후 날짜이거나 같은 날짜여야 합니다.',
|
|
|
|
|
'alpha' => ':attribute은(는) 문자만 포함할 수 있습니다.',
|
|
|
|
|
'alpha_dash' => ':attribute은(는) 문자, 숫자, 대시(-), 밑줄(_)만 포함할 수 있습니다.',
|
|
|
|
|
'alpha_num' => ':attribute은(는) 문자와 숫자만 포함할 수 있습니다.',
|
|
|
|
|
'array' => ':attribute은(는) 배열이어야 합니다.',
|
|
|
|
|
'before' => ':attribute은(는) :date 이전 날짜여야 합니다.',
|
|
|
|
|
'before_or_equal' => ':attribute은(는) :date 이전 날짜이거나 같은 날짜여야 합니다.',
|
|
|
|
|
'between' => [
|
|
|
|
|
'numeric' => ':attribute은(는) :min에서 :max 사이여야 합니다.',
|
|
|
|
|
'file' => ':attribute은(는) :min에서 :max 킬로바이트 사이여야 합니다.',
|
|
|
|
|
'string' => ':attribute은(는) :min에서 :max 자 사이여야 합니다.',
|
|
|
|
|
'array' => ':attribute은(는) :min에서 :max 개 항목이 있어야 합니다.',
|
|
|
|
|
],
|
|
|
|
|
'boolean' => ':attribute은(는) true 또는 false이어야 합니다.',
|
|
|
|
|
'confirmed' => ':attribute 확인이 일치하지 않습니다.',
|
|
|
|
|
'date' => ':attribute은(는) 유효한 날짜가 아닙니다.',
|
|
|
|
|
'date_equals' => ':attribute은(는) :date와 같은 날짜여야 합니다.',
|
|
|
|
|
'date_format' => ':attribute은(는) :format 형식과 일치하지 않습니다.',
|
|
|
|
|
'different' => ':attribute와(과) :other는 달라야 합니다.',
|
|
|
|
|
'digits' => ':attribute은(는) :digits 자리 숫자여야 합니다.',
|
|
|
|
|
'digits_between' => ':attribute은(는) :min에서 :max 자리 사이여야 합니다.',
|
|
|
|
|
'dimensions' => ':attribute은(는) 유효하지 않은 이미지 크기입니다.',
|
|
|
|
|
'distinct' => ':attribute 필드에 중복된 값이 있습니다.',
|
|
|
|
|
'email' => ':attribute은(는) 유효한 이메일 주소여야 합니다.',
|
|
|
|
|
'exists' => '선택된 :attribute은(는) 유효하지 않습니다.',
|
|
|
|
|
'file' => ':attribute은(는) 파일이어야 합니다.',
|
|
|
|
|
'filled' => ':attribute 필드는 값이 있어야 합니다.',
|
|
|
|
|
'gt' => [
|
|
|
|
|
'numeric' => ':attribute은(는) :value보다 커야 합니다.',
|
|
|
|
|
'file' => ':attribute은(는) :value 킬로바이트보다 커야 합니다.',
|
|
|
|
|
'string' => ':attribute은(는) :value 자보다 길어야 합니다.',
|
|
|
|
|
'array' => ':attribute은(는) :value 개 항목보다 많아야 합니다.',
|
|
|
|
|
],
|
|
|
|
|
'gte' => [
|
|
|
|
|
'numeric' => ':attribute은(는) :value보다 크거나 같아야 합니다.',
|
|
|
|
|
'file' => ':attribute은(는) :value 킬로바이트보다 크거나 같아야 합니다.',
|
|
|
|
|
'string' => ':attribute은(는) :value 자보다 길거나 같아야 합니다.',
|
|
|
|
|
'array' => ':attribute은(는) :value 개 항목 이상이어야 합니다.',
|
|
|
|
|
],
|
|
|
|
|
'image' => ':attribute은(는) 이미지여야 합니다.',
|
|
|
|
|
'in' => '선택된 :attribute은(는) 유효하지 않습니다.',
|
|
|
|
|
'in_array' => ':attribute 필드가 :other에 존재하지 않습니다.',
|
|
|
|
|
'integer' => ':attribute은(는) 정수여야 합니다.',
|
|
|
|
|
'ip' => ':attribute은(는) 유효한 IP 주소여야 합니다.',
|
|
|
|
|
'ipv4' => ':attribute은(는) 유효한 IPv4 주소여야 합니다.',
|
|
|
|
|
'ipv6' => ':attribute은(는) 유효한 IPv6 주소여야 합니다.',
|
|
|
|
|
'json' => ':attribute은(는) 유효한 JSON 문자열이어야 합니다.',
|
|
|
|
|
'lt' => [
|
|
|
|
|
'numeric' => ':attribute은(는) :value보다 작아야 합니다.',
|
|
|
|
|
'file' => ':attribute은(는) :value 킬로바이트보다 작아야 합니다.',
|
|
|
|
|
'string' => ':attribute은(는) :value 자보다 짧아야 합니다.',
|
|
|
|
|
'array' => ':attribute은(는) :value 개 항목보다 적어야 합니다.',
|
|
|
|
|
],
|
|
|
|
|
'lte' => [
|
|
|
|
|
'numeric' => ':attribute은(는) :value보다 작거나 같아야 합니다.',
|
|
|
|
|
'file' => ':attribute은(는) :value 킬로바이트보다 작거나 같아야 합니다.',
|
|
|
|
|
'string' => ':attribute은(는) :value 자보다 짧거나 같아야 합니다.',
|
|
|
|
|
'array' => ':attribute은(는) :value 개 항목 이하여야 합니다.',
|
|
|
|
|
],
|
|
|
|
|
'max' => [
|
|
|
|
|
'numeric' => ':attribute은(는) :max보다 클 수 없습니다.',
|
|
|
|
|
'file' => ':attribute은(는) :max 킬로바이트보다 클 수 없습니다.',
|
|
|
|
|
'string' => ':attribute은(는) :max 자보다 길 수 없습니다.',
|
|
|
|
|
'array' => ':attribute은(는) :max 개 항목보다 많을 수 없습니다.',
|
|
|
|
|
],
|
|
|
|
|
'mimes' => ':attribute은(는) :values 유형의 파일이어야 합니다.',
|
|
|
|
|
'mimetypes' => ':attribute은(는) :values 유형의 파일이어야 합니다.',
|
|
|
|
|
'min' => [
|
|
|
|
|
'numeric' => ':attribute은(는) 최소 :min이어야 합니다.',
|
|
|
|
|
'file' => ':attribute은(는) 최소 :min 킬로바이트여야 합니다.',
|
|
|
|
|
'string' => ':attribute은(는) 최소 :min 자여야 합니다.',
|
|
|
|
|
'array' => ':attribute은(는) 최소 :min 개 항목이 있어야 합니다.',
|
|
|
|
|
],
|
|
|
|
|
'not_in' => '선택된 :attribute은(는) 유효하지 않습니다.',
|
|
|
|
|
'not_regex' => ':attribute 형식이 유효하지 않습니다.',
|
|
|
|
|
'numeric' => ':attribute은(는) 숫자여야 합니다.',
|
|
|
|
|
'password' => '비밀번호가 올바르지 않습니다.',
|
|
|
|
|
'present' => ':attribute 필드가 있어야 합니다.',
|
|
|
|
|
'regex' => ':attribute 형식이 유효하지 않습니다.',
|
|
|
|
|
'required' => ':attribute은(는) 필수 항목입니다.',
|
|
|
|
|
'required_if' => ':other이(가) :value일 때 :attribute은(는) 필수입니다.',
|
|
|
|
|
'required_unless' => ':other이(가) :values에 없을 때 :attribute은(는) 필수입니다.',
|
|
|
|
|
'required_with' => ':values이(가) 있을 때 :attribute은(는) 필수입니다.',
|
|
|
|
|
'required_with_all' => ':values이(가) 모두 있을 때 :attribute은(는) 필수입니다.',
|
|
|
|
|
'required_without' => ':values이(가) 없을 때 :attribute은(는) 필수입니다.',
|
|
|
|
|
'required_without_all' => ':values이(가) 모두 없을 때 :attribute은(는) 필수입니다.',
|
|
|
|
|
'same' => ':attribute와(과) :other는 일치해야 합니다.',
|
|
|
|
|
'size' => [
|
|
|
|
|
'numeric' => ':attribute은(는) :size여야 합니다.',
|
|
|
|
|
'file' => ':attribute은(는) :size 킬로바이트여야 합니다.',
|
|
|
|
|
'string' => ':attribute은(는) :size 자여야 합니다.',
|
|
|
|
|
'array' => ':attribute은(는) :size 개 항목을 포함해야 합니다.',
|
|
|
|
|
],
|
|
|
|
|
'starts_with' => ':attribute은(는) :values 중 하나로 시작해야 합니다.',
|
|
|
|
|
'string' => ':attribute은(는) 문자열이어야 합니다.',
|
|
|
|
|
'timezone' => ':attribute은(는) 유효한 시간대여야 합니다.',
|
|
|
|
|
'unique' => ':attribute은(는) 이미 사용 중입니다.',
|
|
|
|
|
'uploaded' => ':attribute 업로드에 실패했습니다.',
|
|
|
|
|
'url' => ':attribute 형식이 유효하지 않습니다.',
|
|
|
|
|
'uuid' => ':attribute은(는) 유효한 UUID여야 합니다.',
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Custom Validation Language Lines
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
| 특정 필드의 특정 규칙에 대한 커스텀 메시지
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
'custom' => [
|
|
|
|
|
'attribute-name' => [
|
|
|
|
|
'rule-name' => 'custom-message',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Custom Validation Attributes
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
| 필드별 attribute 이름 정의
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
'attributes' => [
|
|
|
|
|
// 사용자 관련
|
|
|
|
|
'user_id' => '사용자 아이디',
|
|
|
|
|
'name' => '이름',
|
|
|
|
|
'email' => '이메일',
|
|
|
|
|
'phone' => '전화번호',
|
|
|
|
|
'password' => '비밀번호',
|
|
|
|
|
'password_confirmation' => '비밀번호 확인',
|
|
|
|
|
'position' => '직책',
|
|
|
|
|
|
|
|
|
|
// 회사/테넌트 관련
|
|
|
|
|
'company_name' => '회사명',
|
|
|
|
|
'business_num' => '사업자등록번호',
|
|
|
|
|
'company_scale' => '회사 규모',
|
|
|
|
|
'industry' => '업종',
|
|
|
|
|
|
|
|
|
|
// 제품 관련
|
|
|
|
|
'product_name' => '제품명',
|
|
|
|
|
'category_id' => '카테고리',
|
|
|
|
|
'code' => '코드',
|
|
|
|
|
'description' => '설명',
|
|
|
|
|
'unit' => '단위',
|
|
|
|
|
'price' => '가격',
|
|
|
|
|
|
|
|
|
|
// 자재 관련
|
|
|
|
|
'material_name' => '자재명',
|
|
|
|
|
'material_code' => '자재 코드',
|
|
|
|
|
'specification' => '규격',
|
|
|
|
|
|
|
|
|
|
// 거래처 관련
|
|
|
|
|
'client_code' => '거래처 코드',
|
|
|
|
|
'client_name' => '거래처명',
|
|
|
|
|
'contact_person' => '담당자',
|
|
|
|
|
|
|
|
|
|
// 공통
|
|
|
|
|
'is_active' => '활성 상태',
|
|
|
|
|
'sort_order' => '정렬 순서',
|
|
|
|
|
'parent_id' => '상위 항목',
|
|
|
|
|
'tenant_id' => '테넌트',
|
2025-12-18 10:56:16 +09:00
|
|
|
|
|
|
|
|
// 급여 관련
|
|
|
|
|
'pay_year' => '지급 연도',
|
|
|
|
|
'pay_month' => '지급 월',
|
|
|
|
|
'base_salary' => '기본급',
|
|
|
|
|
'overtime_pay' => '연장근무수당',
|
|
|
|
|
'bonus' => '상여금',
|
|
|
|
|
'allowances' => '수당 목록',
|
|
|
|
|
'income_tax' => '소득세',
|
|
|
|
|
'resident_tax' => '주민세',
|
|
|
|
|
'health_insurance' => '건강보험료',
|
|
|
|
|
'pension' => '국민연금',
|
|
|
|
|
'employment_insurance' => '고용보험료',
|
|
|
|
|
'deductions' => '공제 목록',
|
|
|
|
|
'note' => '비고',
|
|
|
|
|
'withdrawal_id' => '출금 내역',
|
|
|
|
|
'user_ids' => '직원 목록',
|
|
|
|
|
|
|
|
|
|
// 급여 설정 관련
|
|
|
|
|
'income_tax_rate' => '소득세율',
|
|
|
|
|
'resident_tax_rate' => '주민세율',
|
|
|
|
|
'health_insurance_rate' => '건강보험요율',
|
|
|
|
|
'long_term_care_rate' => '장기요양보험요율',
|
|
|
|
|
'pension_rate' => '국민연금요율',
|
|
|
|
|
'employment_insurance_rate' => '고용보험요율',
|
|
|
|
|
'pension_max_salary' => '국민연금 상한기준',
|
|
|
|
|
'pension_min_salary' => '국민연금 하한기준',
|
|
|
|
|
'pay_day' => '급여 지급일',
|
|
|
|
|
'auto_calculate' => '자동계산 여부',
|
|
|
|
|
'allowance_types' => '수당 유형',
|
|
|
|
|
'deduction_types' => '공제 유형',
|
2025-12-18 14:27:10 +09:00
|
|
|
|
|
|
|
|
// 가지급금 관련
|
|
|
|
|
'loan_date' => '지급일',
|
|
|
|
|
'amount' => '금액',
|
|
|
|
|
'purpose' => '사용목적',
|
|
|
|
|
'settlement_date' => '정산일',
|
|
|
|
|
'settlement_amount' => '정산금액',
|
|
|
|
|
'year' => '연도',
|
2025-11-07 17:53:42 +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
|
|
|
];
|