- Price 모델 생성 (prices 테이블) - PriceRevision 모델 생성 (price_revisions 테이블) - 레거시 Pricing/PricingService 삭제 (PriceHistory 사용) - pricing 에러/메시지 추가
200 lines
11 KiB
PHP
200 lines
11 KiB
PHP
<?php
|
|
|
|
/**
|
|
* 시스템/도메인 에러 메시지 (클라이언트 피드백용 고정 문자열)
|
|
* - DB 데이터 아님
|
|
* - 공통 핸들러/서비스에서 예외 메시지로 사용
|
|
* - 예: throw new NotFoundHttpException(__('error.not_found'));
|
|
*/
|
|
return [
|
|
|
|
// 4xx 공통
|
|
'not_found' => '존재하지 않는 URI 또는 데이터입니다.', // 404 일반
|
|
'tenant_id' => '활성 테넌트가 없습니다.', // 400 (Service::tenantId() 미설정)
|
|
'unauthenticated' => '인증에 실패했습니다.', // 401
|
|
'forbidden' => '요청에 대한 권한이 없습니다.', // 403
|
|
'bad_request' => '잘못된 요청입니다.', // 400 (검증 외 일반 케이스)
|
|
'token_expired' => '토큰이 만료되었습니다', // 401 (토큰 만료)
|
|
'refresh_token_required' => '리프레시 토큰이 필요합니다', // 422
|
|
'refresh_token_invalid' => '리프레시 토큰 형식이 올바르지 않습니다', // 422
|
|
'refresh_token_invalid_or_expired' => '리프레시 토큰이 유효하지 않거나 만료되었습니다', // 401
|
|
|
|
// 검증/파라미터
|
|
'validation_failed' => '요청 데이터 검증에 실패했습니다.', // 422
|
|
'missing_parameter' => '필수 파라미터가 누락되었습니다.', // 400
|
|
'business_num_format' => '사업자등록번호 형식이 올바르지 않습니다 (000-00-00000)',
|
|
'business_num_duplicate_active' => '이미 등록된 사업자등록번호입니다 (정식 서비스 업체)',
|
|
'user_id_format' => '아이디는 영문, 숫자, _, - 만 사용할 수 있습니다',
|
|
'phone_format' => '전화번호 형식이 올바르지 않습니다',
|
|
|
|
// 리소스별 (선택: :resource 자리표시자 사용)
|
|
'not_found_resource' => ':resource 정보를 찾을 수 없습니다.', // 예: __('error.not_found_resource', ['resource' => '제품'])
|
|
|
|
// 비즈니스 규칙
|
|
'duplicate' => '중복된 데이터가 존재합니다.',
|
|
'conflict' => '요청이 현재 상태와 충돌합니다.', // 409
|
|
'state_invalid' => '현재 상태에서는 처리할 수 없습니다.', // 409/400
|
|
|
|
// 서버 오류
|
|
'server_error' => '서버 처리 중 오류가 발생했습니다.', // 5xx 일반
|
|
|
|
// 견적 관련 에러
|
|
'estimate' => [
|
|
'cannot_delete_sent_or_approved' => '발송되었거나 승인된 견적은 삭제할 수 없습니다.',
|
|
'invalid_status_transition' => '현재 상태에서는 변경할 수 없습니다.',
|
|
],
|
|
|
|
// BOM 템플릿 관련
|
|
'bom_template' => [
|
|
'not_found' => '적용 가능한 BOM 템플릿을 찾을 수 없습니다.',
|
|
],
|
|
|
|
// 모델셋 관련
|
|
'modelset' => [
|
|
'has_dependencies' => '연관된 제품 또는 하위 카테고리가 있어 삭제할 수 없습니다.',
|
|
],
|
|
|
|
// 설정 관리 관련
|
|
'settings' => [
|
|
'field_not_found' => '해당 필드 설정을 찾을 수 없습니다.',
|
|
'option_group_not_found' => '해당 옵션 그룹을 찾을 수 없습니다.',
|
|
'common_code_duplicate' => '중복된 공통 코드가 존재합니다.',
|
|
'invalid_field_type' => '유효하지 않은 필드 타입입니다.',
|
|
],
|
|
|
|
// 자재 관리 관련
|
|
'materials' => [
|
|
'not_found' => '자재 정보를 찾을 수 없습니다.',
|
|
'duplicate_code' => '중복된 자재 코드입니다.',
|
|
'in_use_cannot_delete' => '사용 중인 자재는 삭제할 수 없습니다.',
|
|
],
|
|
|
|
// 파일 관리 관련
|
|
'file' => [
|
|
'not_found' => '파일을 찾을 수 없습니다.',
|
|
'upload_failed' => '파일 업로드에 실패했습니다.',
|
|
'invalid_file_type' => '허용되지 않는 파일 형식입니다.',
|
|
'file_too_large' => '파일 크기가 너무 큽니다.',
|
|
],
|
|
|
|
// 파일 저장소 관련
|
|
'file_not_found' => '파일을 찾을 수 없습니다.',
|
|
'file_ids_required' => '파일 ID 목록은 필수입니다.',
|
|
'file_ids_must_be_array' => '파일 ID는 배열이어야 합니다.',
|
|
'folder_not_found' => '폴더를 찾을 수 없습니다.',
|
|
'folder_id_required' => '폴더 ID는 필수입니다.',
|
|
'storage_quota_exceeded' => '저장소 용량이 부족합니다.',
|
|
'share_link_expired' => '공유 링크가 만료되었습니다.',
|
|
'share_link_not_found' => '공유 링크를 찾을 수 없습니다.',
|
|
|
|
// 폴더 관련
|
|
'folder_key_required' => '폴더 키는 필수입니다.',
|
|
'folder_key_duplicate' => '이미 존재하는 폴더 키입니다.',
|
|
'folder_key_format' => '폴더 키는 영문 소문자, 숫자, 하이픈, 언더스코어만 사용할 수 있습니다.',
|
|
'folder_name_required' => '폴더명은 필수입니다.',
|
|
'folder_has_files' => '폴더에 파일이 있어 삭제할 수 없습니다.',
|
|
'color_format' => '색상 코드는 #RRGGBB 형식이어야 합니다.',
|
|
'expiry_hours_min' => '만료 시간은 최소 1시간입니다.',
|
|
'expiry_hours_max' => '만료 시간은 최대 168시간(7일)입니다.',
|
|
|
|
// 가격 관리 관련
|
|
'price_not_found' => ':item_type ID :item_id 항목의 :date 기준 매출단가를 찾을 수 없습니다.',
|
|
|
|
// 고객 그룹 관련
|
|
'duplicate_code' => '중복된 그룹 코드입니다.',
|
|
'has_clients' => '해당 고객 그룹에 속한 고객이 있어 삭제할 수 없습니다.',
|
|
'code_exists_in_deleted' => '삭제된 데이터에 동일한 코드가 존재합니다. 먼저 해당 코드를 완전히 삭제하거나 다른 코드를 사용하세요.',
|
|
|
|
// 품목 기준 관리 관련
|
|
'page_not_found' => '페이지를 찾을 수 없습니다.',
|
|
'section_not_found' => '섹션을 찾을 수 없습니다.',
|
|
'field_not_found' => '필드를 찾을 수 없습니다.',
|
|
'field_key_reserved' => '":field_key"은(는) 시스템 예약어로 사용할 수 없습니다.',
|
|
'field_key_system_readonly' => '시스템 필드의 field_key는 변경할 수 없습니다.',
|
|
'field_key_system_cannot_delete' => '시스템 필드는 삭제할 수 없습니다.',
|
|
'bom_not_found' => 'BOM 항목을 찾을 수 없습니다.',
|
|
'item_type_required' => '품목 유형(item_type)은 필수입니다.',
|
|
'item_type_or_group_required' => '품목 유형(item_type) 또는 그룹 ID(group_id)는 필수입니다.',
|
|
'invalid_item_type' => '유효하지 않은 품목 유형입니다.',
|
|
'invalid_group_id' => '유효하지 않은 그룹 ID이거나 해당 그룹에 품목 유형이 없습니다.',
|
|
'invalid_source_table' => '품목 유형에 대한 소스 테이블이 설정되지 않았습니다.',
|
|
|
|
// 품목 관리 관련
|
|
'item' => [
|
|
'not_found' => '품목 정보를 찾을 수 없습니다.',
|
|
'already_deleted' => '이미 삭제된 품목입니다.',
|
|
'in_use_as_bom_component' => '다른 제품의 BOM 구성품으로 사용 중이어서 삭제할 수 없습니다. (사용처: :count건)',
|
|
'in_use' => '사용 중인 품목은 삭제할 수 없습니다. (사용처: :usage)',
|
|
'batch_in_use' => '사용 중인 품목이 포함되어 있어 삭제할 수 없습니다. (품목: :codes, :count건)',
|
|
'invalid_item_type' => '유효하지 않은 품목 유형입니다.',
|
|
'duplicate_code' => '중복된 품목 코드입니다.',
|
|
'self_reference_bom' => 'BOM에 자기 자신을 포함할 수 없습니다.',
|
|
],
|
|
|
|
// 단가 관리 관련
|
|
'pricing' => [
|
|
'finalized_cannot_edit' => '확정된 단가는 수정할 수 없습니다.',
|
|
'finalized_cannot_delete' => '확정된 단가는 삭제할 수 없습니다.',
|
|
'cannot_finalize' => '확정할 수 없는 상태입니다.',
|
|
],
|
|
|
|
// 잠금 관련
|
|
'relationship_locked' => '잠금된 연결은 해제할 수 없습니다.',
|
|
'has_locked_relationships' => '잠금된 연결이 포함되어 있어 처리할 수 없습니다.',
|
|
'entity_protected_by_locked_relationship' => '잠금된 연결로 보호된 항목은 삭제할 수 없습니다.',
|
|
'page_has_locked_children' => '잠금된 자식 연결이 있어 페이지를 삭제할 수 없습니다.',
|
|
'section_has_locked_children' => '잠금된 자식 연결이 있어 섹션을 삭제할 수 없습니다.',
|
|
|
|
// 견적 관련 (Quote)
|
|
'quote_not_found' => '견적 정보를 찾을 수 없습니다.',
|
|
'quote_not_editable' => '현재 상태에서는 견적을 수정할 수 없습니다.',
|
|
'quote_not_deletable' => '현재 상태에서는 견적을 삭제할 수 없습니다.',
|
|
'quote_not_finalizable' => '현재 상태에서는 견적을 확정할 수 없습니다.',
|
|
'quote_not_finalized' => '확정되지 않은 견적입니다.',
|
|
'quote_already_converted' => '이미 수주 전환된 견적입니다.',
|
|
'quote_not_convertible' => '현재 상태에서는 수주 전환할 수 없습니다.',
|
|
'quote_email_not_found' => '수신자 이메일 정보가 없습니다.',
|
|
'quote_phone_not_found' => '수신자 연락처 정보가 없습니다.',
|
|
|
|
// 수식 평가 관련 (Formula)
|
|
'formula_empty' => '수식이 비어있습니다.',
|
|
'formula_parentheses_mismatch' => '괄호가 올바르게 닫히지 않았습니다.',
|
|
'formula_unsupported_function' => '지원하지 않는 함수입니다: :function',
|
|
'formula_calculation_error' => '계산 오류: :expression',
|
|
|
|
// 휴가 관리 관련
|
|
'leave' => [
|
|
'not_found' => '휴가 정보를 찾을 수 없습니다.',
|
|
'not_editable' => '대기 상태의 휴가만 수정할 수 있습니다.',
|
|
'not_approvable' => '대기 상태의 휴가만 승인/반려할 수 있습니다.',
|
|
'not_cancellable' => '승인된 휴가만 취소할 수 있습니다.',
|
|
'insufficient_balance' => '잔여 휴가일수가 부족합니다.',
|
|
'overlapping' => '해당 기간에 이미 신청된 휴가가 있습니다.',
|
|
'balance_not_found' => '휴가 잔여일수 정보를 찾을 수 없습니다.',
|
|
],
|
|
|
|
// 근무 설정 관련
|
|
'work_setting' => [
|
|
'invalid_work_type' => '유효하지 않은 근무 유형입니다.',
|
|
'invalid_work_days' => '유효하지 않은 근무요일입니다.',
|
|
'invalid_time_range' => '출근시간은 퇴근시간보다 이전이어야 합니다.',
|
|
'break_time_invalid' => '휴게시간 설정이 올바르지 않습니다.',
|
|
],
|
|
|
|
// 출퇴근 설정 관련
|
|
'attendance_setting' => [
|
|
'invalid_radius' => '허용 반경이 유효하지 않습니다.',
|
|
'invalid_coordinates' => '좌표가 유효하지 않습니다.',
|
|
],
|
|
|
|
// 현장 관리 관련
|
|
'site' => [
|
|
'not_found' => '현장 정보를 찾을 수 없습니다.',
|
|
'name_required' => '현장명은 필수입니다.',
|
|
'name_too_long' => '현장명은 100자를 초과할 수 없습니다.',
|
|
'invalid_latitude' => '위도는 -90 ~ 90 사이여야 합니다.',
|
|
'invalid_longitude' => '경도는 -180 ~ 180 사이여야 합니다.',
|
|
'has_dependencies' => '연관된 데이터가 있어 삭제할 수 없습니다.',
|
|
],
|
|
];
|