GenOS HR Portal

@genon.ai 계정으로 로그인

@genon.ai
🔑 테스트 계정 보기 ▾
비밀번호 공통: 1234
👑 현주영 (관리자) — juyoung.hyun / 1234
🔵 김평가 (평가자) — kim.eval / 1234
🟢 홍길동 (인턴) — hong.gildong / 1234
🟢 박지수 (인턴, 전단계완료) — park.jisoo / 1234
클릭하면 자동 입력됩니다

평가 대상자 추가

@genon.ai

프로젝트 평가

프로젝트 역량 평가
종합 의견

검토

1차 검토 의견
${REG_GRADE_OPTIONS.filter(g=>g!=='N/A').map(g=>``).join('')}

자기평가서

업무 성과
역량 자기평가
성장 계획

기간 설정

숫자 8자리 입력 (예: 20250807)

3개월 평가

역량 평가
종합 의견
내부 코멘트 *필수

3개월 평가 상세

자기평가서 상세

자기평가서

자동저장 대기
주요 업무
역량 자기평가
강점 및 개선사항
협업 경험
정규직 전환 포부
⚠ 기한 내 최종 제출을 안 하면 임시저장 내용으로 자동 제출됩니다.

평가 대상자 추가

@genon.ai

사용자 추가

@genon.ai

인원 추가

기본 정보
@genon.ai
학력
기술
자격증 (쉼표 구분)
프로젝트 수행 경력 (최신 순)

비밀번호 변경

비밀번호 초기화

초기화 시 해당 계정의 비밀번호가 생년월일 8자리로 리셋됩니다.

최종 평가

① 3개월 PM평가
② 5개월 자기평가
③ 최종 평가 작성

합/불 확정

합/불 확정
합격
정규직 전환
불합격
인턴 종료
🔄
보류
추가 관찰

면접 평가

1차 면접
2차 면접

성장 분석

최종 평가 상세

평가자 선택

let _intvId=null, _intvTab=1; const INTV_FIELDS=[ {key:'score',label:'종합 점수 (100점)',type:'number'}, {key:'comm',label:'의사소통 능력'}, {key:'tech',label:'직무 역량'}, {key:'fit',label:'조직 적합성'}, {key:'growth',label:'성장 가능성'}, {key:'comment',label:'종합 의견',type:'textarea'}, ]; function nav_interview(){ const el=document.getElementById('intv-tb');if(!el)return; el.innerHTML=S.targets.map(t=>{ const i1=t.interview?.i1, i2=t.interview?.i2; return` ${t.name}${fmt(t.sd)} ${i1?.done?`${i1.score}점`:'미완료'} ${i2?.done?`${i2.score}점`:'미완료'} `;}).join(''); } function openIntv(id){ const t=S.targets.find(x=>x.id===id);if(!t)return; _intvId=id; _intvTab=1; document.getElementById('intv-title').textContent=t.name+' — 면접 평가'; switchIntvTab(1); openM('m-intv'); } function switchIntvTab(tab){ _intvTab=tab; [1,2].forEach(n=>{ const el=document.getElementById('intv-tab-'+n);if(!el)return; el.style.background=n===tab?'var(--sur)':''; el.style.color=n===tab?'var(--txt)':'var(--mut)'; el.style.fontWeight=n===tab?'600':'400'; }); const t=S.targets.find(x=>x.id===_intvId);if(!t)return; const iv=(tab===1?t.interview?.i1:t.interview?.i2)||{}; document.getElementById('intv-tab-content').innerHTML=`
`; } function saveIntv(){ const t=S.targets.find(x=>x.id===_intvId);if(!t)return; if(!t.interview) t.interview={}; const key=_intvTab===1?'i1':'i2'; t.interview[key]={ done:true, date:document.getElementById('intv-date').value, by:document.getElementById('intv-by').value, score:parseInt(document.getElementById('intv-score').value)||0, comm:document.getElementById('intv-comm').value, tech:document.getElementById('intv-tech').value, fit:document.getElementById('intv-fit').value, growth:document.getElementById('intv-growth').value, comment:document.getElementById('intv-comment').value, result:document.getElementById('intv-result').value, }; closeM('m-intv'); nav_interview(); renderTgt(); } // ── 대상자 결과 열람 ────────────────────────────────────────── function renderTResult(){ const el=document.getElementById('tresult-body');if(!el)return; const me=S.me; const t=S.targets.find(x=>x.email===me?.email||(me?.tid&&x.id===me.tid)); if(!t){el.innerHTML='

