# Integration DB Plan

## Goal

`organization.xlsx`, `MH.xlsx`, `payment.csv`를 하나의 통합 DB로 수용하고,
`조직 현황`, `프로젝트별 분석`, `팀/개인별 분석`, `자리배치도`가 같은 기준 데이터를 바라보도록 정리한다.

## Source Summary

### 1. `organization.xlsx`

용도:
- 인원 기본 정보
- 조직 구조

주요 컬럼:
- `name`
- `tag`
- `rank`
- `pos`
- `co`
- `cell`
- `team`
- `div`
- `gr`
- `part`
- `ph`
- `mail`

해석:
- `tag`는 사번 또는 내부 인원 식별자로 사용
- 조직 정보는 `part > gr > div > team > cell` 구조

### 2. `MH.xlsx`

용도:
- 일자별 인원 근무 실적
- 프로젝트별 투입 시간
- 연장근무 포함 세부 투입 슬롯

주요 컬럼:
- `근무일자`
- `팀 분류`
- `팀`
- `사원번호`
- `이름`
- `직책`
- `user_state`
- `시차시간`
- `메인업무/추가업무1~5/연장근무`
  - `프로젝트 코드`
  - `프로젝트명`
  - `서브 코드`
  - `근무시간`

추가 시트:
- `Sheet2`
  - 프로젝트 코드와 PM 이름 매핑으로 추정

### 3. `payment.csv`

용도:
- 프로젝트별 수입/지출 전표

주요 컬럼:
- `프로젝트코드`
- `사업명`
- `사업명(표출PJT)`
- `사업명(인트라넷기준)`
- `사업분야`
- `세부분야`
- `부서명`
- `팀명`
- `거래처`
- `적요`
- `차변공급가`
- `대변공급가`
- `지출`
- `수입`
- `구분`
- `프로젝트성격`

## Recommended Model

### Raw Layer

원본을 그대로 적재하는 영역.

- `raw_organization_import`
- `raw_mh_import`
- `raw_payment_import`

원칙:
- 원본 행을 최대한 손대지 않고 저장
- 파일명, 업로드시각, 배치 ID 같이 저장

### Standard Layer

정규화된 운영 테이블.

#### Members

- `members`
  - `id`
  - `employee_id`
  - `name`
  - `company`
  - `rank`
  - `position`
  - `phone`
  - `email`
  - `active`

#### Organization

- `org_units`
  - `id`
  - `unit_type`
  - `name`
  - `parent_id`

- `member_org_assignments`
  - `id`
  - `member_id`
  - `part_name`
  - `group_name`
  - `division_name`
  - `team_name`
  - `cell_name`
  - `effective_from`
  - `effective_to`

#### Projects

- `projects`
  - `id`
  - `project_code`
  - `project_name`
  - `display_name`
  - `intranet_name`
  - `domain`
  - `subdomain`
  - `project_type`
  - `project_nature`

- `project_aliases`
  - `id`
  - `project_id`
  - `alias_type`
  - `alias_value`

- `project_pm_assignments`
  - `id`
  - `project_id`
  - `member_id`
  - `source`

#### Work Logs

- `work_logs`
  - `id`
  - `member_id`
  - `work_date`
  - `team_category`
  - `team_name`
  - `user_state`
  - `shift_hours`
  - `late_flag`

- `work_log_segments`
  - `id`
  - `work_log_id`
  - `project_id`
  - `activity_code`
  - `hours`
  - `is_overtime`
  - `slot_type`

#### Vouchers

- `vouchers`
  - `id`
  - `company_name`
  - `request_date`
  - `issue_date`
  - `issue_month`
  - `account_code`
  - `management_account_code`
  - `project_id`
  - `department_name`
  - `team_name`
  - `customer_name`
  - `summary`
  - `debit_amount`
  - `credit_amount`
  - `expense_amount`
  - `income_amount`
  - `voucher_type`
  - `project_nature`
  - `note`

#### Reference

- `member_cost_rates`
  - 직급별 표준 인건비

## Matching Rules

### Member Match

우선순위:
1. `MH.xlsx.사원번호`
2. `organization.xlsx.tag`
3. 이름 단독 매칭은 보조 규칙으로만 사용

원칙:
- `employee_id`가 있으면 그 값으로 병합
- 이름만 같은 경우 자동 병합 금지

### Project Match

우선순위:
1. `project_code`
2. `사업명(인트라넷기준)`
3. `사업명(표출PJT)`
4. `프로젝트명`

원칙:
- `project_code`를 정식 키로 사용
- 이름 차이는 `project_aliases`로 흡수

## Migration Strategy

### Phase 1

- `payment.html`, `mh.html`을 현재 대시보드 탭에 편입
- 기존 HTML 기능은 유지
- 파일은 backend route를 통해 iframe으로 연결

### Phase 2

- raw import 테이블 생성
- 원본 3종 import 스크립트 작성
- 파일별 업로드/재적재 배치 ID 관리

### Phase 3

- 표준 테이블 생성
- raw -> standard 정규화 파이프라인 작성
- 멤버/프로젝트 매핑 규칙 적용

### Phase 4

- `payment.html`, `mh.html`의 파일 직접 파싱 로직을 API 기반 조회로 전환
- 프론트는 공통 DB 기준으로만 동작

## Immediate Next Tasks

1. Postgres 스키마 초안 SQL 작성
2. `payment.csv` import 파서 작성
3. `MH.xlsx` import 파서 작성
4. `organization.xlsx` import 파서 작성
5. 멤버/프로젝트 중복 병합 규칙 구현
