summaryrefslogtreecommitdiff
path: root/lib/knox-api/employee
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-07-21 07:14:40 +0000
committerjoonhoekim <26rote@gmail.com>2025-07-21 07:14:40 +0000
commit8165f003563e3d7f328747be3098542fe527b014 (patch)
tree928a4cd23adbde13d96ad4515a1bdf435da8a463 /lib/knox-api/employee
parent8f19c063aeb3df1eed9cab58f4bf7cac22ab13dc (diff)
Knox API 임직원 스키마 추가, 동기화 기능 추가
Diffstat (limited to 'lib/knox-api/employee')
-rw-r--r--lib/knox-api/employee/code-utils.ts95
1 files changed, 95 insertions, 0 deletions
diff --git a/lib/knox-api/employee/code-utils.ts b/lib/knox-api/employee/code-utils.ts
new file mode 100644
index 00000000..36a0e283
--- /dev/null
+++ b/lib/knox-api/employee/code-utils.ts
@@ -0,0 +1,95 @@
+// Knox 임직원/조직 코드 → 한글 설명 매핑
+// 가이드의 Note 컬럼을 하드코딩해두었다.
+
+const CODE_MAPS = {
+ accountStatus: {
+ A: '아이디 승인',
+ W: '아이디 신청',
+ M: '아이디 미발급',
+ },
+ defaultCompanyCode: {
+ O: '원소속',
+ S: '파견소속',
+ },
+ employeeStatus: {
+ B: '재직',
+ V: '휴직',
+ },
+ employeeType: {
+ N: '정규직 (@samsung.com)',
+ U: '협력직',
+ C: '자회사',
+ T: '임시직 (@partner.samsung.com)',
+ X: '협력직 (@samsung.com)',
+ Y: '자회사 (@samsung.com)',
+ Z: '임시직 (@samsung.com)',
+ },
+ gradeTitleIndiCode: {
+ G: '직위',
+ T: '직급',
+ B: '직위/직급 모두',
+ },
+ securityLevel: {
+ '1': '회장단',
+ '2': '사장단',
+ '3': '임원진',
+ '4': '간부',
+ '5': '사원',
+ '9': '협력사 임직원',
+ },
+ executiveYn: {
+ Y: '임원',
+ N: '직원',
+ },
+ realNameYn: {
+ R: '실명',
+ V: '가명',
+ },
+ localStaffYn: {
+ Y: '현채인',
+ N: '현채인 아님',
+ },
+ serverLocation: {
+ KR: '한국',
+ GB: '구주',
+ US: '미주',
+ },
+} as const;
+
+type CodeField = keyof typeof CODE_MAPS;
+type CodeValue<F extends CodeField> = keyof (typeof CODE_MAPS)[F];
+
+/**
+ * 개별 코드 설명 반환
+ * @param field 코드 필드명 (예: 'accountStatus')
+ * @param code 코드 값 (예: 'A')
+ * @returns 한글 설명 (없으면 undefined)
+ */
+export function getCodeDescription<F extends CodeField>(
+ field: F,
+ code: CodeValue<F> | string | undefined | null,
+): string | undefined {
+ if (!code) return undefined;
+ // 대소문자 구분 없음 처리
+ const normalized = String(code).toUpperCase() as CodeValue<F>;
+ const map = CODE_MAPS[field] as Record<string, string>;
+ return map[normalized as string];
+}
+
+/**
+ * Employee 객체에 *_Desc 필드로 설명을 붙여 반환
+ * (원본 객체는 수정하지 않음)
+ */
+export function withCodeDescriptions<T extends Record<string, unknown>>(employee: T) {
+ const result: Record<string, unknown> = { ...employee };
+ (Object.keys(CODE_MAPS) as CodeField[]).forEach((field) => {
+ if (field in employee) {
+ const desc = getCodeDescription(field, employee[field] as string);
+ if (desc) result[`${field}Desc`] = desc;
+ }
+ });
+ return result as T & { [K in `${CodeField}Desc`]?: string };
+}
+
+// export 전체 매핑이 필요하면 아래 내보내기
+export { CODE_MAPS }; \ No newline at end of file