평가 대상자 정보를 찾을 수 없습니다.

';return;} const e3=t.e3, se=t.self, fe=t.final_eval, apv=t.approval, iv=t.interview; const apvLabel={pass:'✅ 합격',fail:'❌ 불합격',extend:'🔄 보류'}; el.innerHTML=`
3개월 PM평가
${e3?.done?'완료':'대기'}
5개월 자기평가
${se?.done?'제출':'미제출'}
최종 평가
${fe?.done?'완료':'대기'}
합/불
${apv?.done?(apvLabel[apv.result]||apv.result):'미확정'}
${e3?.done?`
① 3개월 PM평가 결과
평가자${e3.evName}
판정${e3.op||'—'}
강점${e3.str||'—'}
개선사항${e3.imp||'—'}
종합 점수${Object.values(e3.rat||{}).reduce((a,b)=>a+b,0)}점
`:''} ${se?.done?`
② 내 자기평가 (제출 완료)
제출일${fmt(se.sub)}
강점${se.str||'—'}
개선 계획${se.plan||'—'}
`:''} ${fe?.done?`
③ 최종 평가 결과
평가자${fe.evName}
종합 점수${Object.values(fe.scores||{}).reduce((a,b)=>a+b,0)}점
강점${fe.str||'—'}
개선 필요${fe.imp||'—'}
`:''} ${apv?.done?`
최종 합/불 결과
${apvLabel[apv.result]||apv.result}
${apv.comment?`
${apv.comment}
`:''}
`:'
합/불 결과

아직 확정되지 않았습니다.

'}
`; } // ── 성장 분석 (LLM) ────────────────────────────────────────── async function openGrowthAnalysis(targetId){ const me=S.me; const t=targetId ? S.targets.find(x=>x.id===targetId) : S.targets.find(x=>x.email===me?.email||(me?.tid&&x.id===me.tid)); if(!t){alert('평가 데이터 없음');return;} const e3Score=t.e3?.rat?Object.values(t.e3.rat).reduce((a,b)=>a+b,0):null; const seScore=t.self?.rat?Object.values(t.self.rat).reduce((a,b)=>a+b,0):null; const fevScore=t.final_eval?.scores?Object.values(t.final_eval.scores).reduce((a,b)=>a+b,0):null; if(!e3Score&&!seScore&&!fevScore){alert('평가 데이터가 부족합니다.');return;} document.getElementById('growth-title').textContent=t.name+' — 성장 분석'; const el=document.getElementById('growth-body'); el.innerHTML=`
🤖
AI가 성장 데이터를 분석 중입니다...
`; openM('m-growth'); // 차트 먼저 렌더 const chartData=[]; if(e3Score!=null) chartData.push({label:'3개월 PM평가',score:e3Score,color:'#7c3aed'}); if(seScore!=null) chartData.push({label:'5개월 자기평가',score:seScore,color:'#0f766e'}); if(fevScore!=null) chartData.push({label:'최종 평가',score:fevScore,color:'#1d4ed8'}); if(t.interview?.i1?.score) chartData.push({label:'1차 면접',score:t.interview.i1.score,color:'#b45309'}); if(t.interview?.i2?.score) chartData.push({label:'2차 면접',score:t.interview.i2.score,color:'#be123c'}); const maxScore=100; const chartH=140, chartW=440, pad=40; const barW=Math.min(60, (chartW-pad*2)/chartData.length-10); const bars=chartData.map((d,i)=>{ const x=pad+(i*(chartW-pad*2)/chartData.length)+(((chartW-pad*2)/chartData.length)-barW)/2; const h=Math.round((d.score/maxScore)*(chartH-20)); const y=chartH-h-10; return ` ${d.score} ${d.label.replace('평가','').replace('면접','면접')}`; }).join(''); // 꺾은선 추가 const points=chartData.map((d,i)=>{ const x=pad+(i*(chartW-pad*2)/chartData.length)+(((chartW-pad*2)/chartData.length))/2; const y=chartH-Math.round((d.score/maxScore)*(chartH-20))-10; return`${x},${y}`; }); const polyline=chartData.length>1?` ${chartData.map((d,i)=>{const[x,y]=points[i].split(',');return``;}).join('')}`:''; const chartSvg=` ${[0,25,50,75,100].map(v=>`${v}`).join('')} ${bars}${polyline} `; // LLM 분석 try { const prompt=`인턴 ${t.name}의 평가 데이터를 분석해주세요. ${e3Score!=null?`3개월 PM평가: ${e3Score}점\n판정: ${t.e3.op||'없음'}\n강점: ${t.e3.str||'없음'}\n개선: ${t.e3.imp||'없음'}`:''} ${seScore!=null?`5개월 자기평가: ${seScore}점\n강점: ${t.self.str||'없음'}\n계획: ${t.self.plan||'없음'}`:''} ${fevScore!=null?`최종평가: ${fevScore}점\n강점: ${t.final_eval.str||'없음'}\n개선: ${t.final_eval.imp||'없음'}`:''} ${t.interview?.i1?.done?`1차 면접: ${t.interview.i1.score}점 (${t.interview.i1.result||'미정'})`:''} ${t.interview?.i2?.done?`2차 면접: ${t.interview.i2.score}점 (${t.interview.i2.result||'미정'})`:''} 다음 형식으로 한국어로 분석해주세요: 1. 성장 추이 (한 문장으로 - 점수 변화 기반) 2. 핵심 강점 (2-3가지) 3. 개선 필요 사항 (1-2가지) 4. 종합 의견 (2-3문장) 간결하고 실용적으로 작성해주세요.`; const res=await fetch('https://api.anthropic.com/v1/messages',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({ model:'claude-sonnet-4-6', max_tokens:1000, messages:[{role:'user',content:prompt}] }) }); const data=await res.json(); const text=data.content?.[0]?.text||'분석 결과를 가져오지 못했습니다.'; const formatted=text.split('\n').map(l=>l.startsWith('1.')||l.startsWith('2.')||l.startsWith('3.')||l.startsWith('4.') ?`
${l}
` :l?`
${l}
`:'').join(''); el.innerHTML=`
📊 점수 변화
${chartSvg}
${chartData.map(d=>`● ${d.label}: ${d.score}점`).join('')}
🤖 AI 분석
${formatted}
`; } catch(err) { el.innerHTML=`${chartSvg}
AI 분석 오류: ${err.message}
`; } } // ── 정규직 프로젝트 평가 필수 설정 ────────────────────────────────────────── let REG_PROJ_REQUIRED = {}; // {부서명: true/false} function renderRegProjRequired(){ const el=document.getElementById('reg-proj-required-list');if(!el)return; const depts=[...new Set(RS.employees.map(e=>e.dept))].sort(); // 기본값: 모두 필수 depts.forEach(d=>{ if(REG_PROJ_REQUIRED[d]===undefined) REG_PROJ_REQUIRED[d]=true; }); el.innerHTML=depts.map(d=>`
${d}
${REG_PROJ_REQUIRED[d]===false?'프로젝트 평가 건너뜀':'프로젝트 평가 필수'}
`).join(''); // 수동 추가 항목 Object.entries(REG_PROJ_REQUIRED).filter(([d])=>!depts.includes(d)).forEach(([d,v])=>{ el.innerHTML+=`
${d} (수동 추가)
${v?'프로젝트 평가 필수':'프로젝트 평가 건너뜀'}
`; }); } function addRegProjDept(){ const d=document.getElementById('reg-proj-dept-input').value.trim(); const r=document.getElementById('reg-proj-dept-required').value==='true'; if(!d)return; REG_PROJ_REQUIRED[d]=r; document.getElementById('reg-proj-dept-input').value=''; renderRegProjRequired(); } function isRegProjRequired(dept){ if(REG_PROJ_REQUIRED[dept]===undefined) return true; // 기본 필수 return REG_PROJ_REQUIRED[dept]; } function renderTGrowthPage(){ const el=document.getElementById('tgrowth-body');if(!el)return; const me=S.me; const t=S.targets.find(x=>x.email===me?.email||(me?.tid&&x.id===me.tid)); if(!t){el.innerHTML='

평가 데이터가 없습니다.

';return;} const hasData=t.e3?.done||t.self?.done||t.final_eval?.done; el.innerHTML=hasData ?`

3개월 · 자기평가 · 최종평가 데이터를 AI로 분석합니다

` :'
평가 완료 후 분석이 가능합니다.
'; } // renderRegSettingsPage에 프로젝트 필수 렌더 추가 const _origRenderRegSettingsPage=renderRegSettingsPage; renderRegSettingsPage=function(){ _origRenderRegSettingsPage(); renderRegProjRequired(); }; // renderApproval에서 성장분석 버튼 연결 (관리자가 볼 때) // openFinalEval에서도 성장분석 버튼 노출