# 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. 멤버/프로젝트 중복 병합 규칙 구현