diff --git a/egbim/app.js b/egbim/app.js index 74cdd38..4c5d6a2 100644 --- a/egbim/app.js +++ b/egbim/app.js @@ -7,12 +7,12 @@ const COMMENTS_KEY = 'baron.qa.comments.egbim'; const CATEGORY_CODES = { '오류문의': 'ERROR_QNA', '개선문의': 'IMPROVEMENT_QNA', '일반문의': 'GENERAL_QNA' }; const STATUS_LABELS = { - INIT: '접수', - ON_REVIEW: '문의검토', - DETAILED_REVIEW: '정밀검토', - IN_PROGRESS: '처리중', - RESOLVED: '답변완료', - PENDING: '보류' + INIT: "접수", + ON_REVIEW: "접수", + DETAILED_REVIEW: "진행중", + IN_PROGRESS: "진행중", + RESOLVED: "완료", + PENDING: "보류" }; let authReady; @@ -62,20 +62,22 @@ } const createdAt = value(["createdAt", "created_at", "date"]) || new Date().toISOString(); const secret = value(["is_secret", "isSecret", "secret"]); + const requesterEmail = value(["requester_email", "requesterEmail", "email"]); return { id: value(["id", "feedbackId", "feedback_id"]), feedbackId: value(["id", "feedbackId", "feedback_id"]), requesterId: value(["requester_id", "requesterId", "requester_uuid"]) || firstValue(requester, ["id", "uuid", "userId"]), requesterTenantId: value(["requester_tenant_id", "requesterTenantId", "tenant_id", "tenantId"]), + requesterEmail: requesterEmail, category: normalizeCategory(value(["Category", "category"])), - company: value(["requester_company", "company", "organization", "tenant_name", "tenantName", "requester_affiliation"]), + company: getCompanyNameFromEmail(requesterEmail) || value(["requester_company", "company", "organization", "tenant_name", "tenantName", "requester_affiliation"]), department: value(["requester_department", "department", "team"]) || "-", author: value(["requester_name", "author_name", "authorName", "name", "author"]) || "작성자", title: value(["title", "subject"]) || "제목 없음", content: value(["contents", "content", "body"]) || "", date: String(createdAt).slice(0, 10), createdAt: createdAt, - status: normalizeStatus(value(["feedback_status", "feedbackStatus", "status_code", "status"])), + status: normalizeStatus(value(["feedback_status", "feedbackStatus", "status_code", "status"]), item), secret: secret === true || String(secret).toLowerCase() === "true" || String(secret) === "1", attachments: value(["attachments", "images"]) || [], raw: item @@ -115,19 +117,21 @@ return Boolean(post.author && [user.name, user.loginId, user.email].filter(Boolean).indexOf(post.author) > -1); } - function normalizeStatus(value) { - if (value && typeof value === 'object') value = value.code || value.key || value.value || value.name || ''; - const raw = String(value || '').trim(); - if (!raw) return ''; + function normalizeStatus(value, context) { + if (value && typeof value === "object") value = value.code || value.key || value.value || value.name || ""; + const raw = String(value || "").trim(); + if (!raw) return ""; const upper = raw.toUpperCase(); - return STATUS_LABELS[upper] || ({ - NEW: '접수', RECEIVED: '접수', 접수: '접수', 문의접수: '접수', - REVIEW: '문의검토', 문의검토: '문의검토', - DEEP: '정밀검토', 정밀검토: '정밀검토', - PATCH: '처리중', 처리중: '처리중', - DONE: '답변완료', COMPLETED: '답변완료', 답변완료: '답변완료', - HOLD: '보류', 보류: '보류' + const label = STATUS_LABELS[upper] || ({ + NEW: "접수", RECEIVED: "접수", 접수: "접수", 문의접수: "접수", 문의검토: "접수", REVIEW: "접수", + DEEP: "진행중", 정밀검토: "진행중", PATCH: "진행중", 처리중: "진행중", 진행중: "진행중", + DONE: "완료", COMPLETED: "완료", 답변완료: "완료", 완료: "완료", + HOLD: "보류", ON_HOLD: "보류", 보류: "보류" }[upper] || raw); + const issues = context && Array.isArray(context.issues) ? context.issues : []; + const issueLinkStatus = context && (context.issue_link_status || context.issueLinkStatus || context.issue_status || context.issueStatus); + const hasLinkedIssue = issues.length > 0 || ["LINKED", "ISSUE_LINKED", "CONNECTED", "이슈접수"].indexOf(String(issueLinkStatus || "").toUpperCase()) > -1; + return label === "진행중" && hasLinkedIssue ? "진행중(이슈접수)" : label; } function extractFeedbackStatus(payload) { @@ -137,11 +141,11 @@ const candidate = candidates[index]; if (!candidate || typeof candidate !== 'object') continue; const value = candidate.feedback_status || candidate.feedbackStatus || candidate.status_code || candidate.status; - if (value != null && value !== '') return normalizeStatus(value); + if (value != null && value !== '') return normalizeStatus(value, root); } const fields = root && (Array.isArray(root.fields) ? root.fields : (root.data && Array.isArray(root.data.fields) ? root.data.fields : [])); const statusField = fields.find(function (field) { return field && (field.key === 'feedback_status' || field.fieldKey === 'feedback_status' || field.name === 'feedback_status'); }); - return statusField ? normalizeStatus(statusField.value || statusField.val || statusField.data) : ''; + return statusField ? normalizeStatus(statusField.value || statusField.val || statusField.data, root) : ''; } async function refreshRemoteStatus(post) { @@ -206,12 +210,24 @@ 'samaneng.com': '삼안', 'hanmaceng.co.kr': '한맥기술', 'brsw.kr': '바론그룹', + 'baroncs.co.kr': '바론컨설턴트', 'jangheon.co.kr': '장헌산업', 'jangheon.com': '(주)장헌', 'hallasanup.com': '한라산업개발' })[domain] || ''; } + function getPostCompanyLabel(post, user) { + post = post || {}; + const raw = post.raw || {}; + const emailCompany = getCompanyNameFromEmail(post.requesterEmail || raw.requester_email || raw.requesterEmail); + if (emailCompany) return emailCompany; + if (post.company && post.company !== "외부 사용자") return post.company; + const company = user && (user.company || user.tenantName); + if (company && post.requesterTenantId && user.tenantId && String(post.requesterTenantId) === String(user.tenantId)) return company; + return post.company || "외부 사용자"; + } + function collectSsoClaims() { const storedClaims = parseJson( sessionStorage.getItem('ssoClaims') || sessionStorage.getItem('baronClaims') || sessionStorage.getItem('claims'), @@ -402,11 +418,7 @@ let posts = getPosts(); let remoteLoaded = false; - function getPostCompany(post, user) { - const company = user && (user.company || user.tenantName); - if (company && post.requesterTenantId && user.tenantId && String(post.requesterTenantId) === String(user.tenantId)) return company; - return post.company || "외부 사용자"; - } + function getPostCompany(post, user) { return getPostCompanyLabel(post, user); } function render() { const query = (qs("#query").value || "").trim().toLowerCase(); @@ -434,7 +446,7 @@ tableBody.innerHTML = rows.map(function (post, index) { const isNotice = post.category === "공지사항"; const number = isNotice ? "공지" : filtered.length - ((page - 1) * pageSize + index); - const status = normalizeStatus(post.status); + const status = normalizeStatus(post.status, post.raw); const statusClass = status === "답변완료" ? "done" : (status === "문의검토" || status === "정밀검토" ? "review" : ""); const company = getPostCompany(post, user); return "" + @@ -533,11 +545,11 @@ } qs('[data-detail-category]').textContent = post.category; qs('[data-detail-title]').textContent = post.title; - qs('[data-detail-status]').textContent = normalizeStatus(post.status) || '공지'; + qs('[data-detail-status]').textContent = normalizeStatus(post.status, post.raw) || '공지'; qs('[data-detail-date]').textContent = post.date; qs('[data-detail-author]').textContent = post.author; const detailUser = getAuthUser(); - qs('[data-detail-company]').textContent = detailUser && (detailUser.company || detailUser.tenantName) && post.requesterTenantId && String(detailUser.tenantId) === String(post.requesterTenantId) ? (detailUser.company || detailUser.tenantName) : (post.company || '외부 사용자'); + qs('[data-detail-company]').textContent = getPostCompanyLabel(post, detailUser); qs('[data-detail-department]').textContent = post.department; qs('[data-detail-content]').textContent = post.content; qs('[data-detail-secret]').hidden = !post.secret; @@ -728,7 +740,7 @@ }).join(''); }); refreshRemoteStatus(post).then(function (changed) { - if (changed) qs('[data-detail-status]').textContent = normalizeStatus(post.status) || '공지'; + if (changed) qs('[data-detail-status]').textContent = normalizeStatus(post.status, post.raw) || '공지'; }); } diff --git a/egbim/detail.html b/egbim/detail.html index 94d80e3..50c729a 100644 --- a/egbim/detail.html +++ b/egbim/detail.html @@ -4,5 +4,5 @@
EG-BIM SUPPORT

