비즈뿌리오 알림톡 UX 개편 후속: - 코어/게시판/이커머스 알림 템플릿 [편집] 모달에 확장 채널 편집 영역 (extension_point 2종 + hidden_template_editor 채널 메타)을 신설하고, 알림톡 템플릿·문자(SMS)·수신자 규칙을 한 창에서 통합 저장하도록 개정 (행 하단은 상태 요약 전용, 승인 여부 2단 배지) - 검수 신청에 검수자 전달 의견(comment) 동봉 — kapi request 로만 전달, 행에는 저장하지 않음 (FormRequest 신설 + API 문서 백필) - 관리 탭 모바일 카드뷰·도구줄 코어 관례 통일, 사이트맵 알림 정의 다국어 라벨 결측 수정 + 코어 정의 라벨 패리티 테스트 신설 언어팩 번역 소실·보존 결함군 (보완 실측 → 커밋 전 점검에서 연쇄 확정, 전부 실패 테스트 선행 후 수정): - [기본값 복원]이 활성 언어팩 번역(ja)을 영구 소실 → 복원 기본값에 시딩과 같은 주입기(SSoT)로 팩 로케일 병합 (notification·identity) - 코어 알림/본인인증 시더의 언어팩 주입 전면 불능 → 주입기가 연관/리스트 양형태 수용 + identity 시더의 config 복합 키 보존 - 실패한 언어팩 업데이트가 active 팩을 installed 로 방치 → 상태 복원 확장 - 병합·제거의 사용자 수정 보존 판정 사문(연관 전제 isset) → dot-path 판정 교정, 팩 주입 저장의 user_overrides 오염 차단(시딩 바인딩), 템플릿 2모델 translatableTrackableFields 선언(beta.4 설계 누락), 같은 프로세스 활성화 시 시더 번역 필터 stale(캡처 인스턴스 캐시) 교정 - 7.0.9 업그레이드 스텝 신설 — 활성 팩 seed 재동기화로 기설치본의 소실 번역 자동 복구 (멱등·운영자 수정 보존·팩별 실패 격리)
188 lines
8.8 KiB
PHP
188 lines
8.8 KiB
PHP
<?php
|
||
|
||
return [
|
||
// 발송 채널 (DispatchChannel enum)
|
||
'channel' => [
|
||
'sms' => 'SMS',
|
||
'lms' => 'LMS',
|
||
'alimtalk' => 'Alimtalk',
|
||
],
|
||
|
||
// 채널 그룹 라벨 (SMS/LMS 를 "문자" 로 묶음 — 잔액부족 알림 등 채널군 표기용)
|
||
'channel_group' => [
|
||
'text' => 'SMS',
|
||
'alimtalk' => 'Alimtalk',
|
||
],
|
||
|
||
// 발송 상태 (DispatchStatus enum)
|
||
'status' => [
|
||
'pending' => 'Pending',
|
||
'sent' => 'Sending',
|
||
'success' => 'Success',
|
||
'failed' => 'Failed',
|
||
],
|
||
|
||
// 발송 출처 (DispatchSource enum)
|
||
'source' => [
|
||
'auto' => 'Automatic',
|
||
'manual' => 'Manual',
|
||
'bulk' => 'Bulk',
|
||
],
|
||
|
||
// 결과코드 분류 (ResultCategory enum)
|
||
'result_category' => [
|
||
'success' => 'Success',
|
||
'retry' => 'Retry',
|
||
'permanent_failure' => 'Permanent Failure',
|
||
'balance_low' => 'Insufficient Balance',
|
||
],
|
||
|
||
// 알림 채널 메타 (core.notification.filter_available_channels)
|
||
'channels' => [
|
||
'source_label' => 'Bizppurio',
|
||
'sms' => [
|
||
'name' => 'Bizppurio SMS',
|
||
'description' => 'Send notifications as SMS/LMS text messages via Bizppurio.',
|
||
],
|
||
'alimtalk' => [
|
||
'name' => 'Bizppurio Alimtalk',
|
||
'description' => 'Send notifications as Kakao Alimtalk messages via Bizppurio.',
|
||
],
|
||
],
|
||
|
||
// 채널 준비 상태 사유 (core.notification.channel_readiness)
|
||
'readiness' => [
|
||
'sms_credentials_missing' => 'Please set the Bizppurio ID and password.',
|
||
'sms_sender_number_missing' => 'Please set the sender number.',
|
||
'alimtalk_api_key_missing' => 'Please set the Kakao management API key.',
|
||
'alimtalk_sender_key_missing' => 'Please set the Alimtalk sender profile key.',
|
||
],
|
||
|
||
// 설정 검증 — 운영(live) 환경 필수 자격증명 항목 라벨 (validation.attributes 병합용)
|
||
'settings' => [
|
||
'bizppurio_id_attribute' => 'Bizppurio ID',
|
||
'password_attribute' => 'Password',
|
||
'sender_number_attribute' => 'Sender Number',
|
||
],
|
||
|
||
// webhook(URL PUSH) 리포트 수신
|
||
'webhook' => [
|
||
'received' => 'Report received.',
|
||
],
|
||
|
||
// 발송 엔진 오류 (API 클라이언트·토큰·발송 Job)
|
||
'error' => [
|
||
'credentials_missing' => 'Please set the Bizppurio ID and password first.',
|
||
'token_issue_failed' => 'Failed to issue the Bizppurio authentication token.',
|
||
'token_issue_failed_with_reason' => 'Failed to issue the Bizppurio authentication token. (:reason)',
|
||
'send_failed' => 'Failed to send the message.',
|
||
'send_retryable' => 'Message delivery temporarily failed. (code: :code)',
|
||
'invalid_response' => 'Unable to parse the Bizppurio response.',
|
||
'connection_failed' => 'Unable to connect to the Bizppurio server. Please try again later.',
|
||
'kakao_credentials_missing' => 'Please set the ID and API key to use the Kakao management API.',
|
||
'kakao_request_failed' => 'The Kakao management API request failed.',
|
||
'sender_key_missing' => 'Please set the alimtalk sender profile key first.',
|
||
'image_unreadable' => 'The uploaded image file could not be read.',
|
||
],
|
||
|
||
// Send skipped (channel driver send() precondition not met — recorded as "Failed" in core notification log)
|
||
'send_skipped' => [
|
||
'alimtalk_template_not_approved' => 'Skipped sending: no approved alimtalk template or alimtalk delivery is off. (notification type: :type)',
|
||
'sms_template_missing' => 'Skipped sending: no SMS body is configured. (notification type: :type)',
|
||
'recipient_phone_missing' => 'Skipped sending: recipient phone number is missing. (notification type: :type)',
|
||
'message_body_empty' => 'Skipped sending: message body is empty. (notification type: :type)',
|
||
],
|
||
|
||
// Notification template lifecycle (#597 — BizppurioTemplateController responses and state guards)
|
||
'template' => [
|
||
'created' => 'Notification template saved.',
|
||
'updated' => 'Notification template updated.',
|
||
'requested' => 'Inspection requested. The approval result syncs automatically, or use [Refresh] to check now.',
|
||
'request_cancelled' => 'Inspection request cancelled.',
|
||
'approval_cancelled' => 'Approval cancelled. Alimtalk delivery for this notification has stopped.',
|
||
'released' => 'Dormant state released.',
|
||
'synced' => 'Kakao inspection status synchronized.',
|
||
'deleted' => 'Notification template deleted.',
|
||
'image_uploaded' => 'Image uploaded.',
|
||
'content_locked' => 'The alimtalk content cannot be edited in the current state (:status). Cancel the inspection request first, or cancel the approval if approved.',
|
||
'content_missing' => 'Please compose the alimtalk template content first.',
|
||
'request_not_allowed' => 'Inspection cannot be requested in the current state (:status).',
|
||
'cancel_request_not_allowed' => 'The request cannot be cancelled because the template is not under inspection. (current: :status)',
|
||
'cancel_approval_not_allowed' => 'Approval cannot be cancelled because the template is not approved. (current: :status)',
|
||
'release_not_allowed' => 'The template is not dormant. (current: :status)',
|
||
'code_generation_failed' => 'Failed to allocate a template code. Please try again later.',
|
||
],
|
||
|
||
// Notification template validation (FormRequest — only documented limits; kapi is the final gate)
|
||
'validation' => [
|
||
'link_mo_required' => 'A web link (WL) button requires a mobile link.',
|
||
'link_and_required' => 'An app link (AL) button requires an Android scheme.',
|
||
'link_ios_required' => 'An app link (AL) button requires an iOS scheme.',
|
||
'tel_number_required' => 'A phone (TN) button requires a phone number.',
|
||
'plugin_id_required' => 'A plugin (P1–P3) button requires a plugin ID.',
|
||
'highlight_title_too_long' => 'The item highlight title must be at most :max characters.',
|
||
'highlight_description_too_long' => 'The item highlight description must be at most :max characters.',
|
||
'image_ratio_invalid' => 'The image must have a 2:1 width-to-height ratio. (e.g. 1000×500px)',
|
||
|
||
// Field labels used in validation messages (FormRequest::attributes)
|
||
'attributes' => [
|
||
'notification_type' => 'notification type',
|
||
'content' => 'AlimTalk content',
|
||
'template_name' => 'template name',
|
||
'message_type' => 'message type',
|
||
'emphasize_type' => 'emphasis type',
|
||
'template_content' => 'body',
|
||
'comment' => 'reviewer comment',
|
||
'preview_message' => 'preview message',
|
||
'category_code' => 'category',
|
||
'security_flag' => 'secure template flag',
|
||
'extra' => 'supplementary information',
|
||
'title' => 'emphasis title',
|
||
'subtitle' => 'emphasis subtitle',
|
||
'header' => 'header',
|
||
'image_name' => 'image file name',
|
||
'image_url' => 'image URL',
|
||
'item' => 'item list',
|
||
'item_list' => 'items',
|
||
'item_title' => 'item title',
|
||
'item_description' => 'item description',
|
||
'summary' => 'summary',
|
||
'summary_title' => 'summary title',
|
||
'summary_description' => 'summary description',
|
||
'highlight' => 'highlight',
|
||
'highlight_title' => 'highlight title',
|
||
'highlight_description' => 'highlight description',
|
||
'highlight_image_url' => 'highlight image URL',
|
||
'represent_link' => 'representative link',
|
||
'buttons' => 'buttons',
|
||
'button_name' => 'button label',
|
||
'button_link_type' => 'button link type',
|
||
'quick_replies' => 'quick replies',
|
||
'quick_reply_name' => 'quick reply label',
|
||
'quick_reply_link_type' => 'quick reply link type',
|
||
'link_mo' => 'mobile link',
|
||
'link_pc' => 'PC link',
|
||
'link_and' => 'Android scheme',
|
||
'link_ios' => 'iOS scheme',
|
||
'tel_number' => 'phone number',
|
||
'plugin_id' => 'plugin ID',
|
||
'image' => 'image file',
|
||
'sms_body' => 'SMS body',
|
||
'alimtalk_enabled' => 'AlimTalk enabled',
|
||
'fallback_sms_enabled' => 'fallback SMS enabled',
|
||
'sms_only' => 'SMS only',
|
||
'is_active' => 'active',
|
||
'status' => 'status',
|
||
'search' => 'search keyword',
|
||
'page' => 'page',
|
||
'per_page' => 'items per page',
|
||
],
|
||
],
|
||
|
||
// Connection check (TokenCheckController response)
|
||
'token_check' => [
|
||
'success' => 'Authentication verified successfully. The ID and password are correct.',
|
||
'failed' => 'Authentication check failed. See the detailed reason.',
|
||
],
|
||
];
|