325 lines
10 KiB
Markdown
325 lines
10 KiB
Markdown
# Execution Budget DB
|
|
|
|
회사 실행예산 분석 시스템을 바로 시작할 수 있도록 만든 PostgreSQL 기본 스키마입니다.
|
|
|
|
현재 문서에는 2가지 데이터 흐름이 함께 있습니다.
|
|
|
|
- `seed.sql`: 구조 확인과 화면 테스트를 위한 샘플 데이터
|
|
- [`PTC(2023-2026.02).xlsx`](/home/hyein/project/PTC(2023-2026.02).xlsx): 실제 적재 대상 원본 거래 데이터
|
|
|
|
즉, 지금 DB는 "데모용 샘플 데이터"로 바로 볼 수 있고, 실제 운영 데이터는 위 엑셀을 기준으로 다음 단계에서 적재해야 합니다.
|
|
|
|
## 기준 DB
|
|
|
|
- PostgreSQL 14 이상
|
|
- 스키마명: `budget_app`
|
|
- 파일: [`schema.sql`](/home/hyein/project/db/schema.sql)
|
|
- 샘플 데이터: [`seed.sql`](/home/hyein/project/db/seed.sql)
|
|
- 조회 예제: [`sample_queries.sql`](/home/hyein/project/db/sample_queries.sql)
|
|
- 실제 엑셀 파싱: [`import_ptc_xlsx.py`](/home/hyein/project/db/import_ptc_xlsx.py)
|
|
- 실제 엑셀 검증 쿼리: [`staging_queries.sql`](/home/hyein/project/db/staging_queries.sql)
|
|
- 로컬 실행: [`docker-compose.yml`](/home/hyein/project/docker-compose.yml)
|
|
|
|
## 현재 상태
|
|
|
|
- [`schema.sql`](/home/hyein/project/db/schema.sql): 실행예산 분석용 기본 스키마
|
|
- [`seed.sql`](/home/hyein/project/db/seed.sql): 브라우저에서 구조를 바로 확인하기 위한 예시 데이터
|
|
- [`PTC(2023-2026.02).xlsx`](/home/hyein/project/PTC(2023-2026.02).xlsx): 실제 회사 거래내역 원본
|
|
|
|
중요:
|
|
|
|
- 현재 `docker compose up -d`로 보이는 데이터는 `seed.sql` 기준입니다
|
|
- 아직 `PTC(2023-2026.02).xlsx` 내용이 자동으로 DB에 들어가도록 연결되지는 않았습니다
|
|
- 이 엑셀은 성격상 `예산 파일`보다는 `실적/거래 원장`에 가깝습니다
|
|
- 따라서 실제 적재 시에는 먼저 `staging` 테이블을 만든 뒤 정제해서 `actual_transactions`로 넣는 방식이 적합합니다
|
|
- 현재는 `staging_ptc_transactions` 테이블과 CSV 생성 스크립트까지 준비된 상태입니다
|
|
|
|
## 바로 확인하는 방법
|
|
|
|
1. 터미널에서 `/home/hyein/project`로 이동
|
|
2. `docker compose up -d`
|
|
3. 브라우저에서 `http://localhost:8080` 접속
|
|
4. 아래 정보로 로그인
|
|
|
|
- System: `PostgreSQL`
|
|
- Server: `postgres`
|
|
- Username: `budget`
|
|
- Password: `budget123`
|
|
- Database: `budgetdb`
|
|
|
|
접속 후 왼쪽에서 `budget_app` 스키마 안의 테이블과 뷰를 볼 수 있습니다.
|
|
|
|
처음 데이터가 안 보이면 아래를 확인하세요.
|
|
|
|
- `budget_app.companies`
|
|
- `budget_app.projects`
|
|
- `budget_app.vw_budget_vs_actual_monthly`
|
|
- `budget_app.vw_project_profit_summary`
|
|
- `budget_app.staging_ptc_transactions`
|
|
|
|
기존에 같은 컨테이너를 띄운 적이 있으면 초기 SQL이 다시 실행되지 않을 수 있습니다.
|
|
|
|
- 초기화가 필요하면 `docker compose down -v`
|
|
- 다시 실행은 `docker compose up -d`
|
|
|
|
주의:
|
|
|
|
- 여기서 보이는 값은 현재 샘플 데이터입니다
|
|
- 실제 엑셀 원본과 동일한 숫자가 보이는 단계는 아직 아닙니다
|
|
|
|
## 핵심 테이블
|
|
|
|
- `companies`: 회사 기본 정보
|
|
- `fiscal_years`: 회계연도
|
|
- `departments`: 부서
|
|
- `employees`: 사용자/담당자
|
|
- `business_units`: 사업부
|
|
- `clients`: 발주처
|
|
- `vendors`: 거래처
|
|
- `projects`: 프로젝트/현장/사업
|
|
- `account_categories`, `accounts`: 예산/실적 계정 과목
|
|
- `budget_versions`: 예산 버전
|
|
- `budget_items`: 월별 예산 금액
|
|
- `purchase_requests`, `purchase_orders`: 집행 요청과 발주
|
|
- `invoices`: 매출/매입 세금계산서
|
|
- `actual_transactions`: 실제 실적 데이터
|
|
- `cashflow_transactions`: 현금 유입/유출
|
|
- `file_import_logs`: 엑셀 업로드 이력
|
|
- `staging_ptc_transactions`: `PTC(2023-2026.02).xlsx` 원본 적재용 임시 테이블
|
|
|
|
## 실제 원본 엑셀 헤더
|
|
|
|
[`PTC(2023-2026.02).xlsx`](/home/hyein/project/PTC(2023-2026.02).xlsx) 확인 결과 헤더는 아래 14개입니다.
|
|
|
|
- `거래일`
|
|
- `입/출금`
|
|
- `계정코드`
|
|
- `구분`
|
|
- `부서`
|
|
- `거래처`
|
|
- `프로젝트코드`
|
|
- `프로젝트 구분(안)`
|
|
- `프로젝트명`
|
|
- `적요`
|
|
- `공급가액`
|
|
- `부가세`
|
|
- `합계금액`
|
|
- `비고`
|
|
|
|
파일 특성 요약:
|
|
|
|
- 데이터 건수: `6,678건`
|
|
- 기간: `2023-01-10 ~ 2026-02-28`
|
|
- `출금` 중심 거래 데이터이며 일부 `입금` 포함
|
|
- 운영상 `actual_transactions` 원본으로 보는 것이 가장 적절
|
|
- `departments`, `accounts`, `projects`, `vendors` 마스터 추출에도 활용 가능
|
|
|
|
주의할 점:
|
|
|
|
- `프로젝트코드 -> 프로젝트명` 일부 불일치 존재
|
|
- `프로젝트코드 -> 프로젝트 구분(안)` 일부 불일치 존재
|
|
- 누락값 소수 존재
|
|
- 음수 금액 존재
|
|
|
|
그래서 이 파일은 바로 본 테이블에 넣기보다 `staging -> 정제 -> 최종 적재` 흐름이 필요합니다.
|
|
|
|
## 실제 엑셀 적재 방법
|
|
|
|
### 1. 엑셀을 CSV로 변환
|
|
|
|
프로젝트 루트에서:
|
|
|
|
```bash
|
|
python3 db/import_ptc_xlsx.py \
|
|
--input "PTC(2023-2026.02).xlsx" \
|
|
--output "db/ptc_staging.csv" \
|
|
--batch "ptc_20260323"
|
|
```
|
|
|
|
생성 결과:
|
|
|
|
- `db/ptc_staging.csv`
|
|
|
|
이 CSV는 `budget_app.staging_ptc_transactions`에 바로 넣을 수 있는 컬럼 구조입니다.
|
|
|
|
### 2. CSV를 Postgres 컨테이너 안으로 복사
|
|
|
|
```bash
|
|
docker cp db/ptc_staging.csv budget-postgres:/tmp/ptc_staging.csv
|
|
```
|
|
|
|
### 3. staging 테이블로 적재
|
|
|
|
```bash
|
|
docker exec -i budget-postgres psql -U budget -d budgetdb -c "
|
|
set search_path = budget_app, public;
|
|
truncate table staging_ptc_transactions;
|
|
copy staging_ptc_transactions (
|
|
import_batch,
|
|
source_file_name,
|
|
source_sheet_name,
|
|
source_row_no,
|
|
transaction_date_raw,
|
|
transaction_date,
|
|
in_out,
|
|
account_code_raw,
|
|
account_name_raw,
|
|
department_name_raw,
|
|
vendor_name_raw,
|
|
project_code_raw,
|
|
project_type_raw,
|
|
project_name_raw,
|
|
description_raw,
|
|
supply_amount_raw,
|
|
vat_amount_raw,
|
|
total_amount_raw,
|
|
remarks_raw,
|
|
supply_amount,
|
|
vat_amount,
|
|
total_amount,
|
|
normalized_transaction_type,
|
|
load_status,
|
|
load_error
|
|
) from '/tmp/ptc_staging.csv' with (format csv, header true, encoding 'UTF8');
|
|
"
|
|
```
|
|
|
|
### 4. 적재 결과 확인
|
|
|
|
```bash
|
|
docker exec -it budget-postgres psql -U budget -d budgetdb
|
|
```
|
|
|
|
접속 후:
|
|
|
|
```sql
|
|
set search_path = budget_app, public;
|
|
select import_batch, count(*) from staging_ptc_transactions group by import_batch;
|
|
select * from staging_ptc_transactions order by source_row_no limit 20;
|
|
```
|
|
|
|
또는 [`staging_queries.sql`](/home/hyein/project/db/staging_queries.sql)을 기준으로 검증하면 됩니다.
|
|
|
|
## 먼저 넣어야 하는 데이터 순서
|
|
|
|
샘플 데이터 기준:
|
|
|
|
1. `companies`
|
|
2. `fiscal_years`
|
|
3. `departments`
|
|
4. `employees`
|
|
5. `business_units`
|
|
6. `clients`, `vendors`
|
|
7. `account_categories`
|
|
8. `accounts`
|
|
9. `projects`
|
|
10. `budget_versions`
|
|
11. `budget_items`
|
|
12. `purchase_requests`, `purchase_orders`, `invoices`
|
|
13. `actual_transactions`
|
|
|
|
실제 엑셀 적재 기준 권장 순서:
|
|
|
|
1. 원본 엑셀을 `staging_ptc_transactions`에 그대로 적재
|
|
2. `departments` 후보 추출
|
|
3. `accounts` 후보 추출
|
|
4. `projects` 후보 추출
|
|
5. `vendors` 후보 추출
|
|
6. 코드/명칭 불일치 정제
|
|
7. `actual_transactions` 적재
|
|
|
|
즉, 실제 운영은 샘플 순서보다 `staging` 단계가 먼저입니다.
|
|
|
|
## 가장 많이 쓰게 될 분석
|
|
|
|
- 프로젝트별 예산 대비 실적
|
|
- 부서별 월 집행률
|
|
- 계정과목별 초과 집행
|
|
- 프로젝트 손익
|
|
- 발주/세금계산서 기준 실적 반영
|
|
|
|
기본 뷰도 포함돼 있습니다.
|
|
|
|
- `vw_budget_vs_actual_monthly`
|
|
- `vw_project_profit_summary`
|
|
|
|
## 샘플 데이터 내용
|
|
|
|
- 회사 1개: `장헌건설`
|
|
- 회계연도 1개: `2026`
|
|
- 부서 4개
|
|
- 직원 5명
|
|
- 사업부 2개
|
|
- 발주처 2개
|
|
- 거래처 3개
|
|
- 프로젝트 2개
|
|
- 예산 버전 1개
|
|
- 월별 예산 데이터 다수
|
|
- 발주 요청/발주/세금계산서/실적 데이터 포함
|
|
|
|
즉, DB를 올리면 바로 "예산 대비 실적"과 "프로젝트 손익" 화면 구조를 테스트할 수 있습니다.
|
|
|
|
다만 이 샘플 데이터는 실제 엑셀 원본을 반영한 것이 아니라 데모용 예시입니다.
|
|
|
|
## 권장 운영 방식
|
|
|
|
- 예산은 `budget_versions` + `budget_items`로 버전 관리
|
|
- 실제 집행은 최종적으로 `actual_transactions`에 적재
|
|
- ERP, 엑셀, 수기 입력이 섞여도 `source_type`으로 출처 추적
|
|
- 프로젝트 단위와 부서 단위를 모두 지원
|
|
- 실제 엑셀 원본은 우선 `staging` 테이블에 저장 후 정제
|
|
- `공급가액`, `부가세`, `합계금액` 중 어떤 금액을 실적으로 사용할지 회사 기준 확정 필요
|
|
- `입/출금`과 `계정코드`를 함께 써서 `revenue/cost/expense` 분류 규칙 확정 필요
|
|
- `staging_ptc_transactions.normalized_transaction_type`은 현재 1차 추정값입니다
|
|
- 최종 적재 전 계정코드 기준 매핑표를 별도로 확정하는 것이 안전합니다
|
|
|
|
## 다음 추천 작업
|
|
|
|
1. `staging_ptc_transactions`로 실제 엑셀 적재 실행
|
|
2. 계정코드별 `revenue/cost/expense` 분류표 확정
|
|
3. 프로젝트코드/프로젝트명 불일치 정제 규칙 확정
|
|
4. `staging -> actual_transactions` 변환 SQL 작성
|
|
5. 필요하면 예산용 별도 엑셀 구조 추가
|
|
6. 화면에 필요한 조회 API 설계
|
|
|
|
## 쿼리로 확인하는 방법
|
|
|
|
웹 화면 대신 SQL로 먼저 보고 싶으면 아래처럼 접속해서 확인할 수 있습니다.
|
|
|
|
```bash
|
|
docker exec -it budget-postgres psql -U budget -d budgetdb
|
|
```
|
|
|
|
접속 후:
|
|
|
|
```sql
|
|
set search_path = budget_app, public;
|
|
select * from companies;
|
|
select * from projects;
|
|
select * from vw_project_profit_summary;
|
|
```
|
|
|
|
또는 [`sample_queries.sql`](/home/hyein/project/db/sample_queries.sql)에 준비된 조회문을 사용하면 됩니다.
|
|
|
|
## 예산 입력 예시
|
|
|
|
예를 들어 2026년 3월, 특정 프로젝트의 외주비 예산 5,000,000원을 넣으려면:
|
|
|
|
- `budget_versions`에 2026년 예산 버전 생성
|
|
- `accounts`에 외주비 계정 등록
|
|
- `budget_items`에 `month_no = 3`, `planned_amount = 5000000` 입력
|
|
|
|
## 실적 입력 예시
|
|
|
|
실제 외주비가 4,300,000원 집행되면:
|
|
|
|
- `actual_transactions`에 같은 프로젝트, 같은 계정, 같은 월로 입력
|
|
- 이후 `vw_budget_vs_actual_monthly`에서 차이와 집행률 조회 가능
|
|
|
|
## 현재 문서에서 꼭 구분할 점
|
|
|
|
- `seed.sql`은 데모 확인용
|
|
- 실제 운영 데이터는 [`PTC(2023-2026.02).xlsx`](/home/hyein/project/PTC(2023-2026.02).xlsx)
|
|
- 현재 README의 실행 방법은 "데모 DB 확인 방법"으로 이해하면 맞습니다
|
|
- 실제 엑셀 적재 절차는 다음 단계에서 추가 구현이 필요합니다
|