Q&A

EG-BIM 관련 문의하기

문의 상세

문의 내용과 답변을 확인할 수 있습니다.

문의 문의 제목

문의접수
2026-09-17작성자회사부서

첨부파일

첨부된 파일이 없습니다.
목록

답변 0

-
+ diff --git a/egbim/index.html b/egbim/index.html index eede6b3..45d148e 100644 --- a/egbim/index.html +++ b/egbim/index.html @@ -23,6 +23,6 @@
- + diff --git a/egbim/write.html b/egbim/write.html index 3b3db2f..a8f2b4e 100644 --- a/egbim/write.html +++ b/egbim/write.html @@ -4,5 +4,5 @@
EG-BIM SUPPORT

Q&A

EG-BIM 관련 문의하기

문의 등록

로그인한 사용자 정보로 문의가 등록됩니다.

로그인 상태를 확인하고 있습니다.
공개 설정
개인정보, 비밀번호, 인증번호 등 민감한 정보는 입력하지 마세요.
파일은 문의와 함께 안전하게 업로드됩니다. 파일당 최대 30MB
-
+
diff --git a/src/index.js b/src/index.js index 48552aa..36a3965 100644 --- a/src/index.js +++ b/src/index.js @@ -196,6 +196,7 @@ function companyNameFromEmail(email) { 'samaneng.com': '삼안', 'hanmaceng.co.kr': '한맥기술', 'brsw.kr': '바론그룹', + 'baroncs.co.kr': '바론컨설턴트', 'jangheon.co.kr': '장헌산업', 'jangheon.com': '(주)장헌', 'hallasanup.com': '한라산업개발'