Add JH work data page and database
11
.dockerignore
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
.git
|
||||||
|
.venv
|
||||||
|
__pycache__
|
||||||
|
*.pyc
|
||||||
|
*.log
|
||||||
|
matching.db
|
||||||
|
csv
|
||||||
|
*.png
|
||||||
|
*.xlsx
|
||||||
|
*.txt
|
||||||
|
data
|
||||||
15
.env.example
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
MYSQL_HOST=172.16.42.111
|
||||||
|
MYSQL_PORT=3306
|
||||||
|
MYSQL_USER=root
|
||||||
|
MYSQL_PASSWORD=hanmacerp!
|
||||||
|
MYSQL_DB=jangheon_manhour
|
||||||
|
|
||||||
|
ERP_BASE_URL=http://erp.jangheon.co.kr/projt_mng
|
||||||
|
ERP_LOGIN_ID=g25001
|
||||||
|
ERP_LOGIN_PW=00000
|
||||||
|
|
||||||
|
INTRANET_BASE_URL=http://erp.jangheon.co.kr/intranet/
|
||||||
|
INTRANET_LOGIN_ID=G25001
|
||||||
|
INTRANET_LOGIN_PW=00000
|
||||||
|
|
||||||
|
PORT=8090
|
||||||
19
.gitignore
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Secrets
|
||||||
|
.env
|
||||||
|
gitea-api.txt
|
||||||
|
|
||||||
|
# Python / runtime
|
||||||
|
.venv/
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*.log
|
||||||
|
server.log
|
||||||
|
app.log
|
||||||
|
|
||||||
|
# OS / office temp files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
~$*.docx
|
||||||
|
|
||||||
|
# Local scratch
|
||||||
|
*.tmp
|
||||||
37
DEPLOY_DOCKER.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Docker 배포 가이드
|
||||||
|
|
||||||
|
## 1) 준비
|
||||||
|
- 이 폴더에서 실행:
|
||||||
|
```bash
|
||||||
|
cd /home/hyein/jh-mh/장헌산업
|
||||||
|
```
|
||||||
|
- 환경파일 생성:
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
mkdir -p data
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2) 실행
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3) 접속
|
||||||
|
- 로컬: `http://127.0.0.1:8090`
|
||||||
|
- 사내망: `http://<서버IP>:8090`
|
||||||
|
|
||||||
|
## 4) 로그/중지
|
||||||
|
```bash
|
||||||
|
docker compose logs -f
|
||||||
|
docker compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5) 업데이트
|
||||||
|
```bash
|
||||||
|
docker compose down
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## 참고
|
||||||
|
- `data/matching.db`에 sqlite 캐시가 저장됩니다(컨테이너 재시작 후 유지).
|
||||||
|
- 실제 컨테이너 실행 컴퓨터에는 Docker(Desktop 또는 Engine)가 필요합니다.
|
||||||
19
Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM python:3.12-slim
|
||||||
|
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||||
|
PYTHONUNBUFFERED=1 \
|
||||||
|
PORT=8090
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY requirements.txt ./
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY app.py index.html detail-view.html detail-view-project.html ./
|
||||||
|
|
||||||
|
# matching.db는 볼륨으로 마운트해서 데이터 보존
|
||||||
|
VOLUME ["/app/data"]
|
||||||
|
|
||||||
|
EXPOSE 8090
|
||||||
|
|
||||||
|
CMD ["sh", "-c", "ln -sf /app/data/matching.db /app/matching.db 2>/dev/null || true; python3 app.py"]
|
||||||
82163
csv/2005-2015.csv
Normal file
14364
csv/2016.csv
Normal file
17506
csv/2017.csv
Normal file
19014
csv/2018.csv
Normal file
12389
csv/2019.csv
Normal file
13911
csv/2020.csv
Normal file
677
csv/config.csv
Normal file
@@ -0,0 +1,677 @@
|
|||||||
|
SysKey,Code,Name,CodeORName,Description,Note,orderno,field_address,lat_coordinate,lng_coordinate,Remark
|
||||||
|
CompanyCode,M,한맥기술,1,한맥,hanmaceng.co.kr,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CompanyCode,T,포넥스에스앤티,2,포넥스,phonex.co.kr,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CompanyCode,J,장헌산업,5,장헌,jangheon.co.kr,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CompanyCode,Q,퇴사자,9,9,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
EntryKindCode,1,설계직임원,NULL,NULL,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
EntryKindCode,2,설계직경력,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
EntryKindCode,3,신입,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
EntryKindCode,4,감리직임원,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
EntryKindCode,5,감리직경력,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
EntryKindCode,6,계약직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,01,임원실,본사,임원실,,1,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,02,경영지원부,본사,경영지원,T02303,2,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode_del,03,공무부,본사,공무,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C1,부회장,임원,부회장,,1,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C2,사장,임원,사장,NULL,2,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode_del,C3,원장,임원,원장,NULL,3,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C4,고문,임원,고문,NULL,5,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C5,부사장,임원,부사장,NULL,6,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C6,전무이사,임원,전무이사,NULL,7,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C7,상무이사,임원,상무이사,NULL,8,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C8,이사,임원,이사,NULL,9,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E1,부장,직원,부장,NULL,11,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E2,차장,직원,차장,NULL,15,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E3,과장,직원,과장,NULL,16,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E4,대리,직원,대리,NULL,18,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E5,사원,직원,사원(5급),5급(대졸),19,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E6,사원,직원,사원(6급),6급(전졸),20,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E7,사원,직원,사원(7급),7급(고졸),21,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,11,교영,1,11,교량영업,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,26a,기타,NULL,NULL,교휴-07,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,13,시공,2,13,시공,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,15,도연,3,14,도로,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,16,구연,3,14,구조,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,17,관리,4,,경영지원,NULL,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,01,휴가,XX-교휴-04,"XX-교휴-04 (a)연차,오전반차,오후반차","오전반차,오후반차",1,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,02,경유,해당프로젝트코드,"프로젝트코드 입력","근무시간에 포함",2,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,03,출장,해당프로젝트코드,"프로젝트코드 입력","근무시간에 포함",3,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,04,야근,해당프로젝트코드,"프로젝트코드 입력",철야,16,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,05,훈련,XX-교휴-02,"XX-교휴-02 (a)예비군,(b)민방위,(c)기타",NULL,6,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,06,교육,XX-교휴-01,"XX-교휴-01 (a)직무교육,(b)전문교육,(c)교양교육,(d)기타","근무시간에 포함",7,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,07,경조,XX-교휴-04,"XX-교휴-04 (b)경조사","연차 일수에서 제외",13,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,08,기타,XX-교휴-04,"XX-교휴-04 (c)특별휴가,(d)기타(보건휴가,출산휴가)","연차 일수에서 제외",8,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,09,파견,해당프로젝트코드,"프로젝트코드 입력","근무시간에 포함",14,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,10,대기,XX-교휴-03,"XX-교휴-03 (a)현장철수,(c)징계,(d)병가,(e)기타",NULL,12,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,11,지각,XX-교휴-06,XX-교휴-06,지각(09시~10시이전),11,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,12,유결,XX-교휴-06,XX-교휴-06,"유계결근 사용않음, 지각으로처리 및 휴가계 제출",10,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,13,무결,XX-교휴-06,XX-교휴-06,"무계결근 사용않음, 지각으로처리 및 휴가계 제출",9,NULL,NULL,NULL,NULL
|
||||||
|
WorkPositionCode,1,입사,,NULL,근무위치,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPositionCode,2,파견,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPositionCode_del,3,현장,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CompanyName,10,JANGHUN,"HANMAC,PILETECH,JANGHUN",,"Name에 인트라넷 사용 회사명",NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPositionCode,9,퇴사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DetailJobCode,101,상세,NULL,"설계 상세 업무","상세 업무 코드",NULL,NULL,NULL,NULL,NULL
|
||||||
|
DetailJobCode,102,계획,NULL,"설계 준비 등 계획 관련 업무",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DetailJobCode,103,관리,NULL,"시간 또는 인력 관리등",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DetailJobCode,104,출장,NULL,"외출 현장조사 등",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DetailJobCode,105,수주,NULL,"수주 활동 관련 업무",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DetailJobCode,106,기타,NULL,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionPayCode,E1,233191,226374,부장,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionPayCode,E2,205704,193648,차장,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionPayCode,E3,179713,175178,과장,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionPayCode,E4,152613,145904,대리,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionPayCode,E5,121748,121748,사원,"E5,E6,E7,E8",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStateCode,10,수행중,NULL,NULL,"프로젝트 수행상태",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStateCode,11,수주활동중,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStateCode,12,수행중지,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionPayCode,C8,391600,283139,임원,Name=일반/CodeORName=감리,NULL,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,14,휴직,XX-교휴-03,"XX-교휴-03 (b)휴직",,15,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStateCode,13,준공완료,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,10,지자체,NULL,지방자치단체,"경력관리 발주처 검색어",NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,11,국토청,ql,국토관리청,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,12,민자,NULL,민간투자사업,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,13,도공,NULL,한국도로공사,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,14,공사,NULL,공사,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,10,고속도로,NULL,NULL,"경력관리 공종",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,11,국도,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,12,일반,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,13,교량,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,14,터널,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,15,민자,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,16,소각장,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,17,매립장,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,18,폐기물,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,19,환경기타,NULL,NULL,"경력관리 공종",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,20,영향평가,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,21,사후환경영향조사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,22,사전환경성검토,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,23,교통,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,24,도시계획,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,25,조경,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,26,상하수도,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,27,수자원,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,28,감리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,29,안전진단,NULL,NULL,"경력관리 공종",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,30,항만및해안,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectEPartCode,31,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStepCode,10,기본계획,NULL,NULL,"경력관리 설계단계",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStepCode,11,타당성조사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStepCode,12,기본설계,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStepCode,13,실시설계,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectStepCode,14,블랭크,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,10,도로및공항,NULL,NULL,"사업분야 코드 부여",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,11,토목구조,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,12,토질및기초,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,13,교통,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,14,항만및해안,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,15,철도,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,16,수자원개발,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,17,상하수도,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,18,농어업토목,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,19,건축구조,NULL,NULL,"사업분야 코드 부여",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,20,도시계획,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,21,조경,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,22,건축기계,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,23,건축전기,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,24,토목품질,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,25,건설안전,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,26,측지,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,27,유체기계,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,28,발송배전,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,29,대기,NULL,NULL,"사업분야 코드 부여",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,30,수질,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,31,소음진동,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,32,폐기물,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,33,PM,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,34,시공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,35,환경,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectPartCode,36,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPartCode,10,설계관리감독,NULL,NULL,담당업무,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPartCode,11,사업책임,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPartCode,12,분야책임,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPartCode,13,설계,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPartCode,14,평가,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPartCode,15,조사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,10,연장,NULL,NULL,과업의범위-ITEM,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,11,폭원,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,12,설계속도,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,13,교량,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,14,터널,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,15,사업면적,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,16,매립면적,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,17,시설면적,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,18,시설용량,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,19,환경영향평가비,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectItemCode,20,교통영향평가비,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectUnitCode,10,Km,NULL,NULL,과업의범위-UNIT,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectUnitCode,11,Km/hr,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectUnitCode,12,m,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectUnitCode,13,m2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectUnitCode,14,ton/일,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectUnitCode,15,천원,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PaymentKindCode,10,기성,NULL,NULL,수금현황,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PaymentKindCode,11,선금,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PaymentKindCode,12,준공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OutsidePartCode,10,원자재,NULL,NULL,외주관리-분야,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OutsidePartCode,11,부자재,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OutsidePartCode,12,설비,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OutsidePartCode,13,건설하도급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OutsidePartCode,14,안전용품,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OutsidePartCode,15,인쇄,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-2-3,휴가계,02;1;관리자:임원:RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-2-15,연장근무확인서,02;1;임원:RECEIVE:담당:임원:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-2-1,근태신청서,02;1;관리자:임원:RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
Team,3,3팀(공무),공무팀,NULL,NULL,NULL,NULL,NULL,NULL,_P13302_
|
||||||
|
CrossBeamMethodCode,10,"C-RC-0.30 x L",NULL,"프리캐스트가로보, 형고=0.30m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CrossBeamMethodCode,20,"C-RC-0.35 x L",NULL,"프리캐스트가로보, 형고=0.35m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CrossBeamMethodCode,30,"C-RC-0.65 x L",NULL,"프리캐스트가로보, 형고=0.65m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CrossBeamMethodCode,40,"C-RC-0.95 x L",NULL,"프리캐스트가로보, 형고=0.95m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CrossBeamMethodCode,50,"C-RC-1.25 x L",NULL,"프리캐스트가로보, 형고=1.25m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PannelMethodCode,10,"D1-PCH-3.0 x L",NULL,"프리덱 PC 너트적용형",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PannelMethodCode,20,"D1-PCB-3.0 x L",NULL,"프리덱 강봉노출형",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PannelMethodCode,30,"D1-RC-3.0 x L",NULL,"프리덱 R.C 연장 3.0m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PannelMethodCode,40,"D1-RC-3.6 x L",NULL,"프리덱 R.C 연장 3.6m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PannelMethodCode,50,"D2-RC-2.4 x L",NULL,"미관 연장 2.4m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PannelMethodCode,60,"D3-RC-2.4 x L",NULL,"중분대패널 연장 2.4m",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProcessStaffCode,20,시공계획서,검토,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,10,공사중,시공중,"공사현황,생산현황",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,11,공사중(Segmantal),NULL,"공사현황,생산현황",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DegreeCode,10,박사,NULL,NULL,경력관리-최종학력,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DegreeCode,11,석사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DegreeCode_del,12,학사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DegreeCode_del,13,전문학사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DegreeCode,14,고졸,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TechnicalLevelCode,10,특급,NULL,NULL,경력관리-기술등급,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TechnicalLevelCode,11,고급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TechnicalLevelCode,12,중급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TechnicalLevelCode,13,초급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E8,계약직,직원,계약직,NULL,23,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,18,교휴,4,NULL,교육/휴가등,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,11a,발주처,NULL,NULL,교영-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,11b,시공사,NULL,NULL,교영-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,11c,설계사,NULL,NULL,교영-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,11d,기타,NULL,NULL,교영-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12a,조사/협의,NULL,NULL,"교영-02,교영-03,교영-04,교영-05,교영-06,교영-07",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12b,"설게,검토",NULL,NULL,"교영-02,교영-03,교영-04,교영-05,교영-06,교영-07",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12c,견적,NULL,NULL,"교영-02,교영-03,교영-04,교영-05,교영-06,교영-07",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12d,기타,NULL,NULL,"교영-02,교영-03,교영-04,교영-05,교영-06,교영-07",NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,13a,"계약,기성",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,13b,시공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,13c,노무,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,13d,자재,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,13e,안전,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,13f,A/S,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,13g,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,14a,조사및계획,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,14b,실험,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,14c,실행,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,14d,상품화,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,14e,설게지원,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,14f,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,15a,계획,NULL,NULL,관리-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,15b,분석,NULL,NULL,관리-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,15c,회의,NULL,NULL,관리-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,15d,지원,NULL,NULL,관리-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,15e,사외,NULL,NULL,관리-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,16a,급여,NULL,NULL,관리-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,16b,근태,NULL,NULL,관리-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,16c,입퇴사,NULL,NULL,관리-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,16d,지원,NULL,NULL,관리-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,16e,기타,NULL,NULL,관리-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,17a,건물,NULL,NULL,관리-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,17b,차량,NULL,NULL,관리-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,17c,비품,NULL,NULL,관리-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,17d,장비,NULL,NULL,관리-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,17e,행사,NULL,NULL,관리-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,17f,지원,NULL,NULL,관리-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,17g,기타,NULL,NULL,관리-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,18a,계약,NULL,NULL,관리-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,18b,기성,NULL,NULL,관리-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,18c,실적,NULL,NULL,관리-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,18d,구매,NULL,NULL,관리-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,18e,협회,NULL,NULL,관리-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,18f,업면허,NULL,NULL,관리-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,18g,기타,NULL,NULL,관리-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,19a,금융,NULL,NULL,관리-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,19b,회계,NULL,NULL,관리-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,19c,세무,NULL,NULL,관리-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,19d,출납,NULL,NULL,관리-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,19e,결산,NULL,NULL,관리-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,19f,기타,NULL,NULL,관리-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,22a,직무교육,,,교휴-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,22b,전문교육,,,교휴-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,22c,교양교육,,,교휴-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,22d,기타,,,교휴-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,23a,예비군,,,교휴-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,23b,민방위,,,교휴-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,23c,기타,,,교휴-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,24a,현장철수,,,교휴-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,24b,휴직,,,교휴-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,24c,징계,,,교휴-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,24d,병가,,,교휴-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,24e,기타,,,교휴-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,25a,연차,,,교휴-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,25b,경조사,,,교휴-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,25c,특별휴가,,,교휴-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,25d,기타,,,교휴-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,26a,은행,,,교휴-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,26b,병원,,,교휴-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,26c,관공서,,,교휴-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,26d,협회,,,교휴-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,26e,기타,,,교휴-05,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,27a,기타,,,교휴-06,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,85,설계완료,설계완료,설계현황,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CompanyCode,P,파일테크,6,파일,piletech.co.kr,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,12,설계,5,28,교량설계,NULL,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,04,건설본부,본사,건설본부,J13310,4,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode_del,05,설계부,본사,설계,J07103,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,14,제조,6,NULL,제조공장,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,28a,"계획 및 협의",,"교량계획 , 현장조사, 업무협의(영업, 설계업무)",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,28b,구조계산,,"DR거더, GC라멘, SPLICED",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,28c,도면,,"종평면도, 일반도, 배근도",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,28d,산출서,,"수량산출서, 단가(견적서)",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,28e,검토,,"심의내용, 설계VE , 발주처 요구사항",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,28f,"보고서 및 시방서",,"보고서(기본,실시), 시방서(기본 및 실시)",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,28g,업무지원,,"현장, 공장, 영업, 공무",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProcessStaffCode,30,"Shop DWG",계산,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,15,철도,NULL,철도시설공단,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProcessStaffCode,10,계약,팀장,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProcessStaffCode,40,제작장,"도면 1",NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProcessStaffCode,50,철근반입,"도면 2",NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,30a,자재,NULL,NULL,제조-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,30b,총무,NULL,NULL,제조-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,30c,회계,NULL,NULL,제조-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,30d,관재,NULL,NULL,제조-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,31a,생산관리,NULL,NULL,제조-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,31b,출하,NULL,NULL,제조-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,31c,보일러,NULL,NULL,제조-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,31d,환경관리,NULL,NULL,제조-02,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,32a,품질검사,NULL,NULL,제조-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,32b,공정관리,NULL,NULL,제조-03,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,33a,전기,NULL,NULL,제조-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,33b,기계,NULL,NULL,제조-04,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CompanyCode,B,바론컨설탄트,3,바론,hanmaceng.co.kr,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizcarno_del,61오3653,투산,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizcarno_del,94소3847,엑티언스포츠,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizcarno_del,94소5437,포터2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizcarno_del,94소4247,E-마이티,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,06,생산본부,생산본부,생산,J01203,5,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C0,회장,임원,회장,NULL,0,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,11,Dr.,NULL,"Dr. Girder",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,10,DR,NULL,"DR Girder",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,12,GC,NULL,"GC Rahmen(DR)",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,13,Pre,NULL,PreBeam,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,15,DPC,NULL,"개량형 PSC Girder",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,16,SPG,NULL,"Spliced Girder",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,17,SP,NULL,"SP Pannel",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,18,sDR,NULL,"Segmental Girder",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,22,ETC,NULL,기타,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
Team,4,관리부,관리팀,NULL,NULL,NULL,NULL,NULL,NULL,_M02302_
|
||||||
|
ProjectSubCode,28h,기타,NULL,"A/S, 철야후 휴식, 외주관리",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12b,"조사 및 협의",,"지반조사,현장조사,문화재지표조사,노선답사,사전답사,교통량조사,발주처,관련업체,설명회,보고회,위원회,보고자료,협상자료,문헌및전산자료조사,기타",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPositionCode_del,8,회사이동,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessDivCode,10,실시설계,,실시,2,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessDivCode,11,기본설계,,기본,1,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessDivCode,12,설계변경,,설계변경,3,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,21,WDR,NULL,철도교,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,80,설계중,설계중,설계현황,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessStatus,10,추진중,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessStatus,11,수주완료,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessStatus,12,영업종료,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessPart,10,설계,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessPart,11,감리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessPart,12,환경,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessPart,13,안전진단,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessPart,14,거더,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessPart,15,파일,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessPart,16,전기시공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessOrderDept,1,국토해양부,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessOrderDept,2,한국도로공사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessOrderDept,3,철도시설공단,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessOrderDept,4,경기도,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessOrderDept,5,항만,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BusinessOrderDept,6,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,12,공사중(기타),NULL,"공사현황,생산현황",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,13,공사중(A/S),A/S,공사현황,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
Team,1,1팀(철근),철근팀,NULL,NULL,NULL,NULL,NULL,NULL,_J22305_
|
||||||
|
Team,2,2팀(패널),제작팀,NULL,NULL,NULL,NULL,NULL,NULL,_J24304_
|
||||||
|
ConstructStatusCode,61,공사예상,시공예상,"착공예상,설계현황",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,20,공사예정,NULL,"공사현황,생산현황",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12d,산출서,,"단가, 수량, 공사비, 수리계산서, 기타",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12e,"보고서 및 시방서",,"보고서(기본계획,기본설계,실시설계,지반조사,영향평가), 구조계산서,시방서(일반,특별), 유지관리계획서, 협상자료, 수치해석, 용지조서,기타",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12f,VE,,"기본설계, 실시설계, 현장조사, 노선검토, ,공사비산출, 도면작성,자료수집, 답변자료, 기타",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12g,기타,,"A/S, 철야후휴식, 외주관리, 행정업무",,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode_del,E1B,팀장,직원,팀장,NULL,13,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode_del,E1A,실장,직원,실장,NULL,12,NULL,NULL,NULL,NULL
|
||||||
|
ProcessStaffCode,60,철근가공,"수량 1",NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProcessStaffCode,70,가로보제작,"수량 2",NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProcessStaffCode,80,패널제작,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,66,공정표에서제외,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,70,영업완료,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,71,영업취소,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,60,영업중,NULL,"착공예상,설계현황",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,16,T/K(대안),NULL,T/K(대안),NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,17,기타,NULL,기타,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,82,설계확정,설계확정,설계현황,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,83,설계중(A/S),설계중(A/S),설계현황,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,81,재설계,재설계,설계현황,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,51,공사중지,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,12c,도면,,"종단, 횡단, 평면, 터널, 연약지반, 비탈면, 기초, 구조물, 주상도,",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,30,제작완료,NULL,,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,40,공사대기,NULL,대기/단계별시공,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,50,공사완료,시공완료,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,20,팀장,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,30,형틀공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,40,철근공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,80,보통인부,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,20,현장,해당프로젝트코드,"프로젝트코드 입력","근무시간에 포함",5,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,10,직원,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,14,Post,NULL,"In-T. Girder",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,84,설계취소,설계취소,설계현황,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-1-17,출장/배차신청서,02;1;관리자:임원:RECEIVE:담당:임원:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,50,용접공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,60,인장공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,70,가설공,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkPersonType,90,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkCsPart,10,제작,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkCsPart,20,인장,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkCsPart,30,가설,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkCsPart,40,B/L,4,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkCsPart,50,패널/가로보,5,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkCsPart,60,기타,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CollectionPaymentCode,10,현금,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CollectionPaymentCode,20,B2B+,NULL,B2B+,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CollectionPaymentCode,21,B2B,NULL,B2B,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CollectionPaymentCode,22,전자실물,NULL,전자,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OutsidePartCode,20,원청사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode_del,07,현장(작업반),현장,현장,NULL,7,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod_del,19,sPre,NULL,"Segmental PreBeam",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,08,기술영업본부,NULL,기술영업,J07103,3,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode_del,09,영업팀,NULL,영업,J11301,3,NULL,NULL,NULL,NULL
|
||||||
|
bizcarno,68소5709,소나타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,10,김경태,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,11,김규준,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,12,김규홍,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,13,김성호,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,14,김현곤,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,15,김현철,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,16,김형곤,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,17,박광욱,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,18,박철진,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,19,안종기,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,20,양현석,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,21,이민호,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,22,이세정,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,23,이승균,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,24,이종갑,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,25,천병재,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,26,최문기,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,27,최종선,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,28,최철만,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,29,김상진,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,10,"DR Girder",DR,"DR Girder",,1,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,18,"Segmental DR Girder",DR(Seg),"Segmental DR Girder",,2,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,11,"Dr. Girder",Dr,"Dr. Girder",,3,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,30,"Segmental Dr.Girder",Dr(Seg),"Segmental Dr.Girder",,4,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,21,"Dr. W/F Girder",WDR,"Dr. Wide Flange Girder",,5,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,16,"Dr. Spliced Girder",SPG,"Dr. Spliced Girder",,6,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,31,"Pretention Girder",PTG,"Pretention Girder",,7,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,32,"Nodular Girder",NOD,"Nodular Girder",,8,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,15,"기타(DPC Girder)",DPC,"DPC Girder",,9,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,33,"기타(PC Arch)",,"PC Arch",,10,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,13,"GC Rahmen[Pre-Beam]",Pre-Beam,Pre-Beam,,11,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,14,"GC Rahmen[Inverted T]",In-T,"Inverted T",,12,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,19,"GC Rahmen[Segmental Inverted T]",In-T(Seg),"Segmental Inverted T",,13,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,12,"GC Rahmen[Dr. Girder]",SGC,"Dr. Girder",,14,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,34,"GC Rahmen[Segmental Dr. Girder]",SGC(Seg),"Segmental Dr. Girder",,15,NULL,NULL,NULL,NULL
|
||||||
|
ConstructionMethod,22,기타,기타,기타,,16,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,30,이종태,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BridgeDesignFile,1,시공계획서,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BridgeDesignFile,2,인장계획서,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BridgeDesignFile,3,가설계획서,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BridgeDesignFile,4,시공상세도,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,31,"봉 현",,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,10,현장소장,현장,현장관리자,NULL,6,NULL,NULL,NULL,NULL
|
||||||
|
CompanyKind,JANG,장헌산업,CP001,"장헌산업:JANG:CP001,파일테크:PILE:CP002,한맥기술:HANM:CP003",,1,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode_del,99,회사공지,회사공지,회사공지,,99,NULL,NULL,NULL,NULL
|
||||||
|
OrderKind,PQ,PQ,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL
|
||||||
|
OrderKind,SOQ,SOQ,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL
|
||||||
|
OrderKind,TP,TP,NULL,NULL,NULL,3,NULL,NULL,NULL,NULL
|
||||||
|
OrderKind,협상,협상,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C3A,기술위원,임원,기술위원,NULL,4,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,18,외출,해당프로젝트코드,"프로젝트코드 입력","근무시간에 포함",4,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,32,최성욱,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,0,자리있음,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,1,"자리있음(집중 근무중)",,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,2,자리비움,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,3,회의중,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,4,외근중,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,5,출장중,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,6,출장중(장기),,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,7,휴가중,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,8,휴가중(장기),,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-2-4,"연차휴가 변경계획서",02;1;관리자:임원:RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-1-18,업무주차확인증,02;1;RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TeamLeader,33,김길호,,,,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ConstructStatusCode,41,공사완료2,제작거치완료,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,9,파견중,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,10,훈련중,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,11,교육중,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,12,휴직중,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
AbsentCode,13,현장근무중,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-9-4,명함신청서,02;1;RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-9-6,재직증명서발급신청,02;1;RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-9-7,원천징수영수증,02;1;RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-9-2-s,연장근무신청서(개인),02;1;관리자:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-9-2,연장근무신청서(팀장),02;1;임원:RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-2-5,"연차휴가 변경계획서(전체)",02;1;관리자:임원:RECEIVE:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,11,생산본부(생산직),생산본부(생산직),생산본부(생산직),NULL,9,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-3-1,일일작업보고,02;1;팀장:부서장:부사장:대표:RECEIVE:FINISH;,"개정일 : 2019.03.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,19,계약,1,11,계약,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-4-1,발신공문,02;1;팀장:부서장:부사장:대표:RECEIVE:FINISH;,"개정일 : 2019.04.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-4-2,수신공문,02;1;팀장:부서장:부사장:대표:RECEIVE:FINISH;,"개정일 : 2019.04.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OrderCompanyCode,18,일반건설업,NULL,일반건설업,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
CompanyType,JANG,장헌산업,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-5-1,계산서전표,02;1;팀장:부서장:부사장:RECEIVE:담당:부서장:대표:FINISH;,"개정일 : 2018.07.04",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-5-4,정산전표(계산서),02;1;팀장:부서장:부사장:RECEIVE:담당:부서장:대표:FINISH;,"개정일 : 2025.09.08",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,C9,수석연구원,임원,수석연구원,,10,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E1D,책임연구원,직원,책임연구원,,14,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E9,선임연구원,직원,선임연구원,,17,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E99,연구원,직원,연구원,,22,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,12,기술개발센터,NULL,기술개발센터,NULL,6,NULL,NULL,NULL,NULL
|
||||||
|
GroupCode,13,총괄기획실,NULL,총괄기획실,NULL,7,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,88,연구직,NULL,NULL,X,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,77,수습직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,75,별정직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,00,임원,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,10,1급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,81,촉탁직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,20,2급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,30,3급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,40,4급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,83,계약직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,85,임시직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,50,5급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,60,6급(갑),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,62,6급(을),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,70,7급,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,91,실습생,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,95,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,94,파견직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionRank,01,임원2,NULL,NULL,X,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AB0001,설계및비상주감리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AB0002,설계및감리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AA0002,그룹관리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AT0001,해외사업총괄,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AW001,자금,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AZ0000,외주관리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AW002,출납,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AI0000,기술개발,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AJ0000,업무,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AK0000,경리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AL0000,기획,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AN0000,총무,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AA0000,관리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AO0000,인사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AH0000,교환,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AB0000,설계,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AC0000,감리,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AD0000,운전,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AE0000,CAD,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AG0000,사무보조,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,000000,대표이사,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AP0000,전산,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AQ0000,비서직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AR0000,경비(수위),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AS0000,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AT0000,해외사업,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AU0000,"통,번역",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AA0001,,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DutyCode,AV0000,영업,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OccupationCode,70,특수직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OccupationCode,20,기술직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OccupationCode,30,기능직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OccupationCode,40,사무행정직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OccupationCode,50,기타,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OccupationCode,60,연구직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
OccupationCode,10,관리직,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DegreeCode,12,대졸,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
DegreeCode,13,초대졸,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41a,계획,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41b,조사.분석,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41c,검토회의,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41d,테스트.수정,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41e,S/W설계,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41f,구현,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41g,변수.알고리즘,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41h,UI,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41i,Eng.Work,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41j,컨셉디자인,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41k,디자인시안,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41l,디자인가이드,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41m,행정,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectSubCode,41n,기타,NULL,NULL,기술-01,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProjectCode,41,기술,10,41,기술,NULL,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,19,시차,XX-교휴-04,"XX-교휴-04 (시작시간~종료시간)",시차,1,NULL,NULL,NULL,NULL
|
||||||
|
HrCompanyCode,BARON,바론,NULL,NULL,NULL,6,NULL,NULL,NULL,NULL
|
||||||
|
HrCompanyCode,HALLA,한라산업,NULL,NULL,NULL,5,NULL,NULL,NULL,NULL
|
||||||
|
HrCompanyCode,HANMAC,한맥기술,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL
|
||||||
|
HrCompanyCode,JANG,장헌산업,NULL,NULL,NULL,3,NULL,NULL,NULL,NULL
|
||||||
|
HrCompanyCode,PTC,피티씨,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL
|
||||||
|
HrCompanyCode,SAMAN,삼안,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,11,채용,NULL,NULL,입사,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,13,보직,NULL,NULL,"직책에 임명함",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,15,정기승진,NULL,NULL,정기승진,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,17,정기승급,NULL,NULL,정기승급(승호),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,18,전보,NULL,NULL,"부서변경 및 조직변경으로 인한 부서명칭변경",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,19,파견(부서),NULL,NULL,"부서간 파견(근무부서 변경)",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,20,사간전입,NULL,NULL,"가족사간 근무(관리)회사 이동_근무회사(입사처리)",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,21,사간전출,NULL,NULL,"가족사간 근무(관리)회사 이동_근무회사 퇴사처리",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,25,겸직,NULL,NULL,"두 개 이상의 부서에 근무",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,27,복귀,NULL,NULL,"파견 복귀",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,31,특별승진,NULL,NULL,"정기승진 대상자를 제외한 포상승진",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,33,특별승급,NULL,NULL,"정기승급 대상자를 제외한 포상승급",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,37,직위변경,NULL,NULL,직위변경,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,39,전환,NULL,NULL,"직무 및 분야 변경",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,41,복직(개인),NULL,NULL,복직(개인),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,47,복직(출산),NULL,NULL,복직(출산),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,51,휴직(개인),NULL,NULL,휴직(개인),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,54,휴직(유산),NULL,NULL,휴직(유산),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,56,휴가(출산),NULL,NULL,휴가(출산),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,57,휴직(육아),NULL,NULL,휴직(육아),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,65,복직(병가),NULL,NULL,복직(병가),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,66,복직(유산),NULL,NULL,복직(유산),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,67,복직(육아),NULL,NULL,복직(육아),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,74,정규직전환,NULL,NULL,정규직전환,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,80,대기(감리),NULL,NULL,감리대기자,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,81,재입사,NULL,NULL,재입사,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,82,퇴직정산,NULL,NULL,퇴직정산,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,85,대기,NULL,NULL,"발령부서가 확정되지 않아 관리부서 대기",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,91,계약연장,NULL,NULL,"계약직 계약연장",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A1,겸직해제,NULL,NULL,겸직해제,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A2,대기(채용),NULL,NULL,대기(채용),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A3,대기(퇴사),NULL,NULL,대기(퇴사),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A4,면직,NULL,NULL,"직책에서 물러남",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A5,채용(가족사),NULL,NULL,"가족사간 소속회사 이동(입사)",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A6,파견(합사),NULL,NULL,"합사로 파견(근무부서 변경)",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A7,파견(해외),NULL,NULL,"해외현장 파견(근무부서 변경)",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A8,휴직(병가-공상),NULL,NULL,휴직(병가-공상),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,A9,휴직(병가-사상),NULL,NULL,휴직(병가-사상),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,B1,파견(가족사),NULL,NULL,"가족사간 근무(관리)회사 이동_소속회사",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,ZC,퇴직(가족사),NULL,NULL,"가족사간 소속회사 이동(퇴직)",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,ZE,"퇴직(계약만료,공사종료)",NULL,NULL,"퇴직(계약만료, 공사종료)",NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,ZG,퇴직(권고사직),NULL,NULL,퇴직(권고사직),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,ZJ,퇴직(자유의사),NULL,NULL,퇴직(자유의사),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,ZN,퇴직(지분이동),NULL,NULL,퇴직(지분이동),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,ZR,퇴직(해고),NULL,NULL,퇴직(해고),NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrOrder,ZZ,퇴직,NULL,NULL,기타퇴직,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizcarno,184무2358,투산,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
HrCompanyCode,ETC,기타,NULL,NULL,NULL,7,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,30,오전반차,XX-교휴-04,"XX-교휴-04 (a)오전반차",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
UserStateCode,31,오후반차,XX-교휴-04,"XX-교휴-04 (a)오후반차",NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-3-10,연차휴가사용계획서,00;1;팀장:부서장:FINISH;,"개정일 : 2016.05.01",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PositionCode,E8A,기술직근로자,직원,기술직근로자,NULL,24,NULL,NULL,NULL,NULL
|
||||||
|
WorkType,30,1차인장,1차인장,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkType,40,거더거치,거더거치,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkType,50,가로보가설,가로보,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkType,60,패널가설,Deck,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkType,70,2차인장,2차인장,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkType,80,벤트설치,벤트설치,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkType,90,벤트해제,벤트해제,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
PaymentKindCode,13,계약외,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BridgeDesignFile,5,제작장배치도,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
BridgeDesignFile,6,인장결과서,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProductUnit,1,EA,EA,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProductUnit,2,ton,ton,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProductUnit,3,롤,롤,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProductUnit,4,본,본,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProductUnit,5,파렛트,파렛트,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProductUnit,6,SET,SET,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProductUnit,7,kg,kg,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
ProductUnit,8,포대,포대,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContents,COMPANYINFO,회사소개,COMPANYINFO,회사소식,,1,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContents,BASICINFO,기본자료,BASICINFO,안전,,2,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContents,MSDS,MSDS자료,MSDS,안전,,3,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContents,EDUCATION,"교육자료 ",EDUCATION,안전,,4,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContents,METHOD,"공법 ",METHOD,직원교육,,5,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContents,PRODUCTION,제작,PRODUCTION,직원교육,,6,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContents,REBAR,철근,REBAR,직원교육,,7,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContentsType,VIDEO,영상,VIDEO,,,1,NULL,NULL,NULL,NULL
|
||||||
|
TouchBoardContentsType,PDF,PDF,PDF,,,2,NULL,NULL,NULL,NULL
|
||||||
|
Sequences,File,Seq,0,공통_FILE_SEQ채번,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-9-8,재직증명서발급신청,02;1;RECEIVE:FINISH;,"개정일 : 2025.02.11",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
WorkType_del,60,패널가설,가설,NULL,NULL,NULL,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,인사A,"Personal Management 조회",NULL,Y,인사,10,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,인사B,"Personal Management 편집",NULL,Y,인사,11,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,사업A,"사업관리 조회",NULL,Y,업무,20,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,사업B,"사업관리 편집",NULL,Y,업무,21,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,공장A,"공장 조회",NULL,Y,공장,30,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,공장B,"공장 편집",NULL,Y,공장,31,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,공사A,"공사관리 조회",NULL,Y,공사,40,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,공사B,"공사관리 편집",NULL,Y,공사,41,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,경리A,"Account 조회",NULL,Y,회계,50,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,경리B,"Account 편집",NULL,Y,회계,51,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,노무A,"노무자 조회",NULL,Y,노무,60,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,노무B,노무관리,NULL,Y,노무,61,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,임원,"근태이력,연차이력(전부서)",NULL,Y,임원,70,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,총무,"공지사항(글쓰기)/사내양식,배차(편집)/점심식단",NULL,Y,총무,80,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,부서,"근태이력,연차이력(해당부서)",NULL,Y,부서,90,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,임원회의,"회의록(임원회의자료 열람/저장)",NULL,Y,임원회의,100,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,영업회의,"회의록(영업회의자료 열람/저장)",NULL,Y,영업회의,110,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,일반회의,"회의록(설계/공사회의자료 열람/저장)",NULL,Y,일반회의,120,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,지적,지적재산권(편집),NULL,Y,지적재산,130,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,설정,설정권한자,NULL,Y,설정,140,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,한맥,"한맥기술 접근",NULL,Y,한맥,150,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,파일,"파일테크 접근",NULL,Y,파일,160,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,대화대표,대화시스템-전부서조회가능,NULL,Y,대화대표이사,170,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,대화부서,대화시스템-해당부서조회가능,NULL,Y,대화부서장,180,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,기술자료,"기술자료 업로드(자료실)",NULL,Y,기술자료,190,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,전표결재,전표결재,NULL,Y,전표결재,200,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,조직,"팀관리-조직구성 메뉴 조회",NULL,Y,조직,210,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,조달,"조달청 나라장터 입찰정보 조회",NULL,Y,조달,310,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,업무A,"사업관리(구 Project Management) 조회 - 사용안함",NULL,N,업무,22,NULL,NULL,NULL,NULL
|
||||||
|
intra_auth,업무B,"사업관리(구 Project Management) 편집 - 사용안함",NULL,N,업무,23,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-5-2,기타전표,02;1;팀장:부서장:부사장:RECEIVE:담당:부서장:대표:FINISH;,"개정일 : 2018.07.04",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-5-3,전도금전표,02;1;팀장:부서장:부사장:RECEIVE:담당:부서장:대표:FINISH;,"개정일 : 2025.09.08",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
bizform,JHF-5-5,정산전표(기타),02;1;팀장:부서장:부사장:RECEIVE:담당:부서장:대표:FINISH;,"개정일 : 2025.09.08",Jangheon,NULL,NULL,NULL,NULL,NULL
|
||||||
|
105393
csv/dailyproject.csv
Normal file
321
csv/member.csv
Normal file
@@ -0,0 +1,321 @@
|
|||||||
|
MemberNo,korName,RankCode,GroupCode,WorkPosition,chiName,engName,EntryDate,LeaveDate,eMail,Company,WorkCompany
|
||||||
|
M08502,김갑성,C7,9,9,金甲成,"Kim Kapseong",2008-02-01,2013-03-31,ks721kim@jangheon.co.kr,NULL,NULL
|
||||||
|
J06302,장경문,E7,3,9,張京文,"Jang Kyung Mun",2006-10-16,2008-04-21,,NULL,NULL
|
||||||
|
J06303,윤동혁,E7,5,9,尹東赫,"Yun Dong Hyuck",2006-10-16,2009-09-21,,NULL,NULL
|
||||||
|
M05510,김인열,C6,4,1,金仁烈,"Kim in yeol",2005-08-20,0000-00-00,kiy8536@jangheon.co.kr,JANG,JANG
|
||||||
|
M02108,김락희,C7,2,9,金樂喜,"Kim Laghee",2002-10-28,2007-02-28,Laghee@dreamwiz.com,NULL,NULL
|
||||||
|
J05209,윤정호,E3,3,9,尹廷豪,"Yoon, jeongho",2005-05-26,2006-08-25,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J05211,임태경,E1,10,9,任泰暻,"Im Tae Gyeong",2005-06-01,2010-06-25,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J06102,이용운,C8,2,9,李用雲,"LEE YONGWOON",2006-02-21,2008-12-31,ywlee@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J06401,안병록,C3A,1,1,"安 秉錄","Byung Lok, An",2018-04-01,0000-00-00,bl3245@jangheon.co.kr,JANG,BARON
|
||||||
|
J06301,강성희,E7,2,9,康盛喜,"KANG SUNG HEE",2006-04-12,2009-08-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J06103,김윤수,C6,1,9,金潤秀,"KIM YOON SOO",2006-03-01,2006-10-15,,NULL,NULL
|
||||||
|
J06601,유운호,E8,3,9,柳運浩,,2006-10-23,2007-04-30,,NULL,NULL
|
||||||
|
J06201,조현수,E1,5,9,趙賢銖,"jo hun su",2006-12-18,2007-06-30,hsjock712@hmtele.com,NULL,NULL
|
||||||
|
J07201,김형일,E2,5,9,金亨一,"Kim Hyoung il",2007-01-01,2007-11-30,khi2903@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07202,김회성,C8,6,9,金會成,"Kim Hoi Sung",2007-01-01,2020-03-31,kyr5004@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07203,이태휘,E4,2,9,李泰輝,"Lee Tae Hwi",2007-01-01,2007-01-06,leeth1228@hotmail.com,NULL,NULL
|
||||||
|
J07101,부교탁,C6,1,9,夫喬鐸,"Boo Kyo Tag",2006-02-26,2007-05-30,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
T02220,주상구,E1,5,9,周相龜,"Joo Sang Gu",1996-07-08,2015-07-31,twojoo96@hmtele.com,NULL,NULL
|
||||||
|
J07204,이호묵,E2,4,9,李鎬默,"Lee Ho Mook",2007-02-26,2007-11-30,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07205,도한영,E2,2,9,都翰泳,"Do Han Young",2007-02-26,2008-11-30,k3726@piletech.co.kr,NULL,NULL
|
||||||
|
J07206,구인회,E3,4,9,具仁會,"Gu In Hoi",2007-02-26,2007-12-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07207,유일욱,E3,4,9,劉一郁,"Yoo Il Wook",2007-02-26,2007-10-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
M03101,이경열,C6,2,9,李京烈,LEEKYUNGYOUL,2003-01-01,2003-01-01,lky702@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07208,이방희,E1,4,9,李邦熙,,2007-04-02,2008-05-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07601,김영옥,E8,6,9,金永玉,,2007-04-03,2009-02-10,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07602,김석태,E8,6,9,金錫泰,,2007-04-03,2010-01-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07102,유명근,C6,3,9,劉命根,"Yoo Myung Keun",2007-04-25,2007-06-30,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07103,김용혁,C6,8,9,金容赫,"yonghuck kim",2007-05-01,2020-12-31,yonghuck@naver.com,JANG,JANG
|
||||||
|
J07209,박종민,E3,3,9,朴鍾珉,"Park jong min",2007-05-01,2010-06-25,nati77@jangheon.co.kr,NULL,NULL
|
||||||
|
J07210,이정훈,C8,8,1,李正訓,"Lee Jeong Hoon",2007-06-04,0000-00-00,fb1t@jangheon.co.kr,JANG,BARON
|
||||||
|
T06202,최동석,E1,2,9,崔童碩,"choi dong seok",2006-03-20,2006-03-20,rtpa77@hmtele.com,NULL,NULL
|
||||||
|
J01201,권혁진,C9,13,9,權赫鎭,"Kwon Hyok Jin",2004-10-04,2026-01-05,cozyjin@hanmaceng.co.kr,JANG,BARON
|
||||||
|
J01202,이지나,E7,3,9,李智那,"Lee Ji Na",2007-10-01,2008-09-17,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07212,권준모,E4,3,9,權埈模,"Kwon Jun Mo",2007-10-16,2008-07-15,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J07213,권준모,E4,3,9,NULL,NULL,0000-00-00,2010-01-01,NULL,NULL,NULL
|
||||||
|
J07214,권준모,E4,3,9,NULL,NULL,0000-00-00,2010-01-01,NULL,NULL,NULL
|
||||||
|
J17201,김범석,E7,4,9,金範席,"Kim Bum Seok",2007-10-17,2007-12-31,@hanmaceng.co.kr,,
|
||||||
|
J01203,주상구,C8,6,9,周相龜,"Ju Sang Gu",1996-07-08,2015-07-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J14201,서정락,E1,4,9,徐正洛,"Seo jeong lack",2008-01-14,2019-03-31,sas1465@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J11201,윤상훈,E3,5,9,尹祥勳,"YOUN SANGHUN",2008-02-11,2009-10-22,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J11202,양종식,C7,4,1,楊鐘植,"Yang Jong Sik",2008-02-11,0000-00-00,cejs76@jangheon.co.kr,JANG,JANG
|
||||||
|
J08301,이민진,E7,8,9,李旼珍,"LEE MINJIN",2008-03-03,2012-04-24,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J08201,김재호,C7,8,9,金載澔,"Kim jae ho",2008-04-14,2024-04-30,hazaking@jangheon.co.kr,JANG,JANG
|
||||||
|
T03236,강호선,E4,2,9,姜浩仙,"Kang ho-sun",2003-06-04,2003-06-04,hsunny@hmtele.com,NULL,NULL
|
||||||
|
J08202,염인순,E7,2,9,염인순,,2008-05-26,2008-05-26,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J08203,곽은지,E7,2,9,郭恩智,"Kwak eun ji",2008-06-09,2010-06-30,kawgi@jangheon.co.kr,NULL,NULL
|
||||||
|
J18201,신영인,E1,5,9,辛泳寅,,2008-06-18,2008-09-30,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J14301,장은영,E7,5,9,장은영,"Jang eun young",2008-07-14,2009-03-16,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J01204,김종열,E1,2,9,金鐘烈,"kim chong yoeal",2008-08-01,2009-05-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J08302,홍석철,E7,2,9,洪錫哲,"Hong Seok Chul",2008-08-04,2010-11-30,preya20@jangheon.co.kr,NULL,NULL
|
||||||
|
J08101,우창윤,C6,4,9,禹昌潤,,2008-09-01,2009-08-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J08303,윤희민,E7,5,9,尹喜珉,"Yoon Hee Min",2008-10-01,2009-10-22,thms4@jangheon.co.kr,NULL,NULL
|
||||||
|
J08304,정은택,E7,5,9,鄭恩宅,"Jeong Eun Taek",2008-10-01,2009-10-22,windbreak@jangheon.co.kr,NULL,NULL
|
||||||
|
J08305,김규호,E3,2,9,金圭鎬,"Kim Gyu Ho",2008-10-09,2008-10-09,mofaiu@jangheon.co.kr,NULL,NULL
|
||||||
|
J08306,주영진,E3,2,9,周泳鎭,"Joo Young Jin",2008-10-09,2016-01-31,icarus@jangheon.co.kr,NULL,NULL
|
||||||
|
J08307,박찬영,E7,4,9,朴贊煐,"Park chan young",2008-10-27,2012-12-31,pcy0503@jangheon.co.kr,NULL,NULL
|
||||||
|
J08204,송성윤,E1,4,9,宋祥鉉,"SONG SANG HYUN",2008-11-14,2014-03-31,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J08205,황영섭,E2,2,9,,,2008-11-17,2008-11-30,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J08206,김재헌,C7,2,2,金哉憲,"KIM JAE HEON",2008-11-12,0000-00-00,@hanmaceng.co.kr,BARON,
|
||||||
|
T02303,신현우,C6,2,2,申鉉宇,"Hyun-Woo, Shin",2000-01-03,0000-00-00,recruit@hanmaceng.co.kr,BARON,
|
||||||
|
J15202,류한규,C8,8,9,柳漢圭,"Ryu Han Kyu",2015-06-01,2021-05-31,ipkn1919@jangheon.co.kr,JANG,JANG
|
||||||
|
Tadmin,관리자,E5,12,1,,Admin,2020-05-20,0000-00-00,erp@jangheon.co.kr,BARON,NULL
|
||||||
|
J09301,김옥영,E7,5,9,金玉永,"Kim Ok Young",2009-04-06,2009-05-30,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J09101,김우천,C7,8,9,金祐千,"kim woo chun",2009-05-06,2020-03-18,wckim@jangheon.co.kr,JANG,JANG
|
||||||
|
T08301,최은영,E3,2,9,崔銀英,"Choi Eunyoung",2008-03-03,2021-04-06,dms9020@hmtele.com,NULL,NULL
|
||||||
|
J09601,박영훈,E8,6,9,박영훈,,2009-02-01,2010-01-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J09302,윤선일,E4,4,9,尹宣壹,"Sun Il Youn",2009-11-09,2018-03-31,TLKSKY@jangheon.co.kr,NULL,NULL
|
||||||
|
J09102,강상욱,C6,8,9,姜相郁,"Sang wook, Kang",2009-12-07,2022-10-31,kangswksm@jangheon.co.kr,JANG,JANG
|
||||||
|
J09304,손윤정,E7,6,9,,,2009-11-12,2010-05-20,SYJ0805@jangheon.co.kr,NULL,NULL
|
||||||
|
J09305,이윤정,E7,3,9,李倫正,"Yun-jung, Lee",2009-11-16,2011-11-30,yj870722@jangheon.co.kr,NULL,NULL
|
||||||
|
J09201,방희철,C6,3,9,方熙喆,"Bang Heui Chul",2009-12-14,2011-03-30,hcbang59@jangheon.co.kr,NULL,NULL
|
||||||
|
J09202,김봉준,E1,8,9,金鳳俊,"Bong-Joon, Kim",2009-12-14,2012-10-31,bjkim08@hanmaceng.co.kr,NULL,NULL
|
||||||
|
M02302,김승국,C7,6,8,金承局,"Kim Seung Guk",2010-10-01,2026-01-05,civilksk@jangheon.co.kr,JANG,JANG
|
||||||
|
J13310,남점권,C6,4,9,南点權,"Nam Jeom Kwon",2013-07-01,2017-02-28,jknam61@jangheon.co.kr,NULL,NULL
|
||||||
|
J10401,윤진호,C8,4,9,尹鎭浩,Jason.Yoon(Jinho),2010-02-17,2011-03-25,yetoto@jangheon.co.kr,NULL,NULL
|
||||||
|
J10301,최태순,C7,4,1,崔泰洵,"Chil tae soon",2010-02-22,0000-00-00,khw04@jangheon.co.kr,JANG,JANG
|
||||||
|
J10501,오정태,E2,4,9,吳定泰,"Oh jeong tae",2010-02-22,2011-05-31,ohjungtae@jangheon.co.kr,NULL,NULL
|
||||||
|
J10302,이승열,E4,8,9,李丞烈,"Lee seung yeol",2010-02-22,2013-02-25,sy820420@jangheon.co.kr,NULL,NULL
|
||||||
|
J10202,이장욱,E2,8,9,李章旭,"lee jang uk",1997-10-11,2014-03-31,19720308@jangheon.co.kr,JANG,JANG
|
||||||
|
M05102,정해웅,C1,1,9,鄭海雄,"CHUNG HAE UNG",2005-12-01,2005-12-01,huc@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J10303,강지성,E3,6,9,姜智聲,"KANG JI SUNG",2009-07-20,2016-07-31,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J10304,노홍주,E3,8,9,盧弘周,"NOH HONG JU",2010-06-22,2012-09-30,hee7812@jangheon.co.kr,NULL,NULL
|
||||||
|
J10305,강미정,E7,6,9,,,2010-06-21,2010-08-30,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J10307,정지영,E7,2,9,鄭智英,"Ji Young, Jung",2010-07-05,2013-04-30,unity1213@jangheon.co.kr,NULL,NULL
|
||||||
|
J10308,차성대,C7,4,1,車成大,"CHA SUNG DAI",2010-07-19,0000-00-00,csd915@jangheon.co.kr,JANG,JANG
|
||||||
|
M06315,허유미,E4,8,9,許有美,"Heo Yu-Mi",2006-12-11,2018-08-31,hyumi@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J10311,이호재,E1,4,9,李鎬在,"Lee Ho Jae",2003-12-15,2014-03-31,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J10310,김정기,C7,4,9,金正基,"Kim Jung Gi",2010-11-15,2023-07-31,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J10309,이동주,E1,4,9,李棟株,"LEE DONG JU",2010-10-25,2022-02-02,djlee@jangheon.co.kr,JANG,JANG
|
||||||
|
J10312,김경환,E2,4,9,金京煥,"KIM KYUNG HWAN",2002-10-14,2011-04-12,@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J10313,김미자,E3,6,8,金美子,"KIM MI JA",2010-11-11,2025-12-31,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J10314,김진,C8,8,1,"金 眞","kim jin",2010-11-29,0000-00-00,kimjin1971@jangheon.co.kr,JANG,BARON
|
||||||
|
J10315,허남덕,C6,4,9,許南德,"Hur Nam DUK",2010-11-29,2021-12-31,hkn1010@naver.com,JANG,NULL
|
||||||
|
M09103,박영옥,C7,2,9,朴永玉,"Park Youngok",2009-04-01,2012-01-15,kkumenergy@hanmaceng.co.kr,NULL,NULL
|
||||||
|
M01103,서성열,C1,1,1,徐聖烈,"Seo, Sung Yeol",2015-01-20,0000-00-00,sys55@jangheon.co.kr,JANG,PTC
|
||||||
|
J11301,동원영,C7,1,9,董原榮,"Dong Won Young",2011-05-16,2014-12-31,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J11203,박재홍,E1,8,9,朴宰弘,"Park Jae Hong",2011-06-13,2019-10-31,j11203@jangheon.co.kr,JANG,JANG
|
||||||
|
J11302,박진오,E2,4,9,朴珍五,"Park Jin Oh",2011-07-01,2022-02-06,jino4516@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J11303,유붕종,C8,2,9,"劉 鵬 鍾","YOO BOUNG JONG",2011-11-01,2017-03-31,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J11204,김현중,E3,8,9,金炫中,"Kim Hyon-Joong",2011-11-01,2012-02-28,J11204@jangheon.co.kr,NULL,NULL
|
||||||
|
J11304,윤효상,E3,6,9,,,2010-10-04,2015-08-31,yunhyo24@jangheon.co.kr,NULL,NULL
|
||||||
|
J11305,정대수,C7,8,9,鄭大洙,"Jung Dae Soo",2012-01-01,2021-05-31,dsjung67@gmail.com,JANG,JANG
|
||||||
|
T02230,조영훈,E1,2,2,趙令勳,ChoYoungHoon,1999-06-21,1999-06-21,atoz20002@hanmaceng.co.kr,,NULL
|
||||||
|
T02328,김지우,E4,2,9,金祉佑,"kim ji woo",2002-01-07,2002-01-07,juyajuya@hanmaceng.co.kr,,NULL
|
||||||
|
B09301,오석근,E5,2,9,吳碩根,"Oh seok keun",2009-06-01,2009-06-01,mivacore@hanmaceng.co.kr,,NULL
|
||||||
|
J12201,오승현,C9,12,9,吳昇炫,"Oh Seung Hyun",2008-08-04,2021-07-31,hyun3201@jangheon.co.kr,JANG,JANG
|
||||||
|
J12202,이종승,C8,4,9,李鐘承,"Yi Jong seung",2007-12-03,2023-03-25,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J12203,지영걸,C7,9,9,池英杰,"JI YOUNG GEOL",2012-07-02,2013-02-28,hirojee@jangheon.co.kr,NULL,NULL
|
||||||
|
J12301,전웅,C8,1,9,田雄,"Jun WoongJun Woong",0000-00-00,2013-04-30,junito@hanmaceng.co.kr,NULL,NULL
|
||||||
|
J12302,최호란,E1,4,9,NULL,NULL,0000-00-00,2012-12-31,NULL,NULL,NULL
|
||||||
|
T04204,신윤식,C8,6,9,申允湜,"Yoon-Shik Shin",2004-03-15,2023-01-31,gyvermc@phonex.co.kr,JANG,JANG
|
||||||
|
J13201,문종탁,E1,8,1,文鐘卓,"Moon Jong-Tak",2013-02-18,0000-00-00,jtmoon@jangheon.co.kr,JANG,BARON
|
||||||
|
J13301,김시배,E4,8,9,金時培,"KIM SI BAE",2013-03-04,2013-07-11,ksb1212@jangheon.co.kr,JANG,JANG
|
||||||
|
J13302,심현리,E7,2,9,沈炫里,"Sim Hyeon-ri",2013-04-01,2014-04-30,hyeonri@jangheon.co.kr,NULL,NULL
|
||||||
|
J13303,김근혁,E4,2,9,金根赫,"KIM KeunHyuk",2013-04-22,2018-03-31,khkim@jangheon.co.kr,JANG,JANG
|
||||||
|
J13305,윤두현,E2,4,9,尹斗鉉,"Yun Du Hyun",2013-04-22,2022-03-15,doohyuny04@jangheon.co.kr,JANG,JANG
|
||||||
|
J13309,정재환,E7,8,9,鄭在桓,"Jung Jae Hwan",2013-04-29,2013-06-18,alltogether34@jangheon.co.kr,JANG,JANG
|
||||||
|
J13308,이의환,E1,4,1,李義煥,"Eui-Hwan, Lee",2013-04-22,0000-00-00,j13308@jangheon.co.kr,JANG,JANG
|
||||||
|
M02107,이경훈,C2,1,9,NULL,NULL,1997-04-01,1997-04-01,NULL,NULL,NULL
|
||||||
|
tadmin2,관리자2,E1,6,8,,TEST,2018-02-01,0000-00-00,,,
|
||||||
|
J13311,나지영,E7,9,9,羅志映,"Na Jiyoung",2013-12-09,2013-12-16,blue8831@jangheon.co.kr,NULL,NULL
|
||||||
|
J13312,조수민,E7,1,9,趙秀珉,"Jo Su Min",2013-12-26,2014-12-25,,NULL,NULL
|
||||||
|
J14302,이석준,E1,4,9,李碩俊,"lee seok jun",2014-03-01,2024-10-27,neosj21@jangheon.co.kr,JANG,JANG
|
||||||
|
J14303,이철우,C2,1,9,李哲雨,"lee cheol woo",2014-01-01,2025-03-31,lee@jangheon.co.kr,JANG,HANMAC
|
||||||
|
J14304,김문호,C2,1,9,"金 汶 祜","Kim Moon Ho",2014-03-03,2015-04-19,mhkim313@jangheon.co.kr,JANG,JANG
|
||||||
|
M02105,최동식,C5,1,9,崔東植,"Choi Dong Sig",2001-07-09,2001-07-09,cds@hanmaceng.co.kr,,NULL
|
||||||
|
M02206,김원근,C7,1,9,金源根,"kim won geon",2001-07-09,2001-07-09,kimwg7872@hanmaceng.co.kr,,NULL
|
||||||
|
B13306,이지혜,E5,2,9,李知惠,"Lee JiHye",2013-12-13,2013-12-13,leejh@hanmaceng.co.kr,,NULL
|
||||||
|
B10301,선우현,E5,2,9,"鮮于 玄","Sunwoo Hyun",2010-01-04,2010-01-04,sianneas@hanmaceng.co.kr,,NULL
|
||||||
|
B14301,최지은,E5,20,9,崔지은,"Choi Ji Eun",2014-03-19,2014-03-19,jieun@hanmaceng.co.kr,,NULL
|
||||||
|
J14306,이지혜,E4,4,9,李知惠,"Lee JiHye",2013-12-13,2020-03-08,leejh@jangheon.co.kr,NULL,NULL
|
||||||
|
J14202,황재민,E1,8,1,黃載珉,"Hwang Jae Min",2014-05-21,0000-00-00,jmhwang@hanmaceng.co.kr,JANG,PTC
|
||||||
|
P13302,이세민,E1,6,8,李洗旼,,2013-02-25,2025-12-31,jini3474@jangheon.co.kr,JANG,JANG
|
||||||
|
J14308,고영배,E2,6,9,高泳培,"Go Yeongbae",2008-05-26,2022-07-31,go4zzang@jangheon.co.kr,JANG,JANG
|
||||||
|
J14101,남궁전,C6,8,9,南宮典,"Namgung jeon",2014-09-15,2021-02-28,nam1309@jangheon.co.kr,JANG,JANG
|
||||||
|
J14203,이중경,E2,8,9,李重慶,"Lee Joong kyung",2014-09-22,2016-04-25,first7777@jangheon.co.kr,NULL,NULL
|
||||||
|
J14309,최명희,E3,4,9,,,2014-02-01,2016-12-31,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J14204,배규환,C8,6,9,裵圭煥,"Bae Kyu Whan",2014-10-13,2016-10-12,bkh@jangheon.co.kr,NULL,NULL
|
||||||
|
J14601,우승욱,E7,4,9,禹勝昱,"Woo Seung Uk",2014-10-01,2015-03-31,xian8909@jangheon.co.kr,JANG,JANG
|
||||||
|
J14310,최혜란,E2,2,9,,,2006-09-01,2020-04-30,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J14311,이정수,E3,2,9,,,2011-04-01,2024-04-01,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J14312,박지현,E3,6,9,,,2014-03-01,2025-08-31,pakgh7@hanmail.net,JANG,JANG
|
||||||
|
J14313,양정규,E3,2,9,,,2012-01-01,2012-01-01,@hanmaceng.co.kr,JANG,JANG
|
||||||
|
M12201,남갑준,C1,1,9,南甲俊,"Nam Kab Joon",2014-03-01,2019-06-30,,JANG,JANG
|
||||||
|
J15201,조수원,C6,8,9,趙秀元,"CHO SUWON",2015-02-01,2026-03-08,"jomabal@naver. com",JANG,JANG
|
||||||
|
M08102,정태준,C1,2,9,NULL,NULL,0000-00-00,2000-01-01,NULL,NULL,NULL
|
||||||
|
B15302,하유미,E5,20,9,NULL,NULL,0000-00-00,2000-01-01,NULL,NULL,NULL
|
||||||
|
J15301,권민준,E2,4,9,權?埈,"Kwon Min Jun",2015-04-01,2025-06-19,kgamja89@naver.com,JANG,JANG
|
||||||
|
J15302,장승현,E3,8,9,張昇賢,"Jang SeungHyun",2015-04-01,2023-08-31,keunnamu1000@jangheon.co.kr,JANG,JANG
|
||||||
|
J15101,류영섭,C3A,1,1,柳永燮,"Ryoo young sub",2015-05-06,0000-00-00,ysryoo@gmail.com,JANG,BARON
|
||||||
|
J15307,이병수,E2,8,9,李炳秀,"Lee Byung Soo",2015-11-16,2025-06-30,leebs@jangheon.co.kr,JANG,JANG
|
||||||
|
M16319,박규식,C6,2,9,NULL,NULL,0000-00-00,2017-07-31,NULL,NULL,NULL
|
||||||
|
J15206,이태준,C8,4,9,李泰俊,"LEE TAE JOON",2015-10-01,2020-12-31,uccpl109@empas.com,JANG,JANG
|
||||||
|
B16315,손다혜,E5,2,9,孫多慧,"Dahhye Sohn",2016-12-13,2017-03-20,jane9029@naver.com,,NULL
|
||||||
|
J15303,이상호,E3,6,9,NULL,NULL,2015-07-08,2015-07-24,NULL,NULL,NULL
|
||||||
|
J15304,양수현,E7,6,9,梁修顯,"Yang Su Hyeon",2015-07-20,2016-12-15,,JANG,JANG
|
||||||
|
J15203,김기홍,C6,8,9,金起弘,"Kim Ki-hong",2015-08-17,2017-03-31,shapren@jangheon.co.kr,JANG,JANG
|
||||||
|
B15306,남궁성,E3,4,1,南宮珹,"Nam Kung Sung",2015-08-10,0000-00-00,sunga13@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J15204,임진홍,C7,8,9,任眞弘,IMJINHONG,2015-09-01,2017-01-31,yjh04569@naver.com,JANG,JANG
|
||||||
|
J15205,김도훈,E1D,12,9,金度勳,"Kim Do Hoon",2015-09-01,2021-09-30,dhkim@jangheon.co.kr,JANG,JANG
|
||||||
|
J15305,이우승,E5,8,9,李祐昇,"Lee Woo Seung",2015-09-02,2019-02-28,vl_civil@jangheon.co.kr,JANG,JANG
|
||||||
|
M21201,정태원,C6,1,9,,"Taewon Chung",2014-07-01,2014-07-01,ctw@hanmaceng.co.kr,,NULL
|
||||||
|
J15306,김세열,E1D,12,9,金世悅,"Kim Se Yul",2015-10-05,2025-12-31,j15306@hanmaceng.co.kr,JANG,BARON
|
||||||
|
J16101,남철우,C8,6,9,南哲祐,"Nam Chul Woo",2016-02-16,2017-04-18,cwnam@samaneng.com,NULL,NULL
|
||||||
|
J16201,권명호,E1,4,9,,,2016-04-01,2018-04-30,,JANG,JANG
|
||||||
|
J16202,이중경,C8,8,1,李重慶,"Lee Joong Kyung",2016-06-02,0000-00-00,first7777@jangheon.co.kr,JANG,JANG
|
||||||
|
J16203,표용암,E1,6,9,"表 龍 岩","yong am pyo",2016-07-01,2020-01-31,yapyo2002@hanmail.net,NULL,NULL
|
||||||
|
B17305,정혜윤,E4,2,2,,,2017-03-02,0000-00-00,jhyy12@naver.com,BARON,NULL
|
||||||
|
J17202,송효근,E2,6,9,宋效根,,2017-04-03,2018-06-30,cmp78@nate.com,NULL,NULL
|
||||||
|
J17301,정환주,E5,6,9,鄭煥主,"Jung Hwan Joo",2017-04-03,2017-10-31,tkels200@naver.com,NULL,NULL
|
||||||
|
J17203,이상엽,C7,6,9,李相曄,"Lee Sang Yeob",2017-04-17,2018-11-15,yeobi0717@hanmail.net,JANG,JANG
|
||||||
|
J17204,전영신,E2,4,9,全永信,"Jeon Young Sin",2017-07-10,2021-08-16,ysjeon@jangheon.co.kr,JANG,JANG
|
||||||
|
J17205,김성원,E1,8,1,金成元,"Kim Sung Won",2017-09-01,0000-00-00,yi04@nate.com,JANG,JANG
|
||||||
|
J17206,신상한,C8,4,9,辛相翰,"Shin Sang Han",2017-12-18,2018-08-10,shinys43@korea.com,JANG,JANG
|
||||||
|
J18202,이휘창,C7,4,9,李暉彰,"Lee Hwi Chang",2018-02-01,2021-03-31,lee2373g@hanmail.net,JANG,JANG
|
||||||
|
J18203,김인수,C7,4,1,金寅洙,"Kim In Soo",2018-02-01,0000-00-00,cclkiss@hanmail.net,JANG,JANG
|
||||||
|
J18204,김상준,E2,4,9,金商俊,"Kim Sang Jun",2018-02-01,2019-05-31,m16mmk3@hotmail.com,JANG,JANG
|
||||||
|
J22201,윤선일,E2,4,1,尹宣壹,,2022-02-28,0000-00-00,j22201@jangheon.co.kr,JANG,JANG
|
||||||
|
J17207,김량균,C5,8,1,金亮均,"Kim Ryang Gyun",2017-08-01,0000-00-00,rgkim@jangheon.co.kr,JANG,JANG
|
||||||
|
J18205,정충열,E1,8,9,鄭忠烈,"Jeong Choong Yeol",2008-02-11,2025-06-05,,JANG,JANG
|
||||||
|
J18206,남점권,C5,1,9,南点權,"Nam Jeom Kwon",2018-07-01,2025-12-31,jknam61@hanmail.net,JANG,JANG
|
||||||
|
J18301,이재영,E1,4,1,李在英,"Lee Jae Young",2018-05-02,0000-00-00,young7471@jangheon.co.kr,JANG,JANG
|
||||||
|
B18305,황선영,E5,2,9,,,2018-05-08,2019-07-25,,,NULL
|
||||||
|
J18207,권길수,C6,4,9,權吉秀,"Kwon Gil Soo",2018-11-12,2021-03-31,kgs1350@hanmail.net,JANG,JANG
|
||||||
|
J18208,박종석,E2,6,9,朴種錫,"Park Jong Seok",2018-12-03,2020-01-31,lodpower@naver.com,NULL,NULL
|
||||||
|
J18302,강동해,E8,4,9,,,2018-11-01,2019-07-08,kangdh960481@naver.com,JANG,JANG
|
||||||
|
J18303,문교선,E2,4,9,文敎鮮,"Mun Kyo Sun",2018-09-03,2020-03-31,skm7773@nate.com,,NULL
|
||||||
|
J19201,최현진,E3,8,9,崔賢鎭,"Choi Hyun Jin",2019-04-15,2019-05-31,guswis@naver.com,JANG,JANG
|
||||||
|
J19202,김태균,E2,10,9,金泰均,"Kim Tai Kyun",2019-05-01,2020-10-31,taikyun77@naver.com,JANG,JANG
|
||||||
|
J19301,강용환,E1,4,9,康溶桓,"Kang Yong Hwan",2019-06-19,2023-04-30,yhkang@jangheon.co.kr,JANG,JANG
|
||||||
|
B19306,김지영,E5,2,9,金智瑛,"Kim Ji Young",2019-06-03,2021-06-02,welcome0426@naver.com,BARON,
|
||||||
|
J19101,남갑준,C1,1,9,,,2019-07-01,2021-12-31,,JANG,JANG
|
||||||
|
J19302,박상호,E2,10,9,朴相鎬,,2019-09-18,2021-03-31,antkddlstod@hanmail.net,JANG,JANG
|
||||||
|
J19303,김원삼,E1,4,9,,,2019-10-21,2020-07-13,kjdu2801@naver.com,JANG,JANG
|
||||||
|
J18209,이승준,E2,4,9,,,2018-11-01,2018-11-01,,NULL,NULL
|
||||||
|
J20201,박영철,E1,6,9,朴映澈,"Park Young Cheol",2020-01-02,2022-03-12,parkk7034@hanmail.net,JANG,JANG
|
||||||
|
J20202,박영철,E1,6,9,NULL,NULL,2020-01-02,2020-01-02,NULL,NULL,NULL
|
||||||
|
B20306,이민규,E5,2,2,NULL,NULL,2020-04-20,0000-00-00,NULL,BARON,NULL
|
||||||
|
B20305,현동규,E5,2,2,NULL,NULL,2020-04-20,0000-00-00,NULL,BARON,NULL
|
||||||
|
J20601,김민균,E3,4,9,金玟均,"KIM MIN GYUN",2020-06-01,2021-04-25,gyun1126@naver.com,JANG,JANG
|
||||||
|
J20602,이은창,E1,4,9,,,2020-07-14,2020-10-13,,JANG,JANG
|
||||||
|
J20603,주정운,E1,4,9,,"Ju jeongun",2020-11-01,2022-07-31,jeongun3654@naver.com,JANG,JANG
|
||||||
|
J20301,김근형,E9,12,9,金根亨,"Kim Geun Hyeong",2020-06-01,2025-12-31,rmsgud1202@naver.com,JANG,BARON
|
||||||
|
J20302,홍대기,E9,12,9,洪大基,"Hong Dae Ki",2020-06-08,2024-12-03,hdk@hanmaceng.co.kr,JANG,HANMAC
|
||||||
|
J20303,김영배,E9,12,9,金英培,"Kim Young Bae",2020-09-07,2025-12-31,b20327@hanmaceng.co.kr,JANG,BARON
|
||||||
|
J20304,조아라,E9,13,9,,"Jo a ra",2020-08-03,2024-07-25,joara778@gmail.com,JANG,HANMAC
|
||||||
|
J20305,황규관,E9,12,9,黃圭冠,"Kyukwan Hwang",2020-06-22,2025-10-17,hwang7kk@gmail.com,JANG,BARON
|
||||||
|
J20203,김유식,C9,12,9,,"Kim Yu Sic",2016-12-15,2025-12-31,samasil@hanmail.net,JANG,BARON
|
||||||
|
B20334,유재욱,E3,2,2,兪哉旭,"Yu Jae Wook",2020-11-09,0000-00-00,b20334@hanmaceng.co.kr,BARON,
|
||||||
|
HM02146,이준희,E3,2,2,,,2018-01-22,0000-00-00,,BARON,
|
||||||
|
B20107,조서경,C5,4,9,曺瑞卿,"Cho Seo Kyung",2020-11-02,2023-02-28,B20107@hanmaceng.co.kr,SAMAN,
|
||||||
|
B21308,정창빈,E5,2,2,NULL,NULL,2021-02-02,0000-00-00,NULL,BARON,NULL
|
||||||
|
B21303,오혜성,E5,2,2,NULL,NULL,2021-01-18,0000-00-00,NULL,BARON,NULL
|
||||||
|
B21321,윤성찬,E5,2,2,NULL,NULL,2021-03-22,0000-00-00,NULL,BARON,NULL
|
||||||
|
J21601,권민수,E2,4,9,權珉首,"Kwon min soo",2021-05-07,2021-07-27,i6367@hanmail.net,JANG,JANG
|
||||||
|
J21301,윤성연,E5,8,9,,"Yun seong yeon",2021-05-10,2023-01-31,j21301@jangheon.co.kr,JANG,JANG
|
||||||
|
J21602,박선영,E6,8,9,朴宣映,"Park Sun Young",2021-06-07,2025-07-16,j21602@jangheon.co.kr,JANG,JANG
|
||||||
|
J21603,송재일,E3,4,9,,,2021-07-01,2021-07-31,,JANG,JANG
|
||||||
|
J21604,김재수,E1,4,9,金在洙,,2021-08-01,2022-01-26,463kjs@naver.com,JANG,JANG
|
||||||
|
J21302,박상은,E5,8,9,朴相恩,,2021-08-04,2023-10-31,pasaeu1@naver.com,JANG,JANG
|
||||||
|
B21355,최고은,E5,2,9,,,2021-08-20,2021-08-23,,BARON,NULL
|
||||||
|
J21303,조동일,E4,8,1,趙東逸,"CHO DONG IL",2021-10-01,0000-00-00,j21303@jangheon.co.kr,JANG,JANG
|
||||||
|
B21361,김윤지,E5,2,2,NULL,NULL,2021-10-05,0000-00-00,NULL,BARON,HANMAC
|
||||||
|
insa,인사관리자,E1,6,9,,,0000-00-00,2000-01-01,erp@jangheon.co.kr,BARON,NULL
|
||||||
|
J21605,나정현,E5,4,9,,,2021-10-01,2021-10-13,,JANG,JANG
|
||||||
|
J21201,조규일,E3,4,9,曺奎一,,2021-11-01,2022-02-22,j21201@jangheon.co.kr,JANG,JANG
|
||||||
|
ERP,총괄ERP,E1,6,8,,planner,2018-02-01,2000-01-01,erp@jangheon.co.kr,BARON,NULL
|
||||||
|
J21606,김형주,E4,4,9,金亨主,,2021-11-01,2024-08-09,dksusddl3406@naver.com,JANG,JANG
|
||||||
|
M21417,김동현,E5,2,2,金東賢,"Kim Dong Hyun",2021-01-04,0000-00-00,b21301@hanmaceng.co.kr,HANMAC,NULL
|
||||||
|
B14303,윤영주,E5,2,2,尹永周,"Yoon Young Joo",2014-05-14,0000-00-00,nangam92@hanmaceng.co.kr,BARON,NULL
|
||||||
|
M21411,남궁전,C6,1,9,南宮典,"Namgung jeon",2021-03-01,2022-07-31,m21411@hanmaceng.co.kr,JANG,HANMAC
|
||||||
|
J21607,정대성,E1,4,9,丁大成,,2021-12-08,2024-10-04,daisan71@hanmail.net,JANG,JANG
|
||||||
|
J22301,최동찬,E4,6,8,崔東燦,,2020-05-20,0225-12-31,cdc0601@naver.com,JANG,JANG
|
||||||
|
J22601,이태검,E1,4,9,,,2022-01-26,2022-03-09,secom88@hanmail.net,JANG,JANG
|
||||||
|
J16301,김동환,C4,1,1,,,2016-01-01,0000-00-00,,JANG,JANG
|
||||||
|
J21304,한형관,C2,1,2,,HanHyungKwan,2021-11-01,0000-00-00,han@hanmaceng.co.kr,JANG,HANMAC
|
||||||
|
J22302,김상철,C8,4,1,金相哲,,2022-02-14,0000-00-00,j22302@jangheon.co.kr,JANG,JANG
|
||||||
|
J22202,김범석,E1,4,1,金範席,"Kim bum seok",2022-03-14,0000-00-00,j22202@jangheon.co.kr,JANG,JANG
|
||||||
|
projt_mng,사업관리,E99,6,9,,projt_mng,2018-02-01,2000-01-01,,JANG,NULL
|
||||||
|
J22203,김경태,E1,4,9,,,2022-03-10,2022-11-20,,JANG,JANG
|
||||||
|
J22204,윤두현,E1,4,1,,,2022-04-18,0000-00-00,doohyuny04@jangheon.co.kr,JANG,JANG
|
||||||
|
M22021,김윤희,E5,2,9,,,2022-04-20,2023-06-26,,,
|
||||||
|
M22019,허인,E5,2,9,NULL,NULL,2022-04-20,2022-12-31,NULL,HANMAC,JANG
|
||||||
|
J22304,,E5,1,9,NULL,NULL,2022-06-03,0000-00-00,NULL,JANG,JANG
|
||||||
|
J22205,김동원,E3,4,1,金東院,"Kim Dong Won",2022-07-11,0000-00-00,J22205@jangheon.co.kr,JANG,JANG
|
||||||
|
J22206,박진현,E1,4,9,,"Park Jin Hyun",2022-07-25,2024-02-29,choops21@hanmail.net,JANG,JANG
|
||||||
|
J22207,안태욱,C8,8,9,安台彧,"An Tae Wook",2022-08-01,2025-06-23,atw3258@gmail.com,JANG,JANG
|
||||||
|
J22305,최만규,E3,6,8,崔萬圭,,2022-08-22,2025-12-31,mkchae2@naver.com,JANG,JANG
|
||||||
|
J21305,김지영A,E99,13,2,NULL,NULL,2019-06-03,0000-00-00,NULL,HANMAC,JANG
|
||||||
|
J22306,허남덕,C6,4,9,許南德,"Hur Nam DUK",2022-11-01,2024-10-31,j22306@jangheon.co.kr,JANG,JANG
|
||||||
|
J22208,김태후,E1,4,9,,,2022-11-21,2023-03-10,kmg0808@hanmail.net,JANG,JANG
|
||||||
|
J22209,양종선,E3,4,9,,"Yang Joungsun",2022-12-01,2023-12-29,yjs8080@naver.com,JANG,JANG
|
||||||
|
J22501,이태수,E8A,4,9,,"Li Taizhu",2022-12-01,2025-02-25,,JANG,JANG
|
||||||
|
J22307,Security,E5,6,9,NULL,NULL,2022-12-27,2022-12-31,NULL,HANMAC,HANMAC
|
||||||
|
J23301,이호범,E6,4,1,,"Lee Hobeom",2023-01-02,0000-00-00,ghghqja4402@naver.com,JANG,JANG
|
||||||
|
J23302,손현수,E6,8,9,,,2023-01-02,2024-08-31,gust7253@naver.com,JANG,JANG
|
||||||
|
M04101,이종관,C2,1,1,李鍾官,"Lee Jong Kwan",2004-06-01,0000-00-00,jmslee@dreamwiz.com,JANG,JANG
|
||||||
|
B22059,김윤아,E5,2,9,NULL,NULL,2023-01-03,2023-12-31,NULL,,
|
||||||
|
J23303,최성용,E4,4,1,,,2023-01-01,0000-00-00,ctjddyd@gmail.com,JANG,JANG
|
||||||
|
J23304,00,E4,4,9,NULL,NULL,2023-01-01,2023-03-07,NULL,JANG,JANG
|
||||||
|
B23007,유지원,E5,2,9,NULL,NULL,2023-02-06,2025-03-11,NULL,BARON,
|
||||||
|
J23305,이새봄,E99,13,9,,,2023-03-02,2025-12-31,j23305@jangheon.co.kr,JANG,BARON
|
||||||
|
M22045,윤여훈,E5,2,9,NULL,NULL,2016-06-07,2022-06-30,NULL,HANMAC,JANG
|
||||||
|
J23201,김경태,E1,4,9,NULL,NULL,2023-03-10,2023-03-20,NULL,JANG,JANG
|
||||||
|
J23306,테스트2,E5,12,8,NULL,NULL,2023-03-17,0000-00-00,NULL,,
|
||||||
|
J23601,강용길,E1,4,9,,"Kang Yong gil",2023-03-20,2025-01-15,kyg0084@naver.com,JANG,JANG
|
||||||
|
J23307,정우성,C7,8,1,鄭宇城,"Cheung Woo Sung",2021-04-01,0000-00-00,b21323@hanmaceng.co.kr,JANG,JANG
|
||||||
|
B23050,심보혜,C7,13,9,,Simbohye,2023-09-01,2024-08-31,sandysim@hanmaceng.co.kr,JANG,HANMAC
|
||||||
|
J23101,주상구,C7,4,1,周相龜,"Joo Sang Gu",2023-08-01,0000-00-00,twojoo96@hmtele.com,JANG,JANG
|
||||||
|
J23308,김인범,E5,6,8,金仁凡,,2023-10-18,2025-12-31,J23308@jangheon.co.kr,JANG,JANG
|
||||||
|
J23202,송용,E5,8,9,宋龍,,2023-12-18,2024-03-31,J23202@jangheon.co.kr,JANG,JANG
|
||||||
|
J24301,박선우,E5,8,1,朴善優,,2024-01-02,0000-00-00,J24301@jangheon.co.kr,JANG,JANG
|
||||||
|
J24302,이가연,E5,8,9,李佳硏,,2024-01-02,2025-05-09,J24302@jangheon.co.kr,JANG,JANG
|
||||||
|
B23071,김현지,E5,2,9,,,2024-01-02,2025-02-09,B23071@hanmaceng.co.kr,,
|
||||||
|
J24303,신기욱,E5,4,9,,,2024-01-02,2024-05-20,,JANG,JANG
|
||||||
|
M02210,장종찬,C5,13,2,張鍾讚,"Jang Jong Chan",2001-07-02,0000-00-00,jcjang@hanmaceng.co.kr,HANMAC,JANG
|
||||||
|
J24304,김성규,E1,6,9,NULL,NULL,2009-08-17,2025-10-30,NULL,PTC,PTC
|
||||||
|
J24307,김갑성,C6,4,1,金甲成,"Kim Kapseong",2024-04-01,0000-00-00,j24307@jangheon.co.kr,JANG,JANG
|
||||||
|
M24028,현경탁,C5,1,9,,,2024-04-01,2024-05-31,hkt2101@hanmail.net,PTC,PTC
|
||||||
|
J24201,최영준,C6,8,1,崔永駿,"choi young joon",2024-08-01,0000-00-00,zephyryj@naver.com,SAMAN,JANG
|
||||||
|
public,공통,E1,2,2,,NULL,2018-02-01,2000-01-01,NULL,BARON,NULL
|
||||||
|
public,,E4,2,2,,,2018-01-22,0000-00-00,,BARON,NULL
|
||||||
|
J24101,이훈재,C5,1,1,李?在,,2024-10-01,0000-00-00,seoul513@naver.com,JANG,JANG
|
||||||
|
J24501,박성일,C7,4,1,朴性一,,2024-10-24,0000-00-00,bboljji@hanmail.net,JANG,JANG
|
||||||
|
J24502,이창호,E8A,4,1,李昌鎬,"Lee chang ho",2024-11-01,0000-00-00,lchseoul@empas.com,JANG,JANG
|
||||||
|
J24503,이수식,C8,4,9,李洙植,"Lee soo sik",2024-11-01,2025-05-31,sik2012@naver.com,JANG,JANG
|
||||||
|
TOCUH_ADMIN,터치스크린,E1,6,8,,터치스크린,2024-12-16,NULL,,,
|
||||||
|
J25301,김성환,E1,4,1,,,2025-01-01,0000-00-00,3298748@naver.com,JANG,JANG
|
||||||
|
P25101,은도찬,C8,8,2,,,2025-01-06,0000-00-00,civileun96@naver.com,PTC,JANG
|
||||||
|
P25301,박지우,E5,4,1,,,2025-01-01,0000-00-00,pgu9961@naver.com,PTC,JANG
|
||||||
|
M24069,김유진,E5,2,2,,,2024-09-23,0000-00-00,,ETC,JANG
|
||||||
|
J25401,조양주,C6,4,9,,"CHO YANG JOO",2025-02-19,2025-02-28,M23032@hanmaceng.co.kr,JANG,JANG
|
||||||
|
J25501,주유천,C8,4,9,周裕千,,2025-03-17,2025-07-15,jjyc6000@naver.com,JANG,JANG
|
||||||
|
B24014,송대일,E4A,13,8,,,0000-00-00,0000-00-00,,BARON,
|
||||||
|
J25602,곽승용,E1,4,1,,,2025-06-25,0000-00-00,j25602@jangheon.co.kr,JANG,JANG
|
||||||
|
M07318,김원기,E4A,13,8,,,0000-00-00,0000-00-00,,BARON,
|
||||||
|
J25403,유이식,C8,4,9,,,2025-05-26,2025-08-31,,JANG,JANG
|
||||||
|
G25001,센터_기술기획팀,E5,12,8,,Admin,2020-05-20,0000-00-00,,BARON,NULL
|
||||||
|
J25303,김하영,E5,4,9,,,2025-07-01,2025-08-31,,JANG,JANG
|
||||||
|
J25601,윤충열,E1,4,1,,,2025-06-25,0000-00-00,ycy0922@hanmail.net,JANG,JANG
|
||||||
|
J25503,김영빈,E2,4,9,,,2025-07-14,2025-09-15,j25503@jangheon.co.kr,JANG,JANG
|
||||||
|
J25201,임재상,E4,4,9,,"Lee JAE SANG",2025-07-14,2025-11-30,j25201@jangheon.co.kr,JANG,JANG
|
||||||
|
J25603,조부건,E1,4,1,,,2025-06-25,0000-00-00,j25603@jangheon.co.kr,JANG,JANG
|
||||||
|
J25604,서범진,E3,4,1,,,2025-06-25,0000-00-00,j25604@jangheon.co.kr,JANG,JANG
|
||||||
|
J25504,안종기,C8,4,1,,,2025-07-16,0000-00-00,j25504@jangheon.co.kr,JANG,JANG
|
||||||
|
J25101,배문교,C2,1,1,裵文敎,"Bae Mun Gyo",2025-08-01,0000-00-00,baemg27@daum.net,JANG,JANG
|
||||||
|
J25505,박보희,E3,4,9,,,2025-08-01,2025-08-31,,JANG,JANG
|
||||||
|
P11302,김경수,E1,4,1,金暻洙,"KIM KYUNG SOO",2011-04-07,0000-00-00,diejsa@naver.com,장헌,장헌
|
||||||
|
J25304,이동열,E5,4,9,,,2025-09-01,2026-03-07,alovea640@naver.com,JANG,JANG
|
||||||
|
J25506,남수용,C8,4,1,,,2025-09-03,0000-00-00,nsy9067@hanmail.net,JANG,JANG
|
||||||
|
J25507,이형래,E2,4,9,,,2025-09-10,2025-09-17,j25507@jangheon.co.kr,JANG,JANG
|
||||||
|
J25305,박은별,E5,4,1,,,2025-09-22,0000-00-00,j25305@jangheon.co.kr,JANG,JANG
|
||||||
|
J25508,이수식,E8A,4,1,李洙植,,2025-08-28,0000-00-00,sik2012@naver.com,JANG,JANG
|
||||||
|
J25509,김기환,E4,4,9,金己桓,,2025-11-03,2026-04-10,j25509@jangheon.co.kr,JANG,JANG
|
||||||
|
admin2025,관리자3,E1,6,8,NULL,안전관리,2025-09-25,0000-00-00,NULL,NULL,NULL
|
||||||
|
J25510,이인갑,C8,4,1,,,2025-11-24,0000-00-00,,JANG,JANG
|
||||||
|
M24046,서우석,E4,2,2,,,2024-06-17,0000-00-00,,BARON,NULL
|
||||||
|
J26301,서우석,E4,2,1,NULL,NULL,2026-03-09,0000-00-00,NULL,BARON,JANG
|
||||||
|
J26302,김진규,C8,4,1,"金 鎭 圭",,2026-04-01,0000-00-00,jingkimm@naver.com,JANG,JANG
|
||||||
|
J26501,박대원,C8,4,1,,,2026-04-20,0000-00-00,J26501@jangheon.co.kr,JANG,JANG
|
||||||
|
2707
csv/project.csv
Normal file
14134
csv/state.csv
Normal file
234
csv/worker.csv
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
memberno,s_date,e_date,tardy_h,tardy_m,info,row_num,update_time
|
||||||
|
M03204,2020-03-12,2020-03-31,8,0,코로나,33,NULL
|
||||||
|
M13301,2018-04-10,2020-03-31,9,30,탄력근무,2,NULL
|
||||||
|
M09311,2020-03-12,2020-03-31,8,0,코로나,37,NULL
|
||||||
|
M16316,2020-03-12,2020-03-31,8,0,코로나,36,NULL
|
||||||
|
M17209,2020-03-12,2020-03-31,8,0,코로나,35,NULL
|
||||||
|
M18205,2020-03-12,2020-03-31,8,0,코로나,34,NULL
|
||||||
|
M18207,2020-03-12,2020-03-31,10,0,코로나,61,NULL
|
||||||
|
M18206,2020-03-12,2020-03-31,10,0,코로나,59,NULL
|
||||||
|
M19328,2020-03-12,2020-03-31,8,0,코로나,31,NULL
|
||||||
|
M18308,2020-03-12,2020-03-31,8,0,코로나,30,NULL
|
||||||
|
M19312,2020-03-12,2020-03-31,10,0,코로나,58,NULL
|
||||||
|
M17217,2020-03-12,2020-03-31,8,0,코로나,29,NULL
|
||||||
|
M18213,2020-03-12,2020-03-31,8,0,코로나,38,NULL
|
||||||
|
M19305,2020-03-12,2020-03-31,8,0,코로나,39,NULL
|
||||||
|
J14303,2020-03-12,2020-03-31,10,0,코로나,57,NULL
|
||||||
|
B20301,2020-03-12,2020-03-31,10,0,코로나,60,NULL
|
||||||
|
M02210,2020-03-12,2020-03-31,10,0,코로나,55,NULL
|
||||||
|
M16320,2020-03-12,2020-03-31,8,0,코로나,40,NULL
|
||||||
|
M10202,2020-03-12,2020-03-30,8,0,코로나,9,NULL
|
||||||
|
B20304,2020-03-12,2020-03-31,10,0,코로나,63,NULL
|
||||||
|
J08305,2020-03-12,2020-03-22,8,0,코로나,8,NULL
|
||||||
|
B19202,2020-03-12,2020-03-31,10,0,코로나,56,NULL
|
||||||
|
B18202,2020-03-12,2020-03-31,10,0,코로나,62,NULL
|
||||||
|
B19309,2020-03-12,2020-03-31,10,0,코로나,54,NULL
|
||||||
|
M17212,2020-03-12,2020-03-31,10,0,코로나,53,NULL
|
||||||
|
B20101,2020-03-12,2020-03-31,10,0,코로나,52,NULL
|
||||||
|
M15204,2020-03-12,2020-03-31,8,0,코로나,28,NULL
|
||||||
|
B19208,2020-03-12,2020-03-31,8,0,코로나,27,NULL
|
||||||
|
M17203,2020-03-12,2020-03-31,8,0,코로나,15,NULL
|
||||||
|
B16214,2020-03-12,2020-03-31,10,0,코로나,48,NULL
|
||||||
|
M18302,2020-04-01,2020-12-31,8,30,탄력근무,101,NULL
|
||||||
|
P11202,2020-03-12,2020-03-31,10,0,코로나,64,NULL
|
||||||
|
M06309,2020-03-12,2020-03-31,10,0,코로나,75,NULL
|
||||||
|
B18204,2020-03-12,2020-03-31,10,0,코로나,74,NULL
|
||||||
|
J14202,2020-03-12,2020-03-31,10,0,코로나,73,NULL
|
||||||
|
B19201,2020-03-12,2020-03-31,10,0,코로나,72,NULL
|
||||||
|
B18206,2020-03-12,2020-03-31,10,0,코로나,71,NULL
|
||||||
|
B18216,2020-03-12,2020-03-31,10,0,코로나,70,NULL
|
||||||
|
B18212,2020-03-12,2020-03-31,10,0,코로나,69,NULL
|
||||||
|
M12205,2020-03-12,2020-03-31,10,0,코로나,68,NULL
|
||||||
|
M06203,2020-03-12,2020-03-31,10,0,코로나,67,NULL
|
||||||
|
M04308,2020-03-12,2020-03-31,10,0,코로나,66,NULL
|
||||||
|
B17204,2020-03-12,2020-03-31,8,0,코로나,22,NULL
|
||||||
|
B10201,2020-03-12,2020-03-31,8,0,코로나,21,NULL
|
||||||
|
M18302,2020-03-12,2020-03-31,8,0,코로나,20,NULL
|
||||||
|
B17314,2020-03-12,2020-03-31,8,0,코로나,19,NULL
|
||||||
|
B14306,2020-03-12,2020-03-31,8,0,코로나,18,NULL
|
||||||
|
B18217,2020-03-12,2020-03-31,10,0,코로나,65,NULL
|
||||||
|
B18313,2020-03-12,2020-03-31,10,0,코로나,51,NULL
|
||||||
|
J19301,2020-03-12,2020-03-31,10,0,코로나,50,NULL
|
||||||
|
M08303,2020-03-12,2020-03-31,10,0,코로나,49,NULL
|
||||||
|
M18218,2020-03-12,2020-03-31,8,0,코로나,17,NULL
|
||||||
|
M16215,2020-03-12,2020-03-31,8,0,코로나,23,NULL
|
||||||
|
B19206,2020-03-12,2020-03-31,8,0,코로나,24,NULL
|
||||||
|
M17401,2020-03-12,2020-03-31,8,0,코로나,25,NULL
|
||||||
|
B17308,2020-03-12,2020-03-31,8,0,코로나,26,NULL
|
||||||
|
B19314,2020-03-12,2020-03-31,10,0,코로나,42,NULL
|
||||||
|
B16307,2020-03-12,2020-03-31,8,0,코로나,16,NULL
|
||||||
|
B16312,2020-03-12,2020-03-31,8,0,코로나,14,NULL
|
||||||
|
B18303,2020-03-12,2020-03-31,8,0,코로나,13,NULL
|
||||||
|
B16305,2020-03-12,2020-03-31,8,0,코로나,11,NULL
|
||||||
|
B19310,2020-03-12,2020-03-31,8,0,코로나,10,NULL
|
||||||
|
B17315,2020-03-12,2020-03-31,8,0,코로나,12,NULL
|
||||||
|
B18311,2020-03-12,2020-03-31,8,0,코로나,41,NULL
|
||||||
|
H15301,2020-03-12,2020-03-31,10,0,코로나,43,NULL
|
||||||
|
B19313,2020-03-12,2020-03-31,10,0,코로나,44,NULL
|
||||||
|
B16301,2020-03-12,2020-03-31,10,0,코로나,45,NULL
|
||||||
|
M16316,2020-04-01,2020-04-17,8,0,코로나,91,NULL
|
||||||
|
M17209,2020-04-01,2020-04-17,8,0,코로나,88,NULL
|
||||||
|
M18205,2020-04-01,2020-04-17,8,0,코로나,87,NULL
|
||||||
|
M18207,2020-04-01,2020-04-17,8,0,코로나,85,NULL
|
||||||
|
M18206,2020-04-01,2020-04-17,10,0,코로나,96,NULL
|
||||||
|
M19312,2020-04-01,2020-04-17,8,0,코로나,95,NULL
|
||||||
|
M18201,2020-04-01,2020-04-17,10,0,코로나,97,NULL
|
||||||
|
M19210,2020-04-01,2020-04-17,8,0,코로나,86,NULL
|
||||||
|
M20303,2020-04-01,2020-04-17,8,0,코로나,89,NULL
|
||||||
|
B17204,2020-04-01,2020-04-17,8,0,코로나,90,NULL
|
||||||
|
B19314,2020-04-01,2020-05-09,10,0,코로나,99,NULL
|
||||||
|
B19312,2020-04-01,2020-04-17,8,0,코로나,92,NULL
|
||||||
|
B10201,2020-04-01,2020-04-17,8,0,코로나,93,NULL
|
||||||
|
M18302,2019-02-01,2020-03-11,8,30,탄력근무,4,NULL
|
||||||
|
B16307,2020-04-01,2020-04-17,8,0,코로나,94,NULL
|
||||||
|
B16312,2020-04-01,2020-04-17,8,0,코로나,84,NULL
|
||||||
|
B18303,2020-04-01,2020-04-17,8,0,코로나,83,NULL
|
||||||
|
B16305,2020-04-01,2020-04-17,8,0,코로나,77,NULL
|
||||||
|
B19310,2020-04-01,2020-04-17,8,0,코로나,78,NULL
|
||||||
|
B17315,2020-04-01,2020-04-17,8,0,코로나,79,NULL
|
||||||
|
B18311,2020-04-01,2020-04-17,8,0,코로나,80,NULL
|
||||||
|
B19303,2020-04-01,2020-04-17,8,0,코로나,81,NULL
|
||||||
|
J14202,2020-04-01,2020-04-17,8,0,코로나,82,NULL
|
||||||
|
M08303,2020-04-01,2020-04-17,10,0,코로나,98,NULL
|
||||||
|
M18206,2020-06-02,2020-06-19,10,0,코로나,121,NULL
|
||||||
|
M18308,2020-06-02,2020-06-19,8,0,코로나,111,NULL
|
||||||
|
M19312,2020-06-02,2020-06-19,8,0,코로나,112,NULL
|
||||||
|
M05508,2020-06-02,2020-06-19,10,0,코로나,122,NULL
|
||||||
|
M20310,2020-06-02,2020-06-19,8,0,코로나,113,NULL
|
||||||
|
B17308,2020-06-02,2020-06-19,8,0,코로나,114,NULL
|
||||||
|
B19314,2020-06-02,2020-06-19,10,0,코로나,124,NULL
|
||||||
|
B18211,2020-11-06,2022-03-31,7,30,근로시간단축,199,NULL
|
||||||
|
B17206,2020-06-02,2020-06-19,8,0,코로나,106,NULL
|
||||||
|
B19316,2020-06-02,2020-06-19,8,0,코로나,115,NULL
|
||||||
|
B10201,2020-06-02,2020-06-19,8,0,코로나,110,NULL
|
||||||
|
B16307,2020-06-02,2020-06-19,8,0,코로나,117,NULL
|
||||||
|
B16312,2020-06-02,2020-06-19,10,0,코로나,123,NULL
|
||||||
|
B16305,2020-06-02,2020-06-19,8,0,코로나,119,NULL
|
||||||
|
B19310,2020-06-02,2020-06-19,8,0,코로나,116,NULL
|
||||||
|
B17315,2020-06-02,2020-06-19,8,0,코로나,118,NULL
|
||||||
|
B18311,2020-06-02,2020-06-19,8,0,코로나,109,NULL
|
||||||
|
B19303,2020-06-02,2020-06-19,8,0,코로나,108,NULL
|
||||||
|
M18201,2020-08-19,2020-09-11,8,0,코로나,145,NULL
|
||||||
|
M05508,2020-08-19,2020-09-11,10,0,코로나,150,NULL
|
||||||
|
M06203,2020-08-19,2020-09-11,10,0,코로나,149,NULL
|
||||||
|
B20314,2020-08-19,2020-09-11,8,0,코로나,134,NULL
|
||||||
|
M20310,2020-08-19,2020-09-11,8,0,코로나,135,NULL
|
||||||
|
B20313,2020-08-19,2020-09-11,8,0,코로나,136,NULL
|
||||||
|
B19314,2020-08-19,2020-09-28,10,0,코로나,154,NULL
|
||||||
|
B20317,2020-08-19,2020-09-11,8,0,코로나,137,NULL
|
||||||
|
B20312,2020-08-19,2020-09-11,8,0,코로나,138,NULL
|
||||||
|
B19316,2020-08-19,2020-09-11,8,0,코로나,147,NULL
|
||||||
|
B17315,2020-08-19,2020-09-11,8,0,코로나,139,NULL
|
||||||
|
B18211,2020-10-17,2020-11-05,9,0,근로시간단축,197,NULL
|
||||||
|
B20308,2020-08-19,2020-09-07,8,0,코로나,128,NULL
|
||||||
|
B20309,2020-08-19,2020-09-11,8,0,코로나,146,NULL
|
||||||
|
B19303,2020-08-19,2020-09-11,8,0,코로나,140,NULL
|
||||||
|
B18311,2020-08-19,2020-09-11,8,0,코로나,141,NULL
|
||||||
|
M20317,2020-08-19,2020-09-11,8,0,코로나,142,NULL
|
||||||
|
B20320,2020-08-19,2020-09-11,8,0,코로나,148,NULL
|
||||||
|
B18211,2020-10-07,2020-10-16,8,0,코로나,183,NULL
|
||||||
|
B10201,2020-08-19,2020-09-06,8,0,코로나,127,NULL
|
||||||
|
B16305,2020-08-19,2020-09-11,8,0,코로나,144,NULL
|
||||||
|
B20315,2020-08-19,2020-09-11,8,0,코로나,143,NULL
|
||||||
|
B19310,2020-08-19,2020-09-11,8,0,코로나,133,NULL
|
||||||
|
B16307,2020-08-19,2020-09-11,8,0,코로나,132,NULL
|
||||||
|
B16312,2020-08-19,2020-09-11,10,0,코로나,151,NULL
|
||||||
|
J10315,2020-08-19,2020-09-11,8,0,코로나,129,NULL
|
||||||
|
M02231,2020-08-19,2020-09-11,8,0,코로나,130,NULL
|
||||||
|
J13201,2020-08-19,2020-09-11,8,0,코로나,131,NULL
|
||||||
|
B20314,2020-09-07,2020-09-13,8,0,코로나,155,NULL
|
||||||
|
M20310,2020-09-07,2020-09-13,8,0,코로나,170,NULL
|
||||||
|
B20313,2020-09-07,2020-09-13,8,0,코로나,158,NULL
|
||||||
|
B19314,2020-09-07,2020-09-13,10,0,코로나,171,NULL
|
||||||
|
B20317,2020-09-07,2020-09-13,8,0,코로나,159,NULL
|
||||||
|
B17315,2020-09-07,2020-09-13,8,0,코로나,160,NULL
|
||||||
|
B20309,2020-09-07,2020-09-13,8,0,코로나,161,NULL
|
||||||
|
B19303,2020-09-07,2020-09-13,8,0,코로나,162,NULL
|
||||||
|
B18311,2020-09-07,2020-09-13,8,0,코로나,163,NULL
|
||||||
|
M20317,2020-09-07,2020-09-13,8,0,코로나,164,NULL
|
||||||
|
B20320,2020-09-07,2020-09-13,8,0,코로나,156,NULL
|
||||||
|
B18211,2020-09-14,2020-10-06,9,0,근로시간단축,172,NULL
|
||||||
|
B10201,2020-09-07,2020-09-13,8,0,코로나,165,NULL
|
||||||
|
B16305,2020-09-07,2020-09-13,8,0,코로나,166,NULL
|
||||||
|
B20315,2020-09-07,2020-09-13,8,0,코로나,167,NULL
|
||||||
|
B19310,2020-09-07,2020-09-13,8,0,코로나,168,NULL
|
||||||
|
B16307,2020-09-07,2020-09-13,8,0,코로나,169,NULL
|
||||||
|
B16312,2020-09-07,2020-09-13,8,0,코로나,157,NULL
|
||||||
|
M18201,2020-10-07,2020-10-16,10,0,코로나,193,NULL
|
||||||
|
M05508,2020-10-07,2020-10-16,10,0,코로나,194,NULL
|
||||||
|
M12502,2020-10-07,2020-10-16,10,0,코로나,196,NULL
|
||||||
|
M18207,2020-10-07,2020-10-16,8,0,코로나,176,NULL
|
||||||
|
M18308,2020-10-07,2020-10-16,8,0,코로나,177,NULL
|
||||||
|
M19312,2020-10-07,2020-10-16,8,0,코로나,178,NULL
|
||||||
|
B19314,2020-10-07,2020-10-16,10,0,코로나,191,NULL
|
||||||
|
B20317,2020-10-07,2020-10-16,8,0,코로나,179,NULL
|
||||||
|
B18211,2020-08-19,2020-09-13,8,0,코로나,152,NULL
|
||||||
|
B20309,2020-10-07,2020-10-16,8,0,코로나,180,NULL
|
||||||
|
B19303,2020-10-07,2020-10-16,8,0,코로나,181,NULL
|
||||||
|
B18311,2020-10-07,2020-10-16,10,0,코로나,192,NULL
|
||||||
|
M20317,2020-10-07,2020-10-16,8,0,코로나,182,NULL
|
||||||
|
B20320,2020-10-07,2020-10-16,8,0,코로나,190,NULL
|
||||||
|
B10201,2020-10-07,2020-10-16,8,0,코로나,189,NULL
|
||||||
|
B16305,2020-10-07,2020-10-16,8,0,코로나,188,NULL
|
||||||
|
B20315,2020-10-07,2020-10-16,8,0,코로나,175,NULL
|
||||||
|
B19310,2020-10-07,2020-10-16,8,0,코로나,187,NULL
|
||||||
|
B16307,2020-10-07,2020-10-16,8,0,코로나,174,NULL
|
||||||
|
B16312,2020-10-07,2020-10-16,8,0,코로나,184,NULL
|
||||||
|
J10315,2020-10-07,2020-10-16,8,0,코로나,185,NULL
|
||||||
|
J13201,2020-10-07,2020-10-16,8,0,코로나,186,NULL
|
||||||
|
B18211,2020-06-20,2020-08-18,9,0,근로시간단축,125,NULL
|
||||||
|
B18211,2020-06-02,2020-06-19,8,0,코로나,107,NULL
|
||||||
|
B18213,2018-11-19,2020-12-31,9,30,탄력근무,3,NULL
|
||||||
|
B18211,2020-04-01,2020-06-01,9,0,근로시간단축,100,NULL
|
||||||
|
B18211,2020-03-12,2020-03-31,8,0,코로나,32,NULL
|
||||||
|
B18211,2020-01-01,2020-03-11,9,0,근로시간단축,6,NULL
|
||||||
|
J15306,2020-02-03,2020-12-07,9,30,탄력근무(육아),7,NULL
|
||||||
|
M13301,2020-04-01,2020-04-17,8,0,코로나,76,NULL
|
||||||
|
M13301,2020-04-18,2020-11-30,9,30,탄력근무,105,NULL
|
||||||
|
J15205,2017-08-17,2020-03-11,9,30,탄력근무,1,NULL
|
||||||
|
J15205,2020-03-12,2020-03-31,10,0,코로나,46,NULL
|
||||||
|
J15205,2020-04-01,2020-12-31,9,30,탄력근무,103,NULL
|
||||||
|
M05205,2019-03-04,2020-03-11,9,30,탄력근무,5,NULL
|
||||||
|
M05205,2020-03-12,2020-03-31,10,0,코로나,47,NULL
|
||||||
|
M05205,2020-04-01,2020-12-31,9,30,탄력근무,102,NULL
|
||||||
|
B13301,2020-10-17,2020-12-07,9,30,탄력근무,198,NULL
|
||||||
|
B13301,2020-04-18,2020-06-01,10,0,탄력근무,104,NULL
|
||||||
|
B13301,2020-06-02,2020-06-19,10,0,코로나,120,NULL
|
||||||
|
B13301,2020-06-20,2020-08-18,10,0,탄력근무,126,NULL
|
||||||
|
B13301,2020-08-19,2020-09-13,10,0,코로나,153,NULL
|
||||||
|
B13301,2020-09-14,2020-10-06,10,0,탄력근무,173,NULL
|
||||||
|
B13301,2020-10-07,2020-10-16,10,0,코로나,195,NULL
|
||||||
|
B13301,2021-01-01,2021-07-05,9,30,탄력근무,230,NULL
|
||||||
|
M18207,2020-12-08,2020-12-31,8,0,코로나,214,NULL
|
||||||
|
M20310,2020-12-08,2020-12-31,8,0,코로나,215,NULL
|
||||||
|
B20314,2020-12-08,2020-12-31,8,0,코로나,216,NULL
|
||||||
|
M20322,2020-12-08,2020-12-31,8,0,코로나,217,NULL
|
||||||
|
B20329,2020-12-08,2020-12-31,8,0,코로나,218,NULL
|
||||||
|
B10201,2020-12-08,2020-12-31,8,0,코로나,219,NULL
|
||||||
|
B16305,2020-12-08,2020-12-31,8,0,코로나,221,NULL
|
||||||
|
B16312,2020-12-08,2020-12-31,8,0,코로나,222,NULL
|
||||||
|
B16307,2020-12-08,2020-12-31,8,0,코로나,213,NULL
|
||||||
|
B17309,2020-12-08,2020-12-31,8,0,코로나,212,NULL
|
||||||
|
B19310,2020-12-08,2020-12-31,8,0,코로나,211,NULL
|
||||||
|
B20315,2020-12-08,2020-12-31,8,0,코로나,200,NULL
|
||||||
|
B18311,2020-12-08,2020-12-31,8,0,코로나,201,NULL
|
||||||
|
B19303,2020-12-08,2020-12-31,8,0,코로나,202,NULL
|
||||||
|
B20308,2020-12-08,2020-12-31,8,0,코로나,203,NULL
|
||||||
|
B20309,2020-12-08,2020-12-31,8,0,코로나,204,NULL
|
||||||
|
M20317,2020-12-08,2020-12-31,8,0,코로나,205,NULL
|
||||||
|
B17315,2020-12-08,2020-12-31,8,0,코로나,206,NULL
|
||||||
|
B20317,2020-12-08,2020-12-31,8,0,코로나,207,NULL
|
||||||
|
B20332,2020-12-08,2020-12-31,8,0,코로나,208,NULL
|
||||||
|
B20320,2020-12-08,2020-12-31,8,0,코로나,209,NULL
|
||||||
|
M05508,2020-12-08,2020-12-31,10,0,코로나,228,NULL
|
||||||
|
B19313,2020-12-08,2020-12-31,10,0,코로나,227,NULL
|
||||||
|
B20322,2020-12-08,2020-12-31,10,0,코로나,226,NULL
|
||||||
|
B13301,2020-12-08,2020-12-31,10,0,코로나,225,NULL
|
||||||
|
B19314,2020-12-08,2020-12-31,10,0,코로나,224,NULL
|
||||||
|
J15306,2020-12-08,2020-12-31,8,0,코로나,220,NULL
|
||||||
|
J15306,2021-01-01,2021-02-02,9,30,탄력근무(육아),229,NULL
|
||||||
|
J18205,2021-07-14,2022-12-31,8,0,코로나,235,"2022-04-01 10:40:07"
|
||||||
|
J17205,2021-07-14,2022-12-31,8,0,코로나,234,"2022-04-01 10:40:07"
|
||||||
|
J13201,2021-07-14,2022-12-31,8,0,코로나,233,"2022-04-01 10:40:07"
|
||||||
|
J15307,2021-07-14,2022-12-31,8,0,코로나,232,"2022-04-01 10:40:07"
|
||||||
|
J21602,2021-07-14,2022-12-31,8,0,코로나,231,"2022-04-01 10:40:07"
|
||||||
|
138
detail-view-project.html
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="ko">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
<title>프로젝트 상세보기</title>
|
||||||
|
<style>
|
||||||
|
body{font-family:"Pretendard","Noto Sans KR",sans-serif;margin:0;background:#f5f1ea;color:#1c1b1a}
|
||||||
|
.wrap{max-width:1200px;margin:14px auto;padding:0 14px}
|
||||||
|
.card{background:#fff;border:1px solid #e1d7cb;border-radius:14px;padding:14px;margin-bottom:12px}
|
||||||
|
.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
|
||||||
|
select{padding:7px 9px;border:1px solid #e1d7cb;border-radius:10px}
|
||||||
|
table{width:100%;border-collapse:collapse;font-size:13px}
|
||||||
|
th,td{border-bottom:1px solid #ece4d9;padding:7px 8px;text-align:left;white-space:nowrap}
|
||||||
|
th{background:#f4ece0;color:#6e675f}
|
||||||
|
.table-wrap{max-height:60vh;overflow:auto}
|
||||||
|
.donut-wrap{display:grid;grid-template-columns:260px 1fr;gap:16px;align-items:center;background:#fff;border:1px solid #e1d7cb;border-radius:14px;padding:12px}
|
||||||
|
.donut{width:190px;height:190px;border-radius:50%;margin:0 auto;position:relative;box-shadow:0 8px 18px rgba(30,24,16,.12)}
|
||||||
|
.donut:after{content:'';position:absolute;inset:30%;background:#fff;border-radius:50%;border:1px solid #e1d7cb}
|
||||||
|
.center{position:absolute;inset:0;display:grid;place-items:center;font-weight:900;z-index:2;text-align:center;font-size:13px}
|
||||||
|
.legend{display:grid;grid-template-columns:1fr 1fr;gap:8px}
|
||||||
|
.legend-item{display:flex;gap:8px;align-items:center;font-size:12px;background:#fff;border:1px solid #e1d7cb;border-radius:10px;padding:7px 9px}
|
||||||
|
.dot{width:11px;height:11px;border-radius:999px}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="card"><div class="row" style="justify-content:space-between"><h3 id="title" style="margin:0">선택 프로젝트 상세 (년도별)</h3><label>년도 <select id="yearSel"></select></label></div></div>
|
||||||
|
<div class="card"><div id="donutWrap" class="donut-wrap"></div></div>
|
||||||
|
<div class="card"><h3 style="margin:0 0 8px">인원 투입 상세 (년/월)</h3><div class="table-wrap"><table id="tblA"></table></div></div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
const q = new URLSearchParams(location.search);
|
||||||
|
const projectCode = (q.get('projectCode')||'').trim();
|
||||||
|
const start = (q.get('start')||'').trim();
|
||||||
|
const end = (q.get('end')||'').trim();
|
||||||
|
const colors=['#2f6b5f','#e27d2f','#4f5bd5','#b33c2e','#0f766e','#0369a1','#c2410c','#7c3aed','#0891b2','#ca8a04'];
|
||||||
|
const esc=(s)=>String(s??'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
|
||||||
|
const personNameWithRank=(name, rank)=>{const n=String(name||'').trim();const r=String(rank||'').trim();if(n&&r)return `${n} ${r}`;return n||'';};
|
||||||
|
let rows=[];
|
||||||
|
let alias={};
|
||||||
|
const projectLabel=(code)=>{const c=String(code||'').trim(); if(!c) return ''; const short=alias[c]||''; return short?`${short} (${c})`:c;};
|
||||||
|
|
||||||
|
function getYears(){
|
||||||
|
const ys=[...new Set(rows.map(r=>String(r.yearMonth||'').slice(0,4)).filter(v=>/^\d{4}$/.test(v)))];
|
||||||
|
return ys.sort((a,b)=>Number(a)-Number(b));
|
||||||
|
}
|
||||||
|
function byYear(y){ return rows.filter(r=>String(r.yearMonth||'').startsWith(y+'-')); }
|
||||||
|
function agg(y){
|
||||||
|
const data=byYear(y); const m=new Map(); let t=0;
|
||||||
|
data.forEach(r=>{
|
||||||
|
const person=(r.korName||'').trim()?`${personNameWithRank(r.korName||'', r.rankName||'')} (${r.MemberNo||''})`:String(r.MemberNo||'');
|
||||||
|
const h=Number(r.hours||0); const rh=Number(r.regularHours||0); const oh=Number(r.overtimeHours||0);
|
||||||
|
const prev=m.get(person)||{hours:0,regularHours:0,overtimeHours:0};
|
||||||
|
m.set(person,{hours:prev.hours+h,regularHours:prev.regularHours+rh,overtimeHours:prev.overtimeHours+oh}); t+=h;
|
||||||
|
});
|
||||||
|
const people=[...m.entries()].map(([person,v])=>({
|
||||||
|
person,
|
||||||
|
hours:v.hours,
|
||||||
|
regularHours:v.regularHours,
|
||||||
|
overtimeHours:v.overtimeHours,
|
||||||
|
sharePct:t?v.hours/t*100:0
|
||||||
|
})).sort((a,b)=>b.hours-a.hours);
|
||||||
|
return {rows:data,total:t,people};
|
||||||
|
}
|
||||||
|
function renderTable(el,rows,heads){
|
||||||
|
if(!rows.length){el.innerHTML='<tr><td>데이터 없음</td></tr>';return;}
|
||||||
|
el.innerHTML='<thead><tr>'+heads.map(h=>'<th>'+h+'</th>').join('')+'</tr></thead><tbody>'+
|
||||||
|
rows.map(r=>'<tr>'+heads.map(h=>'<td>'+esc(r[h]??'')+'</td>').join('')+'</tr>').join('')+'</tbody>';
|
||||||
|
}
|
||||||
|
function renderMerged(el,rows){
|
||||||
|
if(!rows.length){el.innerHTML='<tr><td>데이터 없음</td></tr>';return;}
|
||||||
|
const heads=['yearMonth','korName','MemberNo','hours','regularHours','overtimeHours'];
|
||||||
|
const c=new Map(); rows.forEach(r=>c.set(r.yearMonth,(c.get(r.yearMonth)||0)+1));
|
||||||
|
const seen=new Set();
|
||||||
|
const sum = rows.reduce((acc, r) => {
|
||||||
|
acc.hours += Number(r.hours || 0);
|
||||||
|
acc.regular += Number(r.regularHours || 0);
|
||||||
|
acc.overtime += Number(r.overtimeHours || 0);
|
||||||
|
return acc;
|
||||||
|
}, {hours:0, regular:0, overtime:0});
|
||||||
|
let body = '';
|
||||||
|
let curMonth = '';
|
||||||
|
let monthSum = {hours:0, regular:0, overtime:0};
|
||||||
|
for(const r of rows){
|
||||||
|
const ym = String(r.yearMonth || '');
|
||||||
|
if(curMonth && ym !== curMonth){
|
||||||
|
body += '<tr><td colspan="3" style="font-weight:700;background:#f8f2e8">월 소계 ('+esc(curMonth)+')</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.hours.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.regular.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.overtime.toFixed(2)+'</td></tr>';
|
||||||
|
monthSum = {hours:0, regular:0, overtime:0};
|
||||||
|
}
|
||||||
|
const m=seen.has(ym)?'':'<td rowspan="'+c.get(ym)+'">'+esc(ym)+'</td>';
|
||||||
|
seen.add(ym);
|
||||||
|
body += '<tr>'+m+'<td>'+esc(personNameWithRank(r.korName, r.rankName))+'</td><td>'+esc(r.MemberNo)+'</td><td>'+esc(r.hours)+'</td><td>'+esc(r.regularHours)+'</td><td>'+esc(r.overtimeHours)+'</td></tr>';
|
||||||
|
monthSum.hours += Number(r.hours || 0);
|
||||||
|
monthSum.regular += Number(r.regularHours || 0);
|
||||||
|
monthSum.overtime += Number(r.overtimeHours || 0);
|
||||||
|
curMonth = ym;
|
||||||
|
}
|
||||||
|
if(curMonth){
|
||||||
|
body += '<tr><td colspan="3" style="font-weight:700;background:#f8f2e8">월 소계 ('+esc(curMonth)+')</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.hours.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.regular.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.overtime.toFixed(2)+'</td></tr>';
|
||||||
|
}
|
||||||
|
el.innerHTML='<thead><tr>'+heads.map(h=>'<th>'+h+'</th>').join('')+'</tr></thead><tbody>'+body+'</tbody><tfoot><tr><td colspan="3" style="font-weight:800;background:#f4ece0">합계</td><td style="font-weight:800;background:#f4ece0">'+sum.hours.toFixed(2)+'</td><td style="font-weight:800;background:#f4ece0">'+sum.regular.toFixed(2)+'</td><td style="font-weight:800;background:#f4ece0">'+sum.overtime.toFixed(2)+'</td></tr></tfoot>';
|
||||||
|
}
|
||||||
|
function draw(y){
|
||||||
|
const g=agg(y); const total=g.total||0;
|
||||||
|
const sorted=g.rows.slice().sort((a,b)=>String(a.yearMonth).localeCompare(String(b.yearMonth))||Number(b.hours)-Number(a.hours));
|
||||||
|
renderMerged(document.getElementById('tblA'), sorted.map(r=>({...r, korName:r.korName||''})));
|
||||||
|
if(!g.people.length){document.getElementById('donutWrap').innerHTML='<div>데이터 없음</div>';return;}
|
||||||
|
let acc=0; const segs=g.people.map((p,i)=>{const s=acc; acc+=p.sharePct; return colors[i%colors.length]+' '+s.toFixed(1)+'% '+acc.toFixed(1)+'%';}).join(', ');
|
||||||
|
const legend=g.people.map((p,i)=>'<div class="legend-item"><span class="dot" style="background:'+colors[i%colors.length]+'"></span><span>'+esc(p.person)+': '+p.hours.toFixed(1)+'h ('+p.sharePct.toFixed(1)+'%)</span></div>').join('');
|
||||||
|
document.getElementById('donutWrap').innerHTML='<div style="position:relative"><div class="donut" style="background:conic-gradient('+segs+')"></div><div class="center">'+esc(y)+'년<br>'+total.toFixed(1)+'h</div></div><div class="legend">'+legend+'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(){
|
||||||
|
if(!projectCode || !start || !end){ document.body.innerHTML='<div style="padding:20px">필수 파라미터가 없습니다.</div>'; return; }
|
||||||
|
alias=((await (await fetch('/api/project-aliases')).json()).aliases)||{};
|
||||||
|
document.getElementById('title').textContent='선택 프로젝트 상세 (년도별): '+projectLabel(projectCode);
|
||||||
|
const d=await (await fetch(`/api/project-monthly-detail?start=${encodeURIComponent(start)}&end=${encodeURIComponent(end)}&projectCode=${encodeURIComponent(projectCode)}`)).json();
|
||||||
|
rows=(d.rows||[]).map(x=>({
|
||||||
|
yearMonth:x.yearMonth||'',
|
||||||
|
MemberNo:x.MemberNo||'',
|
||||||
|
korName:x.korName||'',
|
||||||
|
rankName:x.rankName||'',
|
||||||
|
hours:Number(x.hours||0),
|
||||||
|
regularHours:Number(x.regularHours||0),
|
||||||
|
overtimeHours:Number(x.overtimeHours||0)
|
||||||
|
}));
|
||||||
|
const years=getYears();
|
||||||
|
const sel=document.getElementById('yearSel');
|
||||||
|
sel.innerHTML=years.map(y=>`<option value="${y}">${y}년</option>`).join('');
|
||||||
|
sel.value=years[0]||'';
|
||||||
|
sel.addEventListener('change',()=>draw(sel.value));
|
||||||
|
draw(sel.value);
|
||||||
|
}
|
||||||
|
init();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
145
detail-view.html
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="ko">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
<title>상세보기</title>
|
||||||
|
<style>
|
||||||
|
body{font-family:"Pretendard","Noto Sans KR",sans-serif;margin:0;background:#f5f1ea;color:#1c1b1a}
|
||||||
|
.wrap{max-width:1200px;margin:14px auto;padding:0 14px}
|
||||||
|
.card{background:#fff;border:1px solid #e1d7cb;border-radius:14px;padding:14px;margin-bottom:12px}
|
||||||
|
.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
|
||||||
|
select{padding:7px 9px;border:1px solid #e1d7cb;border-radius:10px}
|
||||||
|
table{width:100%;border-collapse:collapse;font-size:13px}
|
||||||
|
th,td{border-bottom:1px solid #ece4d9;padding:7px 8px;text-align:left;white-space:nowrap}
|
||||||
|
th{background:#f4ece0;color:#6e675f}
|
||||||
|
.table-wrap{max-height:60vh;overflow:auto}
|
||||||
|
.donut-wrap{display:grid;grid-template-columns:260px 1fr;gap:16px;align-items:center;background:#fff;border:1px solid #e1d7cb;border-radius:14px;padding:12px}
|
||||||
|
.donut{width:190px;height:190px;border-radius:50%;margin:0 auto;position:relative;box-shadow:0 8px 18px rgba(30,24,16,.12)}
|
||||||
|
.donut:after{content:'';position:absolute;inset:30%;background:#fff;border-radius:50%;border:1px solid #e1d7cb}
|
||||||
|
.center{position:absolute;inset:0;display:grid;place-items:center;font-weight:900;z-index:2;text-align:center;font-size:13px}
|
||||||
|
.legend{display:grid;grid-template-columns:1fr 1fr;gap:8px}
|
||||||
|
.legend-item{display:flex;gap:8px;align-items:center;font-size:12px;background:#fff;border:1px solid #e1d7cb;border-radius:10px;padding:7px 9px}
|
||||||
|
.dot{width:11px;height:11px;border-radius:999px}
|
||||||
|
.hours-summary{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:8px}
|
||||||
|
.hours-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #e1d7cb;border-radius:999px;font-size:12px;background:#fff}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="card"><div class="row" style="justify-content:space-between"><h3 id="detailTitle" style="margin:0">선택 인원 상세 (년도별)</h3><label>년도 <select id="yearSel"></select></label></div></div>
|
||||||
|
<div class="card"><div id="donutWrap" class="donut-wrap"></div></div>
|
||||||
|
<div class="card"><h3 style="margin:0 0 8px">프로젝트 투입 상세 (년/월/유형)</h3><div class="table-wrap"><table id="tblA"></table></div></div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
const q = new URLSearchParams(location.search);
|
||||||
|
const memberNo = (q.get('memberNo')||'').trim();
|
||||||
|
const start = (q.get('start')||'').trim();
|
||||||
|
const end = (q.get('end')||'').trim();
|
||||||
|
const colors=['#2f6b5f','#e27d2f','#4f5bd5','#b33c2e','#0f766e','#0369a1','#c2410c'];
|
||||||
|
const esc=(s)=>String(s??'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
|
||||||
|
let rows=[];
|
||||||
|
let alias={};
|
||||||
|
const projectLabel=(code)=>{const c=String(code||'').trim(); if(!c) return ''; const short=alias[c]||''; return short?`${short} (${c})`:c;};
|
||||||
|
|
||||||
|
function getYears(){
|
||||||
|
const ys=[...new Set(rows.map(r=>String(r.yearMonth||'').slice(0,4)).filter(v=>/^\d{4}$/.test(v)))];
|
||||||
|
return ys.sort((a,b)=>Number(a)-Number(b));
|
||||||
|
}
|
||||||
|
function byYear(y){ return rows.filter(r=>String(r.yearMonth||'').startsWith(y+'-')); }
|
||||||
|
function agg(y){
|
||||||
|
const data=byYear(y); const m=new Map(); let t=0;
|
||||||
|
let regularTotal=0, overtimeTotal=0, businessTripTotal=0;
|
||||||
|
data.forEach(r=>{
|
||||||
|
const k=r.typeCode||'기타'; const h=Number(r.hours||0);
|
||||||
|
m.set(k,(m.get(k)||0)+h); t+=h;
|
||||||
|
regularTotal += Number(r.regularHours||0);
|
||||||
|
overtimeTotal += Number(r.overtimeHours||0);
|
||||||
|
businessTripTotal += Number(r.businessTripHours||0);
|
||||||
|
});
|
||||||
|
const types=[...m.entries()].map(([typeCode,hours])=>({typeCode,hours,sharePct:t?hours/t*100:0})).sort((a,b)=>b.hours-a.hours);
|
||||||
|
return {rows:data,total:t,types,regularTotal,overtimeTotal,businessTripTotal};
|
||||||
|
}
|
||||||
|
function renderTable(el,rows,heads){
|
||||||
|
if(!rows.length){el.innerHTML='<tr><td>데이터 없음</td></tr>';return;}
|
||||||
|
el.innerHTML='<thead><tr>'+heads.map(h=>'<th>'+h+'</th>').join('')+'</tr></thead><tbody>'+
|
||||||
|
rows.map(r=>'<tr>'+heads.map(h=>'<td>'+esc(r[h]??'')+'</td>').join('')+'</tr>').join('')+'</tbody>';
|
||||||
|
}
|
||||||
|
function renderMerged(el,rows){
|
||||||
|
if(!rows.length){el.innerHTML='<tr><td>데이터 없음</td></tr>';return;}
|
||||||
|
const heads=['yearMonth','typeCode','projectCode','hours','regularHours','businessTripHours','overtimeHours'];
|
||||||
|
const c=new Map(); rows.forEach(r=>c.set(r.yearMonth,(c.get(r.yearMonth)||0)+1));
|
||||||
|
const seen=new Set();
|
||||||
|
const sum = rows.reduce((acc, r) => {
|
||||||
|
acc.hours += Number(r.hours || 0);
|
||||||
|
acc.regular += Number(r.regularHours || 0);
|
||||||
|
acc.businessTrip += Number(r.businessTripHours || 0);
|
||||||
|
acc.overtime += Number(r.overtimeHours || 0);
|
||||||
|
return acc;
|
||||||
|
}, {hours:0, regular:0, businessTrip:0, overtime:0});
|
||||||
|
let body = '';
|
||||||
|
let curMonth = '';
|
||||||
|
let monthSum = {hours:0, regular:0, businessTrip:0, overtime:0};
|
||||||
|
for(const r of rows){
|
||||||
|
const ym = String(r.yearMonth || '');
|
||||||
|
if(curMonth && ym !== curMonth){
|
||||||
|
body += '<tr><td colspan="3" style="font-weight:700;background:#f8f2e8">월 소계 ('+esc(curMonth)+')</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.hours.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.regular.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.businessTrip.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.overtime.toFixed(2)+'</td></tr>';
|
||||||
|
monthSum = {hours:0, regular:0, businessTrip:0, overtime:0};
|
||||||
|
}
|
||||||
|
const m=seen.has(ym)?'':'<td rowspan="'+c.get(ym)+'">'+esc(ym)+'</td>';
|
||||||
|
seen.add(ym);
|
||||||
|
body += '<tr>'+m+'<td>'+esc(r.typeCode)+'</td><td>'+esc(r.projectCode)+'</td><td>'+esc(r.hours)+'</td><td>'+esc(r.regularHours)+'</td><td>'+esc(r.businessTripHours)+'</td><td>'+esc(r.overtimeHours)+'</td></tr>';
|
||||||
|
monthSum.hours += Number(r.hours || 0);
|
||||||
|
monthSum.regular += Number(r.regularHours || 0);
|
||||||
|
monthSum.businessTrip += Number(r.businessTripHours || 0);
|
||||||
|
monthSum.overtime += Number(r.overtimeHours || 0);
|
||||||
|
curMonth = ym;
|
||||||
|
}
|
||||||
|
if(curMonth){
|
||||||
|
body += '<tr><td colspan="3" style="font-weight:700;background:#f8f2e8">월 소계 ('+esc(curMonth)+')</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.hours.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.regular.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.businessTrip.toFixed(2)+'</td><td style="font-weight:700;background:#f8f2e8">'+monthSum.overtime.toFixed(2)+'</td></tr>';
|
||||||
|
}
|
||||||
|
el.innerHTML='<thead><tr>'+heads.map(h=>'<th>'+h+'</th>').join('')+'</tr></thead><tbody>'+body+'</tbody><tfoot><tr><td colspan=\"3\" style=\"font-weight:800;background:#f4ece0\">합계</td><td style=\"font-weight:800;background:#f4ece0\">'+sum.hours.toFixed(2)+'</td><td style=\"font-weight:800;background:#f4ece0\">'+sum.regular.toFixed(2)+'</td><td style=\"font-weight:800;background:#f4ece0\">'+sum.businessTrip.toFixed(2)+'</td><td style=\"font-weight:800;background:#f4ece0\">'+sum.overtime.toFixed(2)+'</td></tr></tfoot>';
|
||||||
|
}
|
||||||
|
function draw(y){
|
||||||
|
const g=agg(y); const total=g.total||0;
|
||||||
|
const sorted=g.rows.slice().sort((a,b)=>String(a.yearMonth).localeCompare(String(b.yearMonth))||Number(b.hours)-Number(a.hours));
|
||||||
|
renderMerged(document.getElementById('tblA'), sorted.map(r=>({...r, projectCode: projectLabel(r.projectCode)})));
|
||||||
|
if(!g.types.length){document.getElementById('donutWrap').innerHTML='<div>데이터 없음</div>';return;}
|
||||||
|
let acc=0; const segs=g.types.map((t,i)=>{const s=acc; acc+=t.sharePct; return colors[i%colors.length]+' '+s.toFixed(1)+'% '+acc.toFixed(1)+'%';}).join(', ');
|
||||||
|
const legend=g.types.map((t,i)=>'<div class="legend-item"><span class="dot" style="background:'+colors[i%colors.length]+'"></span><span>'+esc(t.typeCode)+': '+t.hours.toFixed(1)+'h ('+t.sharePct.toFixed(1)+'%)</span></div>').join('');
|
||||||
|
const hoursSummary =
|
||||||
|
'<div class="hours-summary">' +
|
||||||
|
'<div class="hours-chip">근무: <b>'+g.regularTotal.toFixed(1)+'h</b></div>' +
|
||||||
|
'<div class="hours-chip">출장: <b>'+g.businessTripTotal.toFixed(1)+'h</b></div>' +
|
||||||
|
'<div class="hours-chip">추가: <b>'+g.overtimeTotal.toFixed(1)+'h</b></div>' +
|
||||||
|
'</div>';
|
||||||
|
document.getElementById('donutWrap').innerHTML='<div style="position:relative"><div class="donut" style="background:conic-gradient('+segs+')"></div><div class="center">'+esc(y)+'년<br>'+total.toFixed(1)+'h</div></div><div>'+hoursSummary+'<div class="legend">'+legend+'</div></div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(){
|
||||||
|
if(!memberNo || !start || !end){ document.body.innerHTML='<div style="padding:20px">필수 파라미터가 없습니다.</div>'; return; }
|
||||||
|
alias=((await (await fetch('/api/project-aliases')).json()).aliases)||{};
|
||||||
|
const d=await (await fetch(`/api/member-dashboard?start=${encodeURIComponent(start)}&end=${encodeURIComponent(end)}&memberNo=${encodeURIComponent(memberNo)}`)).json();
|
||||||
|
const displayName = (d.korName||'').trim() ? `${d.korName} (${memberNo})` : memberNo;
|
||||||
|
document.getElementById('detailTitle').textContent = `선택 인원 상세 (년도별) - ${displayName}`;
|
||||||
|
document.title = `상세보기 - ${displayName}`;
|
||||||
|
rows=(d.projectYearly||[]).map(x=>({
|
||||||
|
yearMonth:x.yearMonth||'',
|
||||||
|
typeCode:x.typeCode||'',
|
||||||
|
projectCode:x.projectCode||'',
|
||||||
|
hours:Number(x.hours||0),
|
||||||
|
regularHours:Number(x.regularHours||0),
|
||||||
|
businessTripHours:Number(x.businessTripHours||0),
|
||||||
|
overtimeHours:Number(x.overtimeHours||0)
|
||||||
|
}));
|
||||||
|
const years=getYears();
|
||||||
|
const sel=document.getElementById('yearSel');
|
||||||
|
sel.innerHTML=years.map(y=>`<option value="${y}">${y}년</option>`).join('');
|
||||||
|
sel.value=years[0]||'';
|
||||||
|
sel.addEventListener('change',()=>draw(sel.value));
|
||||||
|
draw(sel.value);
|
||||||
|
}
|
||||||
|
init();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
24
docker-compose.yml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
version: "3.9"
|
||||||
|
|
||||||
|
services:
|
||||||
|
manhour-dashboard:
|
||||||
|
build: .
|
||||||
|
container_name: manhour-dashboard
|
||||||
|
ports:
|
||||||
|
- "8090:8090"
|
||||||
|
environment:
|
||||||
|
PORT: "8090"
|
||||||
|
MYSQL_HOST: "${MYSQL_HOST:-172.16.42.111}"
|
||||||
|
MYSQL_PORT: "${MYSQL_PORT:-3306}"
|
||||||
|
MYSQL_USER: "${MYSQL_USER:-root}"
|
||||||
|
MYSQL_PASSWORD: "${MYSQL_PASSWORD:-hanmacerp!}"
|
||||||
|
MYSQL_DB: "${MYSQL_DB:-jangheon_manhour}"
|
||||||
|
ERP_BASE_URL: "${ERP_BASE_URL:-http://erp.jangheon.co.kr/projt_mng}"
|
||||||
|
ERP_LOGIN_ID: "${ERP_LOGIN_ID:-g25001}"
|
||||||
|
ERP_LOGIN_PW: "${ERP_LOGIN_PW:-00000}"
|
||||||
|
INTRANET_BASE_URL: "${INTRANET_BASE_URL:-http://erp.jangheon.co.kr/intranet/}"
|
||||||
|
INTRANET_LOGIN_ID: "${INTRANET_LOGIN_ID:-G25001}"
|
||||||
|
INTRANET_LOGIN_PW: "${INTRANET_LOGIN_PW:-00000}"
|
||||||
|
volumes:
|
||||||
|
- ./data:/app/data
|
||||||
|
restart: unless-stopped
|
||||||
BIN
exports/abnormal_work_cases_report.docx
Normal file
237
exports/abnormal_work_cases_report.md
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
# 인트라넷 / 사업관리 이상케이스 보고서
|
||||||
|
|
||||||
|
- 작성일: 2026-06-04 17:47:53
|
||||||
|
- 기준 데이터: 현재 로컬 `matching.db`에 수집된 인트라넷 SQL, 사업관리 작업일보, userstate
|
||||||
|
- 판단 단위: 같은 사람 + 같은 날짜
|
||||||
|
- 시간 비교 기준: 인트라넷 `정규시간` vs 사업관리 `공수 * 8시간`
|
||||||
|
- 업무 판단 기준: 같은 날짜에 인트라넷과 사업관리 기록이 함께 있으면 `사업관리 기록 우선`
|
||||||
|
|
||||||
|
## 정상 / 이상 기준
|
||||||
|
|
||||||
|
정상으로 보는 경우는 아래 2가지입니다.
|
||||||
|
|
||||||
|
1. 사업관리만 있고 사업관리 기록이 1개인 경우
|
||||||
|
2. 인트라넷과 사업관리가 모두 있고, 사업관리 기록이 1개이며, 프로젝트와 시간이 모두 같은 경우
|
||||||
|
|
||||||
|
추가로 `연차인데 근무기록이 있는 경우`는 이상케이스로 봅니다.
|
||||||
|
|
||||||
|
## 이상케이스 요약
|
||||||
|
|
||||||
|
| 구분 | 케이스 | 건수 | 인원수 |
|
||||||
|
|---|---:|---:|---:|
|
||||||
|
| A | 사업관리만 있는데 사업관리 기록이 2개 이상인 경우 | 18 | 3 |
|
||||||
|
| B | 인트라넷과 사업관리 시간이 같지만 프로젝트가 다른 경우 | 88 | 8 |
|
||||||
|
| C | 인트라넷과 사업관리 프로젝트는 같지만 시간이 다른 경우 | 124 | 3 |
|
||||||
|
| D | 인트라넷과 사업관리 프로젝트도 다르고 시간도 다른 경우 | 32 | 5 |
|
||||||
|
| E | 인트라넷도 있고 사업관리 기록이 2개 이상인 경우 | 5 | 1 |
|
||||||
|
| F | 연차인데 근무기록이 있는 경우 | 66 | 25 |
|
||||||
|
| 합계 | | 333 | 30 |
|
||||||
|
|
||||||
|
## A. 사업관리만 있는데 사업관리 기록이 2개 이상인 경우
|
||||||
|
|
||||||
|
인트라넷에는 해당 날짜 기록이 없지만, 사업관리에는 같은 사람/같은 날짜에 현장 기록이 2개 이상 존재합니다.
|
||||||
|
|
||||||
|
- 건수: 18건
|
||||||
|
- 인원수: 3명
|
||||||
|
|
||||||
|
### 사람별 건수
|
||||||
|
|
||||||
|
| 사람 | 팀 | 직급 | 건수 |
|
||||||
|
|---|---|---|---:|
|
||||||
|
| 이호범 (J23301) | 건설본부 | 사원 | 9 |
|
||||||
|
| 김인열 (M05510) | 건설본부 | 전무이사 | 5 |
|
||||||
|
| 김성환 (J25301) | 건설본부 | 부장 | 4 |
|
||||||
|
|
||||||
|
### 상세 예시
|
||||||
|
|
||||||
|
| 날짜 | 사람 | 인트라넷 | 사업관리 | 확인 포인트 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 2026-01-31 | 김성환 (J25301) | 없음 | 25-시공-07 (신평교), 24-시공-03 (은화삼지구(지하화구간)) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 인장/가설 현장관리 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2026-01-30 | 김성환 (J25301) | 없음 | 24-시공-03 (은화삼지구(지하화구간)), 22-시공-24 (전동교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 인장/가설 관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2026-01-29 | 김성환 (J25301) | 없음 | 24-시공-03 (은화삼지구(지하화구간)), 22-시공-24 (전동교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 인장/가설 관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2026-01-28 | 김성환 (J25301) | 없음 | 24-시공-03 (은화삼지구(지하화구간)), 22-시공-24 (전동교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 인장/가설 관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2025-12-13 | 이호범 (J23301) | 없음 | 25-시공-01 (신촌교), 22-시공-24 (전동교) / 1.5공수 = 12h / 사업관리 행 2개 / 작업내용: 철근조립,관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2025-12-12 | 이호범 (J23301) | 없음 | 25-시공-01 (신촌교), 22-시공-24 (전동교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 철근조립,관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2025-12-11 | 이호범 (J23301) | 없음 | 25-시공-01 (신촌교), 22-시공-24 (전동교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 철근조립,관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2025-12-10 | 이호범 (J23301) | 없음 | 25-시공-01 (신촌교), 22-시공-24 (전동교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 철근조립,관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2025-12-09 | 이호범 (J23301) | 없음 | 25-시공-01 (신촌교), 22-시공-24 (전동교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 철근조립,관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2025-12-08 | 이호범 (J23301) | 없음 | 25-시공-01 (신촌교), 22-시공-24 (전동교) / 1.5공수 = 12h / 사업관리 행 2개 / 작업내용: 철근조립,관리자 | 인트라넷 기록 없음, 사업관리 현장 기록 2개 이상 |
|
||||||
|
|
||||||
|
## B. 인트라넷과 사업관리 시간이 같지만 프로젝트가 다른 경우
|
||||||
|
|
||||||
|
양쪽 모두 같은 시간으로 잡혔지만 프로젝트 코드가 다릅니다. 최종 판단은 사업관리 프로젝트를 우선합니다.
|
||||||
|
|
||||||
|
- 건수: 88건
|
||||||
|
- 인원수: 8명
|
||||||
|
|
||||||
|
### 사람별 건수
|
||||||
|
|
||||||
|
| 사람 | 팀 | 직급 | 건수 |
|
||||||
|
|---|---|---|---:|
|
||||||
|
| 최영준 (J24201) | 기술영업본부 | 전무이사 | 55 |
|
||||||
|
| 김인열 (M05510) | 건설본부 | 전무이사 | 14 |
|
||||||
|
| 최태순 (J10301) | 건설본부 | 상무이사 | 9 |
|
||||||
|
| 김인수 (J18203) | 건설본부 | 상무이사 | 3 |
|
||||||
|
| 차성대 (J10308) | 건설본부 | 상무이사 | 2 |
|
||||||
|
| 윤선일 (J22201) | 건설본부 | 차장 | 2 |
|
||||||
|
| 윤두현 (J22204) | 건설본부 | 부장 | 2 |
|
||||||
|
| 주상구 (J23101) | 건설본부 | 상무이사 | 1 |
|
||||||
|
|
||||||
|
### 상세 예시
|
||||||
|
|
||||||
|
| 날짜 | 사람 | 인트라넷 | 사업관리 | 확인 포인트 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 2026-01-14 | 김인수 (J18203) | 24-시공-16 (시화MTV) / 정규 8h / OT 0h | 22-시공-24 (전동교) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 인장/가설 관리자 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2026-01-13 | 김인수 (J18203) | 24-시공-16 (시화MTV) / 정규 8h / OT 0h | 22-시공-24 (전동교) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 인장/가설 관리자 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2026-01-12 | 김인수 (J18203) | 24-시공-16 (시화MTV) / 정규 8h / OT 0h | 22-시공-24 (전동교) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 인장/가설 관리자 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2025-10-01 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2025-09-30 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2025-09-29 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 3h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2025-09-26 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2025-09-25 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2025-09-23 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 3h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
| 2025-09-19 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 시간은 같지만 프로젝트가 다름 |
|
||||||
|
|
||||||
|
## C. 인트라넷과 사업관리 프로젝트는 같지만 시간이 다른 경우
|
||||||
|
|
||||||
|
프로젝트는 동일하지만 인트라넷 정규시간과 사업관리 공수 환산 시간이 다릅니다.
|
||||||
|
|
||||||
|
- 건수: 124건
|
||||||
|
- 인원수: 3명
|
||||||
|
|
||||||
|
### 사람별 건수
|
||||||
|
|
||||||
|
| 사람 | 팀 | 직급 | 건수 |
|
||||||
|
|---|---|---|---:|
|
||||||
|
| 김인열 (M05510) | 건설본부 | 전무이사 | 122 |
|
||||||
|
| 이인갑 (J25510) | 건설본부 | 이사 | 1 |
|
||||||
|
| 이호범 (J23301) | 건설본부 | 사원 | 1 |
|
||||||
|
|
||||||
|
### 상세 예시
|
||||||
|
|
||||||
|
| 날짜 | 사람 | 인트라넷 | 사업관리 | 확인 포인트 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 2026-01-06 | 이인갑 (J25510) | 25-시공-07 (신평교) / 정규 3h / OT 0h | 25-시공-07 (신평교) / 1공수 = 8h / 사업관리 행 1개 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-12-31 | 김인열 (M05510) | 21-시공-33 (지산교) / 정규 5h / OT 0h | 21-시공-33 (지산교) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 인장/가설 관리자 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-09-09 | 김인열 (M05510) | 22-시공-41 (영산강교(물품)) / 정규 7h / OT 0h | 22-시공-41 (영산강교(물품)) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 관리자 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-08-08 | 김인열 (M05510) | 24-시공-17 (오산교) / 정규 7h / OT 0h | 24-시공-17 (오산교) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 인장/가설 관리자 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-06-19 | 김인열 (M05510) | 23-시공-33 (중리교) / 정규 7h / OT 0h | 23-시공-33 (중리교) / 1공수 = 8h / 사업관리 행 1개 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-06-12 | 김인열 (M05510) | 23-시공-33 (중리교) / 정규 2h / OT 0h | 23-시공-33 (중리교) / 1공수 = 8h / 사업관리 행 1개 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-05-22 | 김인열 (M05510) | 22-시공-41 (영산강교(물품)) / 정규 3h / OT 0h | 22-시공-41 (영산강교(물품)) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 관리자 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-05-15 | 김인열 (M05510) | 22-시공-41 (영산강교(물품)) / 정규 5h / OT 0h | 22-시공-41 (영산강교(물품)) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 관리자 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-05-07 | 김인열 (M05510) | 22-시공-41 (영산강교(물품)) / 정규 1h / OT 0h | 22-시공-41 (영산강교(물품)) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 관리자 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
| 2025-04-25 | 김인열 (M05510) | 22-시공-41 (영산강교(물품)) / 정규 3h / OT 0h | 22-시공-41 (영산강교(물품)) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 관리자 | 프로젝트는 같지만 시간이 다름 |
|
||||||
|
|
||||||
|
## D. 인트라넷과 사업관리 프로젝트도 다르고 시간도 다른 경우
|
||||||
|
|
||||||
|
프로젝트와 시간 모두 일치하지 않습니다.
|
||||||
|
|
||||||
|
- 건수: 32건
|
||||||
|
- 인원수: 5명
|
||||||
|
|
||||||
|
### 사람별 건수
|
||||||
|
|
||||||
|
| 사람 | 팀 | 직급 | 건수 |
|
||||||
|
|---|---|---|---:|
|
||||||
|
| 최영준 (J24201) | 기술영업본부 | 전무이사 | 19 |
|
||||||
|
| 김인열 (M05510) | 건설본부 | 전무이사 | 10 |
|
||||||
|
| 이의환 (J13308) | 건설본부 | 부장 | 1 |
|
||||||
|
| 윤선일 (J22201) | 건설본부 | 차장 | 1 |
|
||||||
|
| 최태순 (J10301) | 건설본부 | 상무이사 | 1 |
|
||||||
|
|
||||||
|
### 상세 예시
|
||||||
|
|
||||||
|
| 날짜 | 사람 | 인트라넷 | 사업관리 | 확인 포인트 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 2025-12-24 | 김인열 (M05510) | 22-시공-41 (영산강교(물품)) / 정규 5h / OT 0h | 21-시공-33 (지산교) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 인장/가설 인장관리자 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-10-02 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 7h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,반출 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-09-24 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 0h | 24-시공-30 (공릉천교 외) / 0.5공수 = 4h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-09-22 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 6h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-09-16 | 최영준 (J24201) | 25-영업-01 / 정규 5h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-09-15 | 김인열 (M05510) | 22-시공-41 (영산강교(물품)) / 정규 7h / OT 0h | 21-시공-23 (청룡2교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 인장/가설 관리자 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-09-11 | 최영준 (J24201) | 25-영업-01 / 정규 8h / OT 0h | 24-시공-30 (공릉천교 외) / 1.5공수 = 12h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-09-05 | 최영준 (J24201) | 25-교영-01 (신규과업) / 정규 8h / OT 0h | 24-시공-30 (공릉천교 외) / 1.5공수 = 12h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-09-02 | 최영준 (J24201) | 24-교영-01 (2024년 신규과업) / 정규 6h / OT 0h | 24-시공-30 (공릉천교 외) / 1공수 = 8h / 사업관리 행 1개 / 작업내용: 거푸집해체,설치 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
| 2025-08-29 | 최영준 (J24201) | 24-교영-01 (2024년 신규과업) / 정규 8h / OT 2.5h | 24-시공-30 (공릉천교 외) / 0.5공수 = 4h / 사업관리 행 1개 / 작업내용: 거푸집해체 | 프로젝트와 시간이 모두 다름 |
|
||||||
|
|
||||||
|
## E. 인트라넷도 있고 사업관리 기록이 2개 이상인 경우
|
||||||
|
|
||||||
|
인트라넷에도 같은 날짜 기록이 있고, 사업관리에는 같은 날짜에 2개 이상 현장 기록이 있습니다.
|
||||||
|
|
||||||
|
- 건수: 5건
|
||||||
|
- 인원수: 1명
|
||||||
|
|
||||||
|
### 사람별 건수
|
||||||
|
|
||||||
|
| 사람 | 팀 | 직급 | 건수 |
|
||||||
|
|---|---|---|---:|
|
||||||
|
| 김인열 (M05510) | 건설본부 | 전무이사 | 5 |
|
||||||
|
|
||||||
|
### 상세 예시
|
||||||
|
|
||||||
|
| 날짜 | 사람 | 인트라넷 | 사업관리 | 확인 포인트 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 2021-11-23 | 김인열 (M05510) | 21-시공-16 (양천2교) / 정규 8h / OT 3h | 21-시공-16 (양천2교), 21-시공-13 (안막교,안막IC교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 현장관리 | 인트라넷도 있고 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2021-11-18 | 김인열 (M05510) | 21-시공-16 (양천2교) / 정규 8h / OT 3h | 21-시공-16 (양천2교), 21-시공-13 (안막교,안막IC교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 현장관리 | 인트라넷도 있고 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2021-11-17 | 김인열 (M05510) | 21-시공-16 (양천2교) / 정규 8h / OT 3h | 21-시공-16 (양천2교), 21-시공-13 (안막교,안막IC교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 현장관리 | 인트라넷도 있고 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2020-04-02 | 김인열 (M05510) | 20-시공-01 (검단천교) / 정규 5h / OT 0h | 20-시공-01 (검단천교), 18-시공-03 (왕림교,정남1육교) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 제작현장관리,제작 현장관리 | 인트라넷도 있고 사업관리 현장 기록 2개 이상 |
|
||||||
|
| 2020-03-16 | 김인열 (M05510) | 18-시공-03 (왕림교,정남1육교) / 정규 8h / OT 0h | 18-시공-03 (왕림교,정남1육교), 17-시공-21 (북수원1교 외) / 2공수 = 16h / 사업관리 행 2개 / 작업내용: 인장/가설 인장관리,인장/가설 용접관리 | 인트라넷도 있고 사업관리 현장 기록 2개 이상 |
|
||||||
|
|
||||||
|
## F. 연차인데 근무기록이 있는 경우
|
||||||
|
|
||||||
|
userstate에는 연차로 등록되어 있지만 같은 날짜에 인트라넷 또는 사업관리 근무기록이 존재합니다.
|
||||||
|
|
||||||
|
- 건수: 66건
|
||||||
|
- 인원수: 25명
|
||||||
|
|
||||||
|
### 사람별 건수
|
||||||
|
|
||||||
|
| 사람 | 팀 | 직급 | 건수 |
|
||||||
|
|---|---|---|---:|
|
||||||
|
| 이호범 (J23301) | 건설본부 | 사원 | 9 |
|
||||||
|
| 이세민 (P13302) | 생산본부 | 부장 | 8 |
|
||||||
|
| 김인수 (J18203) | 건설본부 | 상무이사 | 8 |
|
||||||
|
| 김인열 (M05510) | 건설본부 | 전무이사 | 7 |
|
||||||
|
| 최영준 (J24201) | 기술영업본부 | 전무이사 | 6 |
|
||||||
|
| 최성용 (J23303) | 건설본부 | 대리 | 4 |
|
||||||
|
| 남궁전 (J14101) | 기술영업본부 | 전무이사 | 2 |
|
||||||
|
| 김승국 (M02302) | 생산본부 | 상무이사 | 2 |
|
||||||
|
| 김범석 (J22202) | 건설본부 | 부장 | 2 |
|
||||||
|
| 이중경 (J16202) | 기술영업본부 | 이사 | 2 |
|
||||||
|
| 김진 (J10314) | 기술영업본부 | 이사 | 2 |
|
||||||
|
| 최동찬 (J22301) | 생산본부 | 대리 | 1 |
|
||||||
|
| 허남덕 (J10315) | 건설본부 | 전무이사 | 1 |
|
||||||
|
| 윤두현 (J22204) | 건설본부 | 부장 | 1 |
|
||||||
|
| 이가연 (J24302) | 기술영업본부 | 사원 | 1 |
|
||||||
|
| 김재호 (J08201) | 기술영업본부 | 상무이사 | 1 |
|
||||||
|
| 김상철 (J22302) | 건설본부 | 이사 | 1 |
|
||||||
|
| 김량균 (J17207) | 기술영업본부 | 부사장 | 1 |
|
||||||
|
| 김인범 (J23308) | 생산본부 | 사원 | 1 |
|
||||||
|
| 최만규 (J22305) | 생산본부 | 과장 | 1 |
|
||||||
|
| 차성대 (J10308) | 건설본부 | 상무이사 | 1 |
|
||||||
|
| 임재상 (J25201) | 건설본부 | 대리 | 1 |
|
||||||
|
| 윤선일 (J22201) | 건설본부 | 차장 | 1 |
|
||||||
|
| 김갑성 (J24307) | 건설본부 | 전무이사 | 1 |
|
||||||
|
| 정우성 (J23307) | 기술영업본부 | 상무이사 | 1 |
|
||||||
|
|
||||||
|
### 상세 예시
|
||||||
|
|
||||||
|
| 날짜 | 사람 | 인트라넷 | 사업관리 | 확인 포인트 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 2024-01-12 | 김인열 (M05510) | 없음 | 22-시공-39 (용두교) / 0.5공수 = 4h | 연차 등록: 연차(개인사유 ) |
|
||||||
|
| 2024-01-30 | 최동찬 (J22301) | 24-제조-02 (생산) / 정규 8h / OT 3h | 없음 | 연차 등록: 연차(개인사유로 연차를 신청합니다.) |
|
||||||
|
| 2020-01-03 | 남궁전 (J14101) | 16-시공-20 (산외교) / 정규 8h / OT 0h | 없음 | 연차 등록: 연차(개인사유) |
|
||||||
|
| 2020-02-10 | 허남덕 (J10315) | 17-설계-05 (충청내륙(2-1) 구안천교) / 정규 8h / OT 0h | 없음 | 연차 등록: 연차(개인사유(감기몸살)) |
|
||||||
|
| 2020-03-20 | 남궁전 (J14101) | 19-시공-22 (산외교-슬라브) / 정규 8h / OT 0h | 없음 | 연차 등록: 병원진료(안과 검진) |
|
||||||
|
| 2021-02-04 | 김인열 (M05510) | 없음 | 20-시공-39 (가곡교, 평능2교) / 1공수 = 8h | 연차 등록: 연차(병원 허리 검사 진료) |
|
||||||
|
| 2021-04-05 | 김승국 (M02302) | 20-기술-01 (스마트건설(10과제)) / 정규 3h / OT 0h | 없음 | 연차 등록: 연차(개인사유(코로나 검사 결과 대기)) |
|
||||||
|
| 2022-02-03 | 김인열 (M05510) | 21-시공-14 (상관교 외) / 정규 8h / OT 3h | 없음 | 연차 등록: 연차(병원진료) |
|
||||||
|
| 2022-07-29 | 김범석 (J22202) | 없음 | 20-시공-36 (도하4교) / 1공수 = 8h | 연차 등록: 연차(연차휴가사용계획서) |
|
||||||
|
| 2022-08-12 | 김범석 (J22202) | 없음 | 20-시공-36 (도하4교) / 1공수 = 8h | 연차 등록: 연차(연차휴가사용계획서) |
|
||||||
|
|
||||||
|
## 해석 메모
|
||||||
|
|
||||||
|
- 사업관리 기록이 2개 이상인 경우는 하루에 여러 현장/프로젝트가 잡힌 것으로 보입니다.
|
||||||
|
- 인트라넷과 사업관리 프로젝트가 다른 경우는 최종 프로젝트 판단 시 사업관리 프로젝트를 우선하는 것이 현재 합의된 기준입니다.
|
||||||
|
- 연차인데 근무기록이 있는 경우는 userstate와 근무기록 간 충돌이므로 별도 확인이 필요합니다.
|
||||||
|
- 단, 이 보고서는 현재 수집된 데이터 기준입니다. 사업관리 추가 수집 후 건수는 바뀔 수 있습니다.
|
||||||
BIN
exports/abnormal_work_cases_report_portrait.docx
Normal file
BIN
exports/abnormal_work_cases_report_print.docx
Normal file
62
exports/create_erd_clean_image.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
from pathlib import Path
|
||||||
|
OUT=Path('/home/hyein/jh-mh/장헌산업/exports')
|
||||||
|
PNG=OUT/'work_data_erd_clean.png'
|
||||||
|
W,H=1700,1150
|
||||||
|
img=Image.new('RGB',(W,H),'#151718'); d=ImageDraw.Draw(img)
|
||||||
|
font=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf',17)
|
||||||
|
font_b=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf',20)
|
||||||
|
font_t=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf',30)
|
||||||
|
font_s=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf',14)
|
||||||
|
BG='#151718'; CARD='#1f2426'; HEADER='#252b2e'; BORDER='#59636a'; TEXT='#edf2f4'; MUTED='#a9b2b8'; PK='#f5d76e'; FK='#87c8ff'
|
||||||
|
BLUE='#60d7f2'; GREEN='#80e27e'; PURPLE='#b99bff'; GRAY='#9ca7ad'
|
||||||
|
entities={
|
||||||
|
'member':(70,150,300,['PK MemberNo','korName','teamName','rankName','groupCode','rankCode','isRetired']),
|
||||||
|
'dallyproject':(70,490,330,['PK id','FK MemberNo','WorkDate','EntryPCode','EntryTime / LeaveTime','OverTime','TotalHours','RegularHours','OvertimeHours']),
|
||||||
|
'project_alias':(70,875,330,['PK projectCode','shortName','bridge/project name']),
|
||||||
|
'site_worksheet_worker_cache':(590,120,390,['PK projectCode + workDate','PK korName + jobType','workText','note','personCount','syncedAt']),
|
||||||
|
'site_worksheet_record':(590,455,390,['PK projectCode + workDate','PK memberNo + korName','FK memberNo','jobType','workText','note','personCount']),
|
||||||
|
'site_worksheet_day_sync':(590,760,390,['PK projectCode + workDate','syncedAt']),
|
||||||
|
'site_worksheet_menu_sync':(590,940,390,['PK projectCode + workDate','PK selMenu','2 = normal worksheet','3 = tension/temp works','syncedAt']),
|
||||||
|
'work_calendar_detail':(1190,255,370,['PK id','source: sql / site','FK memberNo','workDate','projectCode','projectName','workText','jobType','hours','regularHours','overtimeHours','personCount']),
|
||||||
|
'work_calendar_day':(1190,745,370,['PK memberNo + workDate','korName / teamName / rankName','sqlHours','sqlProjectCodes','siteCount','siteProjectCodes','siteWorkTexts','hasSql / hasSite'])}
|
||||||
|
heights={k:52+len(v[3])*25+18 for k,v in entities.items()}
|
||||||
|
def card(n):
|
||||||
|
x,y,w,fs=entities[n]; h=heights[n]
|
||||||
|
d.rounded_rectangle((x,y,x+w,y+h),radius=8,fill=CARD,outline=BORDER,width=2)
|
||||||
|
d.rectangle((x,y,x+w,y+42),fill=HEADER); d.line((x,y+42,x+w,y+42),fill=BORDER,width=1)
|
||||||
|
d.text((x+16,y+11),n,font=font_b,fill=TEXT); yy=y+58
|
||||||
|
for f in fs:
|
||||||
|
c=PK if f.startswith('PK') else FK if f.startswith('FK') else TEXT
|
||||||
|
d.text((x+18,yy),f,font=font_s,fill=c); yy+=25
|
||||||
|
def a(n,s,off=0):
|
||||||
|
x,y,w,_=entities[n]; h=heights[n]
|
||||||
|
return {'r':(x+w,y+h//2+off),'l':(x,y+h//2+off),'t':(x+w//2+off,y),'b':(x+w//2+off,y+h)}[s]
|
||||||
|
def arrow(points,label,color):
|
||||||
|
d.line(points,fill=color,width=4,joint='curve')
|
||||||
|
x,y=points[-1]; d.polygon([(x,y),(x-10,y-6),(x-10,y+6)],fill=color)
|
||||||
|
mx,my=points[len(points)//2]
|
||||||
|
tw=d.textlength(label,font=font_s)
|
||||||
|
d.rounded_rectangle((mx-tw/2-8,my-14,mx+tw/2+8,my+14),radius=5,fill=BG,outline='#4b5358')
|
||||||
|
d.text((mx-tw/2,my-9),label,font=font_s,fill=MUTED)
|
||||||
|
# columns
|
||||||
|
for x1,x2,title in [(40,430,'SOURCE'),(540,1030,'ERP CACHE / MATCH'),(1140,1620,'CALENDAR')]:
|
||||||
|
d.rounded_rectangle((x1,105,x2,1080),radius=12,fill='#181b1c',outline='#2c3235')
|
||||||
|
d.text((x1+22,126),title,font=font_b,fill='#7f8a90')
|
||||||
|
d.text((60,38),'Work Data ERD',font=font_t,fill=TEXT)
|
||||||
|
d.text((60,75),'Clean column layout with primary data-flow lines',font=font_s,fill=MUTED)
|
||||||
|
# main flow only
|
||||||
|
arrow([a('member','r',0),(500,a('member','r')[1]),(500,a('site_worksheet_record','l')[1]),a('site_worksheet_record','l')],'employee match',BLUE)
|
||||||
|
arrow([a('dallyproject','r',0),(1100,a('dallyproject','r')[1]),(1100,a('work_calendar_detail','l',-55)[1]),a('work_calendar_detail','l',-55)],'SQL work -> detail',BLUE)
|
||||||
|
arrow([a('project_alias','r',0),(520,a('project_alias','r')[1]),(520,a('site_worksheet_worker_cache','l',-20)[1]),a('site_worksheet_worker_cache','l',-20)],'project code/name',GREEN)
|
||||||
|
arrow([a('site_worksheet_worker_cache','b'),(785,420),a('site_worksheet_record','t')],'raw rows -> matched rows',PURPLE)
|
||||||
|
arrow([a('site_worksheet_day_sync','t'),(980,700),(980,300),a('site_worksheet_worker_cache','r',35)],'date fetched',GRAY)
|
||||||
|
arrow([a('site_worksheet_menu_sync','t'),(1030,880),(1030,320),a('site_worksheet_worker_cache','r',75)],'menu 2/3 fetched',GRAY)
|
||||||
|
arrow([a('site_worksheet_record','r'),(1100,a('site_worksheet_record','r')[1]),(1100,a('work_calendar_detail','l',45)[1]),a('work_calendar_detail','l',45)],'site work -> detail',PURPLE)
|
||||||
|
arrow([a('project_alias','r',40),(1135,a('project_alias','r')[1]+40),(1135,a('work_calendar_detail','l',95)[1]),a('work_calendar_detail','l',95)],'projectName',GREEN)
|
||||||
|
arrow([a('work_calendar_detail','b'),(1375,710),a('work_calendar_day','t')],'daily summary',GRAY)
|
||||||
|
for n in entities: card(n)
|
||||||
|
# legend
|
||||||
|
d.rounded_rectangle((60,1090,1600,1138),radius=8,fill='#1d2123',outline='#3a4247')
|
||||||
|
d.text((80,1103),'Blue employee/SQL Green project name Purple ERP worksheet match Gray sync/calendar flow',font=font_s,fill=MUTED)
|
||||||
|
img.save(PNG); print(PNG)
|
||||||
130
exports/create_erd_columns_image.py
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
OUT = Path('/home/hyein/jh-mh/장헌산업/exports')
|
||||||
|
PNG = OUT / 'work_data_erd_columns.png'
|
||||||
|
W, H = 1800, 1250
|
||||||
|
img = Image.new('RGB', (W, H), '#151718')
|
||||||
|
d = ImageDraw.Draw(img)
|
||||||
|
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 17)
|
||||||
|
font_b = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 19)
|
||||||
|
font_t = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 30)
|
||||||
|
font_s = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 14)
|
||||||
|
|
||||||
|
BG = '#151718'
|
||||||
|
CARD = '#1f2426'
|
||||||
|
HEADER = '#242a2d'
|
||||||
|
BORDER = '#4c555a'
|
||||||
|
LINE = '#8b969d'
|
||||||
|
TEXT = '#e7ecef'
|
||||||
|
MUTED = '#a6b0b6'
|
||||||
|
PK = '#f6d365'
|
||||||
|
FK = '#8bc7ff'
|
||||||
|
BLUE = '#67d8ef'
|
||||||
|
PURPLE = '#c4a7ff'
|
||||||
|
GREEN = '#8be28b'
|
||||||
|
|
||||||
|
entities = {
|
||||||
|
# col 1 source
|
||||||
|
'member': (80, 170, 310, ['PK MemberNo', 'korName', 'teamName', 'rankName', 'groupCode', 'rankCode', 'isRetired']),
|
||||||
|
'dallyproject': (80, 500, 330, ['PK id', 'FK MemberNo', 'WorkDate', 'EntryPCode', 'EntryTime', 'LeaveTime', 'OverTime', 'TotalHours', 'RegularHours', 'OvertimeHours']),
|
||||||
|
'project_alias': (80, 900, 330, ['PK projectCode', 'shortName', 'bridge/project name']),
|
||||||
|
# col 2 erp collection
|
||||||
|
'site_worksheet_worker_cache': (610, 140, 400, ['PK projectCode + workDate', 'PK korName + jobType', 'workText', 'note', 'personCount', 'syncedAt']),
|
||||||
|
'site_worksheet_record': (610, 500, 400, ['PK projectCode + workDate', 'PK memberNo + korName', 'FK memberNo', 'jobType', 'workText', 'note', 'personCount']),
|
||||||
|
'site_worksheet_day_sync': (610, 850, 400, ['PK projectCode + workDate', 'syncedAt']),
|
||||||
|
'site_worksheet_menu_sync': (610, 1035, 400, ['PK projectCode + workDate', 'PK selMenu', '2 = normal worksheet', '3 = tension/temp works', 'syncedAt']),
|
||||||
|
# col 3 integrated calendar
|
||||||
|
'work_calendar_detail': (1240, 310, 390, ['PK id', 'source: sql / site', 'FK memberNo', 'workDate', 'projectCode', 'projectName', 'workText', 'jobType', 'hours', 'regularHours', 'overtimeHours', 'personCount']),
|
||||||
|
'work_calendar_day': (1240, 790, 390, ['PK memberNo + workDate', 'korName', 'teamName', 'rankName', 'sqlHours', 'sqlProjectCodes', 'siteCount', 'siteProjectCodes', 'siteWorkTexts', 'hasSql', 'hasSite']),
|
||||||
|
}
|
||||||
|
heights = {}
|
||||||
|
for k,(x,y,w,fields) in entities.items():
|
||||||
|
heights[k] = 52 + len(fields)*25 + 18
|
||||||
|
|
||||||
|
def draw_card(name):
|
||||||
|
x,y,w,fields = entities[name]
|
||||||
|
h = heights[name]
|
||||||
|
d.rounded_rectangle((x,y,x+w,y+h), radius=8, fill=CARD, outline=BORDER, width=2)
|
||||||
|
d.rectangle((x,y,x+w,y+42), fill=HEADER)
|
||||||
|
d.line((x,y+42,x+w,y+42), fill=BORDER, width=1)
|
||||||
|
d.text((x+16,y+11), name, font=font_b, fill=TEXT)
|
||||||
|
yy = y+58
|
||||||
|
for f in fields:
|
||||||
|
color = TEXT
|
||||||
|
if f.startswith('PK'): color = PK
|
||||||
|
elif f.startswith('FK'): color = FK
|
||||||
|
d.text((x+18,yy), f, font=font_s, fill=color)
|
||||||
|
yy += 25
|
||||||
|
|
||||||
|
def anchor(name, side, offset=0):
|
||||||
|
x,y,w,_ = entities[name]
|
||||||
|
h = heights[name]
|
||||||
|
if side == 'r': return (x+w, y+h//2+offset)
|
||||||
|
if side == 'l': return (x, y+h//2+offset)
|
||||||
|
if side == 't': return (x+w//2+offset, y)
|
||||||
|
if side == 'b': return (x+w//2+offset, y+h)
|
||||||
|
|
||||||
|
def orth(a, b, label='', color=LINE, via_x=None, via_y=None):
|
||||||
|
x1,y1 = a; x2,y2 = b
|
||||||
|
pts = [(x1,y1)]
|
||||||
|
if via_x is not None:
|
||||||
|
pts += [(via_x,y1), (via_x,y2)]
|
||||||
|
elif via_y is not None:
|
||||||
|
pts += [(x1,via_y), (x2,via_y)]
|
||||||
|
else:
|
||||||
|
mx = (x1+x2)//2
|
||||||
|
pts += [(mx,y1), (mx,y2)]
|
||||||
|
pts += [(x2,y2)]
|
||||||
|
d.line(pts, fill=color, width=3)
|
||||||
|
for p in (pts[0], pts[-1]):
|
||||||
|
d.ellipse((p[0]-5,p[1]-5,p[0]+5,p[1]+5), fill=color)
|
||||||
|
if label:
|
||||||
|
# place label around middle point
|
||||||
|
mid = pts[len(pts)//2]
|
||||||
|
tw = d.textlength(label, font=font_s)
|
||||||
|
x,y = mid
|
||||||
|
d.rounded_rectangle((x-tw/2-8,y-13,x+tw/2+8,y+13), radius=5, fill=BG, outline='#4a5054')
|
||||||
|
d.text((x-tw/2,y-9), label, font=font_s, fill=MUTED)
|
||||||
|
|
||||||
|
# background columns
|
||||||
|
cols = [(50,120,470,1135,'SOURCE'), (570,120,1050,1135,'ERP CACHE / MATCH'), (1200,120,1680,1135,'CALENDAR INTEGRATION')]
|
||||||
|
for x1,y1,x2,y2,title in cols:
|
||||||
|
d.rounded_rectangle((x1,y1,x2,y2), radius=12, fill='#181b1c', outline='#2a2f31')
|
||||||
|
d.text((x1+20,y1+18), title, font=font_b, fill='#6f7a80')
|
||||||
|
|
||||||
|
# title
|
||||||
|
d.text((60,40), 'Work Data ERD', font=font_t, fill=TEXT)
|
||||||
|
d.text((60,78), 'Columns arranged by data flow: source -> ERP cache/match -> calendar integration', font=font_s, fill=MUTED)
|
||||||
|
|
||||||
|
# lines first
|
||||||
|
orth(anchor('member','r',-25), anchor('dallyproject','l',-60), 'MemberNo', via_x=500, color=BLUE)
|
||||||
|
orth(anchor('member','r',10), anchor('site_worksheet_record','l',-40), 'MemberNo', via_x=535, color=BLUE)
|
||||||
|
orth(anchor('project_alias','r',-30), anchor('dallyproject','r',20), 'EntryPCode', via_x=500, color=GREEN)
|
||||||
|
# project alias to erp and calendar
|
||||||
|
orth(anchor('project_alias','r',10), anchor('site_worksheet_worker_cache','l',-30), 'projectCode', via_x=540, color=GREEN)
|
||||||
|
# cache and sync to worker cache
|
||||||
|
orth(anchor('site_worksheet_day_sync','t'), anchor('site_worksheet_worker_cache','b',80), 'project+date fetched', via_x=1110, color=LINE)
|
||||||
|
ord_start = anchor('site_worksheet_menu_sync','t')
|
||||||
|
orth(ord_start, anchor('site_worksheet_worker_cache','b',150), 'menu 2/3 fetched', via_x=1160, color=LINE)
|
||||||
|
# worker cache to record
|
||||||
|
orth(anchor('site_worksheet_worker_cache','b'), anchor('site_worksheet_record','t'), 'match name/date/project', via_x=820, color=PURPLE)
|
||||||
|
# sources to detail
|
||||||
|
orth(anchor('dallyproject','r',-10), anchor('work_calendar_detail','l',-80), 'source=sql', via_x=1120, color=BLUE)
|
||||||
|
orth(anchor('site_worksheet_record','r'), anchor('work_calendar_detail','l',20), 'source=site', via_x=1120, color=PURPLE)
|
||||||
|
orth(anchor('project_alias','r',55), anchor('work_calendar_detail','l',70), 'projectName', via_x=1120, color=GREEN)
|
||||||
|
# detail to day
|
||||||
|
orth(anchor('work_calendar_detail','b'), anchor('work_calendar_day','t'), 'daily summary', via_x=1435, color=LINE)
|
||||||
|
# member to day
|
||||||
|
orth(anchor('member','r',55), anchor('work_calendar_day','l',-60), 'MemberNo + workDate', via_x=520, color=BLUE)
|
||||||
|
|
||||||
|
for name in entities:
|
||||||
|
draw_card(name)
|
||||||
|
|
||||||
|
# legend
|
||||||
|
d.rounded_rectangle((60,1160,1660,1225), radius=8, fill='#1c2022', outline='#343a3e')
|
||||||
|
d.text((80,1178), 'Legend', font=font_b, fill=TEXT)
|
||||||
|
d.text((180,1179), 'Blue = employee relation Green = project relation Purple = ERP site worksheet matching Gray = sync/calendar flow', font=font_s, fill=MUTED)
|
||||||
|
|
||||||
|
img.save(PNG)
|
||||||
|
print(PNG)
|
||||||
135
exports/create_erd_dark_image.py
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
OUT = Path('/home/hyein/jh-mh/장헌산업/exports')
|
||||||
|
PNG = OUT / 'work_data_erd_dark.png'
|
||||||
|
W, H = 1400, 1900
|
||||||
|
img = Image.new('RGB', (W, H), '#17191a')
|
||||||
|
d = ImageDraw.Draw(img)
|
||||||
|
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 17)
|
||||||
|
font_b = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 18)
|
||||||
|
font_t = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 24)
|
||||||
|
font_s = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 13)
|
||||||
|
|
||||||
|
BG = '#17191a'
|
||||||
|
CARD = '#1e2224'
|
||||||
|
CARD2 = '#202426'
|
||||||
|
LINE = '#4b5256'
|
||||||
|
LINE2 = '#697176'
|
||||||
|
TEXT = '#e6ecef'
|
||||||
|
MUTED = '#9aa4aa'
|
||||||
|
PK = '#f4d06f'
|
||||||
|
FK = '#8cc7ff'
|
||||||
|
ACCENT = '#d0d6d9'
|
||||||
|
|
||||||
|
entities = {
|
||||||
|
'member': {
|
||||||
|
'xy': (150, 360), 'w': 250,
|
||||||
|
'fields': ['PK MemberNo', 'korName', 'teamName', 'rankName', 'groupCode', 'rankCode', 'isRetired']
|
||||||
|
},
|
||||||
|
'dallyproject': {
|
||||||
|
'xy': (185, 720), 'w': 290,
|
||||||
|
'fields': ['PK id', 'FK MemberNo', 'WorkDate', 'EntryPCode', 'EntryTime', 'LeaveTime', 'OverTime', 'TotalHours', 'RegularHours', 'OvertimeHours']
|
||||||
|
},
|
||||||
|
'work_calendar_day': {
|
||||||
|
'xy': (70, 1190), 'w': 315,
|
||||||
|
'fields': ['PK memberNo + workDate', 'korName', 'teamName', 'rankName', 'sqlHours', 'sqlProjectCodes', 'siteCount', 'siteProjectCodes', 'siteWorkTexts', 'hasSql', 'hasSite']
|
||||||
|
},
|
||||||
|
'work_calendar_detail': {
|
||||||
|
'xy': (515, 920), 'w': 310,
|
||||||
|
'fields': ['PK id', 'source: sql / site', 'FK memberNo', 'workDate', 'projectCode', 'projectName', 'workText', 'jobType', 'hours', 'regularHours', 'overtimeHours', 'personCount']
|
||||||
|
},
|
||||||
|
'project_alias': {
|
||||||
|
'xy': (655, 70), 'w': 315,
|
||||||
|
'fields': ['PK projectCode', 'shortName', 'bridge/project name']
|
||||||
|
},
|
||||||
|
'site_worksheet_record': {
|
||||||
|
'xy': (680, 430), 'w': 340,
|
||||||
|
'fields': ['PK projectCode + workDate', 'PK memberNo + korName', 'FK memberNo', 'jobType', 'workText', 'note', 'personCount']
|
||||||
|
},
|
||||||
|
'site_worksheet_worker_cache': {
|
||||||
|
'xy': (960, 170), 'w': 360,
|
||||||
|
'fields': ['PK projectCode + workDate', 'PK korName + jobType', 'workText', 'note', 'personCount', 'syncedAt']
|
||||||
|
},
|
||||||
|
'site_worksheet_day_sync': {
|
||||||
|
'xy': (930, 760), 'w': 310,
|
||||||
|
'fields': ['PK projectCode + workDate', 'syncedAt']
|
||||||
|
},
|
||||||
|
'site_worksheet_menu_sync': {
|
||||||
|
'xy': (860, 1090), 'w': 335,
|
||||||
|
'fields': ['PK projectCode + workDate', 'PK selMenu', '2 = normal worksheet', '3 = tension/temp works', 'syncedAt']
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# compute heights
|
||||||
|
for e in entities.values():
|
||||||
|
e['h'] = 52 + len(e['fields']) * 26 + 18
|
||||||
|
|
||||||
|
|
||||||
|
def rounded_box(x, y, w, h, name, fields):
|
||||||
|
d.rounded_rectangle((x, y, x+w, y+h), radius=6, fill=CARD, outline='#3c4246', width=2)
|
||||||
|
d.rectangle((x, y, x+w, y+42), fill=CARD2)
|
||||||
|
d.line((x, y+42, x+w, y+42), fill='#3c4246', width=1)
|
||||||
|
d.text((x+16, y+12), name, font=font_b, fill=TEXT)
|
||||||
|
yy = y + 58
|
||||||
|
for f in fields:
|
||||||
|
color = TEXT
|
||||||
|
if f.startswith('PK'):
|
||||||
|
color = PK
|
||||||
|
elif f.startswith('FK'):
|
||||||
|
color = FK
|
||||||
|
d.text((x+18, yy), f, font=font_s, fill=color)
|
||||||
|
yy += 26
|
||||||
|
|
||||||
|
|
||||||
|
def pt(name, side):
|
||||||
|
e = entities[name]
|
||||||
|
x, y = e['xy']; w = e['w']; h = e['h']
|
||||||
|
if side == 'l': return (x, y+h//2)
|
||||||
|
if side == 'r': return (x+w, y+h//2)
|
||||||
|
if side == 't': return (x+w//2, y)
|
||||||
|
if side == 'b': return (x+w//2, y+h)
|
||||||
|
|
||||||
|
|
||||||
|
def poly(points, label=None, label_pos=None):
|
||||||
|
d.line(points, fill=LINE, width=2, joint='curve')
|
||||||
|
for x, y in (points[0], points[-1]):
|
||||||
|
d.ellipse((x-4, y-4, x+4, y+4), fill=ACCENT)
|
||||||
|
if label:
|
||||||
|
x, y = label_pos or points[len(points)//2]
|
||||||
|
tw = d.textlength(label, font=font_s)
|
||||||
|
d.rounded_rectangle((x-tw/2-7, y-12, x+tw/2+7, y+12), radius=4, fill=BG, outline='#363b3f')
|
||||||
|
d.text((x-tw/2, y-9), label, font=font_s, fill=MUTED)
|
||||||
|
|
||||||
|
# title
|
||||||
|
d.text((70, 35), 'Work Data ERD', font=font_t, fill=TEXT)
|
||||||
|
d.text((70, 68), 'SQL work records + ERP site worksheet integration', font=font_s, fill=MUTED)
|
||||||
|
|
||||||
|
# relation lines behind cards
|
||||||
|
poly([pt('member','b'), (275, 665), pt('dallyproject','t')], 'MemberNo', (300, 650))
|
||||||
|
poly([pt('dallyproject','b'), (330, 1085), (520, 1085), pt('work_calendar_detail','l')], 'source=sql', (450, 1072))
|
||||||
|
poly([pt('work_calendar_detail','l'), (425, 1100), (425, 1350), pt('work_calendar_day','r')], 'daily summary', (426, 1280))
|
||||||
|
poly([pt('member','l'), (55, 460), (55, 1370), pt('work_calendar_day','l')], 'MemberNo', (56, 820))
|
||||||
|
poly([pt('member','r'), (520, 500), (520, 560), pt('site_worksheet_record','l')], 'MemberNo', (520, 538))
|
||||||
|
poly([pt('project_alias','b'), (815, 330), pt('site_worksheet_record','t')], 'projectCode', (810, 340))
|
||||||
|
poly([pt('project_alias','r'), (1070, 170), pt('site_worksheet_worker_cache','l')], 'projectCode', (1050, 145))
|
||||||
|
poly([pt('site_worksheet_worker_cache','b'), (1050, 405), (1000, 405), pt('site_worksheet_record','r')], 'match name/date/project', (1010, 410))
|
||||||
|
poly([pt('site_worksheet_record','b'), (740, 880), pt('work_calendar_detail','t')], 'source=site', (715, 850))
|
||||||
|
poly([pt('site_worksheet_day_sync','t'), (1005, 650), (1080, 400), pt('site_worksheet_worker_cache','b')], 'project+date fetched', (1040, 645))
|
||||||
|
poly([pt('site_worksheet_menu_sync','t'), (935, 1030), (1085, 400), pt('site_worksheet_worker_cache','b')], 'menu 2/3 fetched', (950, 1035))
|
||||||
|
poly([pt('project_alias','l'), (560, 185), (560, 825), pt('dallyproject','r')], 'EntryPCode', (560, 420))
|
||||||
|
poly([pt('project_alias','b'), (750, 780), pt('work_calendar_detail','r')], 'projectName', (755, 760))
|
||||||
|
|
||||||
|
# draw cards
|
||||||
|
for name, e in entities.items():
|
||||||
|
x, y = e['xy']
|
||||||
|
rounded_box(x, y, e['w'], e['h'], name, e['fields'])
|
||||||
|
|
||||||
|
# subtle legend
|
||||||
|
d.rounded_rectangle((70, 1740, 1270, 1845), radius=8, fill='#1c2022', outline='#343a3e')
|
||||||
|
d.text((90, 1765), 'Flow', font=font_b, fill=TEXT)
|
||||||
|
d.text((90, 1795), 'dallyproject -> work_calendar_detail -> work_calendar_day', font=font_s, fill=MUTED)
|
||||||
|
d.text((90, 1820), 'site_worksheet_worker_cache -> site_worksheet_record -> work_calendar_detail/day', font=font_s, fill=MUTED)
|
||||||
|
|
||||||
|
img.save(PNG)
|
||||||
|
print(PNG)
|
||||||
109
exports/create_erd_image.py
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
OUT = Path('/home/hyein/jh-mh/장헌산업/exports')
|
||||||
|
PNG = OUT / 'work_data_erd.png'
|
||||||
|
SVG = OUT / 'work_data_erd.svg'
|
||||||
|
W, H = 1900, 1280
|
||||||
|
img = Image.new('RGB', (W, H), '#f6f8fb')
|
||||||
|
d = ImageDraw.Draw(img)
|
||||||
|
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 18)
|
||||||
|
font_b = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 20)
|
||||||
|
font_title = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 34)
|
||||||
|
font_small = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 15)
|
||||||
|
|
||||||
|
entities = {
|
||||||
|
'member': (70, 110, 330, 330, ['PK MemberNo', 'korName', 'teamName', 'rankName', 'groupCode', 'rankCode', 'isRetired']),
|
||||||
|
'dallyproject': (470, 80, 780, 360, ['PK id', 'FK MemberNo', 'WorkDate', 'EntryPCode', 'EntryTime / LeaveTime', 'TotalHours', 'RegularHours', 'OvertimeHours']),
|
||||||
|
'project_alias': (1040, 110, 1330, 280, ['PK projectCode', 'shortName (bridge/project name)']),
|
||||||
|
'site_worksheet_worker_cache': (1360, 360, 1810, 610, ['PK projectCode + workDate + korName', 'jobType', 'workText', 'note', 'personCount', 'syncedAt']),
|
||||||
|
'site_worksheet_record': (900, 430, 1260, 690, ['PK projectCode + workDate + memberNo + korName', 'FK memberNo', 'jobType', 'workText', 'personCount']),
|
||||||
|
'site_worksheet_day_sync': (1370, 720, 1740, 870, ['PK projectCode + workDate', 'syncedAt']),
|
||||||
|
'site_worksheet_menu_sync': (1370, 930, 1740, 1090, ['PK projectCode + workDate + selMenu', 'selMenu 2 = normal', 'selMenu 3 = tension/temp works', 'syncedAt']),
|
||||||
|
'work_calendar_detail': (520, 800, 900, 1110, ['PK id', 'source: sql / site', 'FK memberNo', 'workDate', 'projectCode', 'projectName', 'workText', 'hours / regular / overtime', 'personCount']),
|
||||||
|
'work_calendar_day': (120, 770, 430, 1080, ['PK memberNo + workDate', 'korName / teamName / rankName', 'sqlHours', 'sqlProjectCodes', 'siteCount', 'siteProjectCodes', 'siteWorkTexts', 'hasSql / hasSite']),
|
||||||
|
}
|
||||||
|
|
||||||
|
colors = {
|
||||||
|
'member': ('#e0f2fe', '#0369a1'),
|
||||||
|
'dallyproject': ('#ecfdf5', '#047857'),
|
||||||
|
'project_alias': ('#fff7ed', '#c2410c'),
|
||||||
|
'site_worksheet_worker_cache': ('#fef3c7', '#b45309'),
|
||||||
|
'site_worksheet_record': ('#ede9fe', '#6d28d9'),
|
||||||
|
'site_worksheet_day_sync': ('#f1f5f9', '#475569'),
|
||||||
|
'site_worksheet_menu_sync': ('#f1f5f9', '#475569'),
|
||||||
|
'work_calendar_detail': ('#fee2e2', '#b91c1c'),
|
||||||
|
'work_calendar_day': ('#dbeafe', '#1d4ed8'),
|
||||||
|
}
|
||||||
|
|
||||||
|
def box(name, rect, fields):
|
||||||
|
x1,y1,x2,y2 = rect
|
||||||
|
fill, stroke = colors[name]
|
||||||
|
d.rounded_rectangle(rect, radius=14, fill=fill, outline=stroke, width=3)
|
||||||
|
d.rectangle((x1, y1, x2, y1+42), fill=stroke)
|
||||||
|
d.text((x1+14, y1+10), name, fill='white', font=font_b)
|
||||||
|
y = y1 + 55
|
||||||
|
for f in fields:
|
||||||
|
d.text((x1+16, y), f, fill='#0f172a', font=font_small if len(f) > 34 else font)
|
||||||
|
y += 26
|
||||||
|
|
||||||
|
def center(name, side):
|
||||||
|
x1,y1,x2,y2 = entities[name][:4]
|
||||||
|
if side == 'right': return (x2, (y1+y2)//2)
|
||||||
|
if side == 'left': return (x1, (y1+y2)//2)
|
||||||
|
if side == 'top': return ((x1+x2)//2, y1)
|
||||||
|
if side == 'bottom': return ((x1+x2)//2, y2)
|
||||||
|
|
||||||
|
def line(a, aside, b, bside, label, color='#334155'):
|
||||||
|
p1 = center(a, aside); p2 = center(b, bside)
|
||||||
|
d.line((p1, p2), fill=color, width=3)
|
||||||
|
# endpoint dots
|
||||||
|
for p in (p1, p2):
|
||||||
|
d.ellipse((p[0]-5,p[1]-5,p[0]+5,p[1]+5), fill=color)
|
||||||
|
mx, my = (p1[0]+p2[0])//2, (p1[1]+p2[1])//2
|
||||||
|
tw = d.textlength(label, font=font_small)
|
||||||
|
d.rounded_rectangle((mx-tw/2-8, my-13, mx+tw/2+8, my+13), radius=7, fill='#ffffff', outline='#cbd5e1')
|
||||||
|
d.text((mx-tw/2, my-9), label, fill=color, font=font_small)
|
||||||
|
|
||||||
|
# title
|
||||||
|
d.text((70, 30), 'Work Data ERD: SQL + Site Worksheet Integration', fill='#0f172a', font=font_title)
|
||||||
|
d.text((72, 72), 'SQLite DB: /home/hyein/jh-mh/장헌산업/matching.db', fill='#475569', font=font_small)
|
||||||
|
|
||||||
|
for name, data in entities.items():
|
||||||
|
box(name, data[:4], data[4])
|
||||||
|
|
||||||
|
# relationships
|
||||||
|
line('member','right','dallyproject','left','MemberNo')
|
||||||
|
line('member','right','site_worksheet_record','left','MemberNo')
|
||||||
|
line('member','bottom','work_calendar_day','top','MemberNo + workDate')
|
||||||
|
line('dallyproject','bottom','work_calendar_detail','top','source=sql')
|
||||||
|
line('site_worksheet_record','bottom','work_calendar_detail','right','source=site')
|
||||||
|
line('work_calendar_detail','left','work_calendar_day','right','daily summary')
|
||||||
|
line('project_alias','bottom','site_worksheet_record','top','projectCode')
|
||||||
|
line('project_alias','right','site_worksheet_worker_cache','top','projectCode')
|
||||||
|
line('site_worksheet_worker_cache','left','site_worksheet_record','right','match by name/date/project')
|
||||||
|
line('site_worksheet_day_sync','top','site_worksheet_worker_cache','bottom','project+date fetched')
|
||||||
|
line('site_worksheet_menu_sync','top','site_worksheet_worker_cache','bottom','menu 2/3 fetched')
|
||||||
|
line('project_alias','left','dallyproject','right','EntryPCode')
|
||||||
|
line('project_alias','bottom','work_calendar_detail','right','projectName')
|
||||||
|
|
||||||
|
# legend
|
||||||
|
lx, ly = 70, 1140
|
||||||
|
d.rounded_rectangle((lx, ly, 760, ly+95), radius=12, fill='#ffffff', outline='#cbd5e1', width=2)
|
||||||
|
d.text((lx+18, ly+14), 'Flow', font=font_b, fill='#0f172a')
|
||||||
|
d.text((lx+18, ly+43), 'dallyproject = SQL work records / site_worksheet_worker_cache = ERP site worksheet raw rows', font=font_small, fill='#334155')
|
||||||
|
d.text((lx+18, ly+68), 'site_worksheet_record = matched employee rows / work_calendar_* = calendar-ready integrated data', font=font_small, fill='#334155')
|
||||||
|
|
||||||
|
img.save(PNG)
|
||||||
|
|
||||||
|
# simple SVG wrapper embeds the PNG path as text fallback is not needed; create standalone SVG rectangles too minimal
|
||||||
|
svg = f'''<svg xmlns="http://www.w3.org/2000/svg" width="{W}" height="{H}" viewBox="0 0 {W} {H}">
|
||||||
|
<rect width="100%" height="100%" fill="#f6f8fb"/>
|
||||||
|
<text x="70" y="55" font-family="DejaVu Sans, Arial" font-size="34" font-weight="700" fill="#0f172a">Work Data ERD: SQL + Site Worksheet Integration</text>
|
||||||
|
<text x="72" y="82" font-family="DejaVu Sans, Arial" font-size="15" fill="#475569">PNG version generated at {PNG}</text>
|
||||||
|
<image href="{PNG.name}" x="0" y="0" width="{W}" height="{H}" opacity="0"/>
|
||||||
|
<text x="70" y="150" font-family="DejaVu Sans, Arial" font-size="22" fill="#334155">Open the PNG file for the full ERD diagram.</text>
|
||||||
|
</svg>'''
|
||||||
|
SVG.write_text(svg, encoding='utf-8')
|
||||||
|
print(PNG)
|
||||||
|
print(SVG)
|
||||||
95
exports/create_erd_split_images.py
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
from pathlib import Path
|
||||||
|
OUT=Path('/home/hyein/jh-mh/장헌산업/exports')
|
||||||
|
font=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf',17)
|
||||||
|
font_b=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf',20)
|
||||||
|
font_t=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf',30)
|
||||||
|
font_s=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf',14)
|
||||||
|
BG='#151718'; CARD='#1f2426'; HEADER='#252b2e'; BORDER='#59636a'; TEXT='#edf2f4'; MUTED='#a9b2b8'; PK='#f5d76e'; FK='#87c8ff'; BLUE='#60d7f2'; GREEN='#80e27e'; PURPLE='#b99bff'; GRAY='#9ca7ad'
|
||||||
|
|
||||||
|
def draw_erd(path, title, subtitle, entities, lines, legend):
|
||||||
|
W,H=1500,1000
|
||||||
|
img=Image.new('RGB',(W,H),BG); d=ImageDraw.Draw(img)
|
||||||
|
heights={k:52+len(v[3])*25+18 for k,v in entities.items()}
|
||||||
|
def card(n):
|
||||||
|
x,y,w,fs=entities[n]; h=heights[n]
|
||||||
|
d.rounded_rectangle((x,y,x+w,y+h),radius=8,fill=CARD,outline=BORDER,width=2)
|
||||||
|
d.rectangle((x,y,x+w,y+42),fill=HEADER); d.line((x,y+42,x+w,y+42),fill=BORDER,width=1)
|
||||||
|
d.text((x+16,y+11),n,font=font_b,fill=TEXT)
|
||||||
|
yy=y+58
|
||||||
|
for f in fs:
|
||||||
|
c=PK if f.startswith('PK') else FK if f.startswith('FK') else TEXT
|
||||||
|
d.text((x+18,yy),f,font=font_s,fill=c); yy+=25
|
||||||
|
def a(n,s,off=0):
|
||||||
|
x,y,w,_=entities[n]; h=heights[n]
|
||||||
|
return {'r':(x+w,y+h//2+off),'l':(x,y+h//2+off),'t':(x+w//2+off,y),'b':(x+w//2+off,y+h)}[s]
|
||||||
|
def arrow(p1,p2,label,color,via_x=None,via_y=None):
|
||||||
|
x1,y1=p1; x2,y2=p2
|
||||||
|
pts=[p1]
|
||||||
|
if via_x is not None: pts += [(via_x,y1),(via_x,y2)]
|
||||||
|
elif via_y is not None: pts += [(x1,via_y),(x2,via_y)]
|
||||||
|
else:
|
||||||
|
mx=(x1+x2)//2; pts += [(mx,y1),(mx,y2)]
|
||||||
|
pts += [p2]
|
||||||
|
d.line(pts,fill=color,width=4,joint='curve')
|
||||||
|
x,y=pts[-1]
|
||||||
|
if x2>=x1: tri=[(x,y),(x-10,y-6),(x-10,y+6)]
|
||||||
|
else: tri=[(x,y),(x+10,y-6),(x+10,y+6)]
|
||||||
|
d.polygon(tri,fill=color)
|
||||||
|
mid=pts[len(pts)//2]
|
||||||
|
tw=d.textlength(label,font=font_s)
|
||||||
|
d.rounded_rectangle((mid[0]-tw/2-8,mid[1]-14,mid[0]+tw/2+8,mid[1]+14),radius=5,fill=BG,outline='#4b5358')
|
||||||
|
d.text((mid[0]-tw/2,mid[1]-9),label,font=font_s,fill=MUTED)
|
||||||
|
d.text((60,35),title,font=font_t,fill=TEXT)
|
||||||
|
d.text((60,73),subtitle,font=font_s,fill=MUTED)
|
||||||
|
for x1,x2,col_title in [(45,445,'SOURCE'),(535,985,'MATCH / DETAIL'),(1090,1455,'OUTPUT')]:
|
||||||
|
d.rounded_rectangle((x1,110,x2,890),radius=12,fill='#181b1c',outline='#2c3235')
|
||||||
|
d.text((x1+20,130),col_title,font=font_b,fill='#7f8a90')
|
||||||
|
for ln in lines:
|
||||||
|
src,ss,dst,ds,label,color,via=ln
|
||||||
|
kwargs={}
|
||||||
|
if via and via[0]=='x': kwargs['via_x']=via[1]
|
||||||
|
if via and via[0]=='y': kwargs['via_y']=via[1]
|
||||||
|
arrow(a(src,ss),a(dst,ds),label,color,**kwargs)
|
||||||
|
for n in entities: card(n)
|
||||||
|
d.rounded_rectangle((60,920,1440,970),radius=8,fill='#1d2123',outline='#3a4247')
|
||||||
|
d.text((80,936),legend,font=font_s,fill=MUTED)
|
||||||
|
img.save(path)
|
||||||
|
print(path)
|
||||||
|
|
||||||
|
people_entities={
|
||||||
|
'member':(80,170,320,['PK MemberNo','korName','teamName','rankName','groupCode','rankCode','isRetired']),
|
||||||
|
'dallyproject':(80,510,350,['PK id','FK MemberNo','WorkDate','EntryPCode','TotalHours','RegularHours','OvertimeHours']),
|
||||||
|
'site_worksheet_record':(570,250,390,['PK projectCode + workDate','PK memberNo + korName','FK memberNo','jobType','workText','personCount']),
|
||||||
|
'work_calendar_detail':(570,610,390,['PK id','source: sql / site','FK memberNo','workDate','projectCode','hours','personCount']),
|
||||||
|
'work_calendar_day':(1120,360,360,['PK memberNo + workDate','korName / teamName / rankName','sqlHours','siteCount','sqlProjectCodes','siteProjectCodes','hasSql / hasSite'])}
|
||||||
|
people_lines=[
|
||||||
|
('member','r','site_worksheet_record','l','employee match',BLUE,('x',500)),
|
||||||
|
('member','r','dallyproject','l','MemberNo',BLUE,('y',470)),
|
||||||
|
('dallyproject','r','work_calendar_detail','l','SQL rows',BLUE,('x',505)),
|
||||||
|
('site_worksheet_record','b','work_calendar_detail','t','site rows',PURPLE,('x',765)),
|
||||||
|
('work_calendar_detail','r','work_calendar_day','l','daily summary',GRAY,('x',1040)),
|
||||||
|
('member','r','work_calendar_day','l','person/day output',BLUE,('x',1030)),
|
||||||
|
]
|
||||||
|
|
||||||
|
project_entities={
|
||||||
|
'project_alias':(80,190,350,['PK projectCode','shortName','bridge/project name']),
|
||||||
|
'dallyproject':(80,520,350,['PK id','EntryPCode','WorkDate','MemberNo','TotalHours','OvertimeHours']),
|
||||||
|
'site_worksheet_worker_cache':(570,150,420,['PK projectCode + workDate','PK korName + jobType','workText','note','personCount','syncedAt']),
|
||||||
|
'site_worksheet_day_sync':(570,500,390,['PK projectCode + workDate','syncedAt']),
|
||||||
|
'site_worksheet_menu_sync':(570,700,390,['PK projectCode + workDate','PK selMenu','2 = normal worksheet','3 = tension/temp works','syncedAt']),
|
||||||
|
'work_calendar_detail':(1120,240,370,['PK id','source: sql / site','projectCode','projectName','workText','memberNo','hours','personCount']),
|
||||||
|
'work_calendar_day':(1120,650,370,['PK memberNo + workDate','siteProjectCodes','siteWorkTexts','sqlProjectCodes','siteCount','hasSql / hasSite'])}
|
||||||
|
project_lines=[
|
||||||
|
('project_alias','r','site_worksheet_worker_cache','l','projectCode',GREEN,('x',515)),
|
||||||
|
('project_alias','r','dallyproject','l','EntryPCode',GREEN,('y',450)),
|
||||||
|
('site_worksheet_day_sync','t','site_worksheet_worker_cache','b','date fetched',GRAY,('x',1040)),
|
||||||
|
('site_worksheet_menu_sync','t','site_worksheet_worker_cache','b','menu 2/3 fetched',GRAY,('x',1080)),
|
||||||
|
('site_worksheet_worker_cache','r','work_calendar_detail','l','ERP raw site rows',PURPLE,('x',1040)),
|
||||||
|
('dallyproject','r','work_calendar_detail','l','SQL project rows',BLUE,('x',1040)),
|
||||||
|
('project_alias','r','work_calendar_detail','l','projectName',GREEN,('x',1040)),
|
||||||
|
('work_calendar_detail','b','work_calendar_day','t','calendar output',GRAY,('x',1305)),
|
||||||
|
]
|
||||||
|
|
||||||
|
draw_erd(OUT/'work_data_erd_people.png','People-Centered ERD','How one employee is connected to SQL work, ERP site work, and calendar output',people_entities,people_lines,'Blue = employee/SQL relation Purple = ERP matched rows Gray = calendar aggregation')
|
||||||
|
draw_erd(OUT/'work_data_erd_project.png','Project-Centered ERD','How project codes, bridge names, ERP worksheet menus, and calendar details are connected',project_entities,project_lines,'Green = project code/name Purple = ERP worksheet data Blue = SQL project rows Gray = sync/calendar flow')
|
||||||
159
exports/create_erd_unified_lanes.py
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
OUT = Path('/home/hyein/jh-mh/장헌산업/exports')
|
||||||
|
PNG = OUT / 'work_data_erd_unified_lanes.png'
|
||||||
|
W, H = 1900, 1980
|
||||||
|
img = Image.new('RGB', (W, H), '#151718')
|
||||||
|
d = ImageDraw.Draw(img)
|
||||||
|
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 18)
|
||||||
|
font_b = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 21)
|
||||||
|
font_t = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 34)
|
||||||
|
font_s = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 15)
|
||||||
|
font_badge = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 16)
|
||||||
|
|
||||||
|
BG = '#151718'
|
||||||
|
PANEL = '#181b1c'
|
||||||
|
CARD = '#202527'
|
||||||
|
HEADER = '#293033'
|
||||||
|
BORDER = '#667179'
|
||||||
|
TEXT = '#eef3f5'
|
||||||
|
MUTED = '#a8b1b7'
|
||||||
|
PK = '#f5d76e'
|
||||||
|
FK = '#87c8ff'
|
||||||
|
PEOPLE = '#55d8f4'
|
||||||
|
PROJECT = '#81e681'
|
||||||
|
ERP = '#b99bff'
|
||||||
|
CAL = '#a6b0b6'
|
||||||
|
BADGE = '#263036'
|
||||||
|
|
||||||
|
entities = {
|
||||||
|
# left source column
|
||||||
|
'member': (80, 210, 330, ['PK MemberNo', 'korName', 'teamName', 'rankName', 'groupCode', 'rankCode', 'isRetired']),
|
||||||
|
'dallyproject': (80, 585, 360, ['PK id', 'FK MemberNo', 'WorkDate', 'EntryPCode', 'EntryTime / LeaveTime', 'OverTime', 'TotalHours', 'RegularHours', 'OvertimeHours']),
|
||||||
|
'project_alias': (80, 1035, 360, ['PK projectCode', 'shortName', 'bridge/project name']),
|
||||||
|
|
||||||
|
# shared center columns
|
||||||
|
'site_worksheet_worker_cache': (640, 170, 430, ['PK projectCode + workDate', 'PK korName + jobType', 'workText', 'note', 'personCount', 'syncedAt']),
|
||||||
|
'site_worksheet_record': (640, 570, 430, ['PK projectCode + workDate', 'PK memberNo + korName', 'FK memberNo', 'jobType', 'workText', 'note', 'personCount']),
|
||||||
|
'site_worksheet_day_sync': (640, 960, 410, ['PK projectCode + workDate', 'syncedAt']),
|
||||||
|
'site_worksheet_menu_sync': (640, 1140, 410, ['PK projectCode + workDate', 'PK selMenu', '2 = normal worksheet', '3 = tension/temp works', 'syncedAt']),
|
||||||
|
|
||||||
|
# right output column
|
||||||
|
'work_calendar_detail': (1350, 330, 430, ['PK id', 'source: sql / site', 'FK memberNo', 'workDate', 'projectCode', 'projectName', 'workText', 'jobType', 'hours', 'regularHours', 'overtimeHours', 'personCount']),
|
||||||
|
'work_calendar_day': (1350, 920, 430, ['PK memberNo + workDate', 'korName / teamName / rankName', 'sqlHours', 'sqlProjectCodes', 'siteCount', 'siteProjectCodes', 'siteWorkTexts', 'hasSql / hasSite']),
|
||||||
|
'project_yearly_summary': (1350, 1285, 430, ['VIEW project tab output', 'projectCode + yearMonth', 'memberNo / korName', 'intranetRegularHours', 'siteHours = personCount * 8', 'commonHours', 'total = intranet + site - common']),
|
||||||
|
}
|
||||||
|
heights = {k: 54 + len(v[3]) * 27 + 20 for k, v in entities.items()}
|
||||||
|
|
||||||
|
relations = [
|
||||||
|
('1', 'member -> dallyproject', PEOPLE),
|
||||||
|
('2', 'member -> site_worksheet_record', PEOPLE),
|
||||||
|
('3', 'project_alias -> dallyproject', PROJECT),
|
||||||
|
('4', 'project_alias -> worker_cache', PROJECT),
|
||||||
|
('5', 'day_sync: fetched project/date', CAL),
|
||||||
|
('6', 'menu_sync: fetched menu 2/3', CAL),
|
||||||
|
('7', 'worker_cache -> record', ERP),
|
||||||
|
('8', 'dallyproject -> calendar_detail', PEOPLE),
|
||||||
|
('9', 'record -> calendar_detail', ERP),
|
||||||
|
('10', 'project_alias -> projectName', PROJECT),
|
||||||
|
('11', 'calendar_detail -> calendar_day', CAL),
|
||||||
|
('12', 'dallyproject -> project summary', PEOPLE),
|
||||||
|
('13', 'record -> project summary', ERP),
|
||||||
|
]
|
||||||
|
|
||||||
|
def panel(x1, y1, x2, y2, title, color):
|
||||||
|
d.rounded_rectangle((x1, y1, x2, y2), radius=16, fill=PANEL, outline='#2e3437', width=2)
|
||||||
|
d.text((x1 + 24, y1 + 20), title, font=font_b, fill=color)
|
||||||
|
|
||||||
|
|
||||||
|
def card(name):
|
||||||
|
x, y, w, fields = entities[name]
|
||||||
|
h = heights[name]
|
||||||
|
d.rounded_rectangle((x, y, x + w, y + h), radius=8, fill=CARD, outline=BORDER, width=2)
|
||||||
|
d.rectangle((x, y, x + w, y + 46), fill=HEADER)
|
||||||
|
d.line((x, y + 46, x + w, y + 46), fill=BORDER, width=1)
|
||||||
|
d.text((x + 18, y + 12), name, font=font_b, fill=TEXT)
|
||||||
|
yy = y + 64
|
||||||
|
for f in fields:
|
||||||
|
color = PK if f.startswith('PK') else FK if f.startswith('FK') else TEXT
|
||||||
|
d.text((x + 20, yy), f, font=font_s, fill=color)
|
||||||
|
yy += 27
|
||||||
|
|
||||||
|
|
||||||
|
def anchor(name, side, off=0):
|
||||||
|
x, y, w, _ = entities[name]
|
||||||
|
h = heights[name]
|
||||||
|
if side == 'r': return (x + w, y + h // 2 + off)
|
||||||
|
if side == 'l': return (x, y + h // 2 + off)
|
||||||
|
if side == 't': return (x + w // 2 + off, y)
|
||||||
|
if side == 'b': return (x + w // 2 + off, y + h)
|
||||||
|
|
||||||
|
|
||||||
|
def badge(num, x, y, color):
|
||||||
|
d.ellipse((x - 14, y - 14, x + 14, y + 14), fill=BADGE, outline=color, width=2)
|
||||||
|
tw = d.textlength(num, font=font_badge)
|
||||||
|
d.text((x - tw / 2, y - 10), num, font=font_badge, fill=color)
|
||||||
|
|
||||||
|
|
||||||
|
def arrow(points, color, num=None, badge_at=None):
|
||||||
|
d.line(points, fill=color, width=4, joint='curve')
|
||||||
|
x1, y1 = points[-2]
|
||||||
|
x2, y2 = points[-1]
|
||||||
|
if abs(x2 - x1) >= abs(y2 - y1):
|
||||||
|
tri = [(x2, y2), (x2 - 12 if x2 >= x1 else x2 + 12, y2 - 7), (x2 - 12 if x2 >= x1 else x2 + 12, y2 + 7)]
|
||||||
|
else:
|
||||||
|
tri = [(x2, y2), (x2 - 7, y2 - 12 if y2 >= y1 else y2 + 12), (x2 + 7, y2 - 12 if y2 >= y1 else y2 + 12)]
|
||||||
|
d.polygon(tri, fill=color)
|
||||||
|
if num:
|
||||||
|
bx, by = badge_at if badge_at else points[len(points)//2]
|
||||||
|
badge(num, bx, by, color)
|
||||||
|
|
||||||
|
# title
|
||||||
|
d.text((70, 40), 'Unified Work Data ERD', font=font_t, fill=TEXT)
|
||||||
|
d.text((72, 82), 'One diagram, separated into people flow and project flow. Numbered connectors avoid line-label overlap.', font=font_s, fill=MUTED)
|
||||||
|
|
||||||
|
# panels
|
||||||
|
panel(45, 130, 500, 1535, 'SOURCE TABLES', MUTED)
|
||||||
|
panel(585, 130, 1130, 1535, 'SHARED ERP CACHE / MATCH TABLES', MUTED)
|
||||||
|
panel(1300, 130, 1860, 1535, 'OUTPUT / VIEW TABLES', MUTED)
|
||||||
|
|
||||||
|
|
||||||
|
# connectors without text labels
|
||||||
|
arrow([anchor('member','b'), (245, 545), anchor('dallyproject','t')], PEOPLE, '1', (245, 545))
|
||||||
|
arrow([anchor('member','r',10), (555, anchor('member','r',10)[1]), (555, anchor('site_worksheet_record','l',-40)[1]), anchor('site_worksheet_record','l',-40)], PEOPLE, '2', (555, 470))
|
||||||
|
arrow([anchor('project_alias','t'), (260, 925), anchor('dallyproject','b')], PROJECT, '3', (260, 925))
|
||||||
|
arrow([anchor('project_alias','r',-20), (560, anchor('project_alias','r',-20)[1]), (560, anchor('site_worksheet_worker_cache','l',-35)[1]), anchor('site_worksheet_worker_cache','l',-35)], PROJECT, '4', (560, 825))
|
||||||
|
arrow([anchor('site_worksheet_day_sync','t'), (1110, 910), (1110, 340), anchor('site_worksheet_worker_cache','r',45)], CAL, '5', (1110, 910))
|
||||||
|
arrow([anchor('site_worksheet_menu_sync','t'), (1160, 1120), (1160, 370), anchor('site_worksheet_worker_cache','r',90)], CAL, '6', (1160, 1120))
|
||||||
|
arrow([anchor('site_worksheet_worker_cache','b'), (855, 520), anchor('site_worksheet_record','t')], ERP, '7', (855, 520))
|
||||||
|
arrow([anchor('dallyproject','r',-30), (1235, anchor('dallyproject','r',-30)[1]), (1235, anchor('work_calendar_detail','l',-80)[1]), anchor('work_calendar_detail','l',-80)], PEOPLE, '8', (1235, 610))
|
||||||
|
arrow([anchor('site_worksheet_record','r'), (1240, anchor('site_worksheet_record','r')[1]), (1240, anchor('work_calendar_detail','l',40)[1]), anchor('work_calendar_detail','l',40)], ERP, '9', (1240, 690))
|
||||||
|
arrow([anchor('project_alias','r',35), (1200, anchor('project_alias','r',35)[1]), (1200, anchor('work_calendar_detail','l',95)[1]), anchor('work_calendar_detail','l',95)], PROJECT, '10', (1200, 1030))
|
||||||
|
arrow([anchor('work_calendar_detail','b'), (1565, 880), anchor('work_calendar_day','t')], CAL, '11', (1565, 880))
|
||||||
|
arrow([anchor('dallyproject','r',35), (1280, anchor('dallyproject','r',35)[1]), (1280, anchor('project_yearly_summary','l',-45)[1]), anchor('project_yearly_summary','l',-45)], PEOPLE, '12', (1280, 800))
|
||||||
|
arrow([anchor('site_worksheet_record','r',55), (1265, anchor('site_worksheet_record','r',55)[1]), (1265, anchor('project_yearly_summary','l',30)[1]), anchor('project_yearly_summary','l',30)], ERP, '13', (1265, 1185))
|
||||||
|
|
||||||
|
# cards
|
||||||
|
for name in entities:
|
||||||
|
card(name)
|
||||||
|
|
||||||
|
# connector legend bottom
|
||||||
|
legend_x, legend_y = 70, 1590
|
||||||
|
d.rounded_rectangle((legend_x, legend_y, 1830, 1775), radius=10, fill='#1d2123', outline='#3a4247')
|
||||||
|
d.text((legend_x + 20, legend_y + 16), 'CONNECTORS', font=font_b, fill=TEXT)
|
||||||
|
col_w = 570
|
||||||
|
for idx, (num, text, color) in enumerate(relations):
|
||||||
|
col = idx // 5
|
||||||
|
row = idx % 5
|
||||||
|
x = legend_x + 28 + col * col_w
|
||||||
|
y = legend_y + 55 + row * 34
|
||||||
|
badge(num, x, y + 8, color)
|
||||||
|
d.text((x + 28, y), text, font=font_s, fill=TEXT)
|
||||||
|
|
||||||
|
# mini flow labels
|
||||||
|
d.rounded_rectangle((70, 1810, 1830, 1850), radius=8, fill='#1d2123', outline='#3a4247')
|
||||||
|
d.text((90, 1820), 'People flow: member + dallyproject + matched ERP rows -> calendar | Project flow: dallyproject + matched ERP rows -> project summary', font=font_s, fill=MUTED)
|
||||||
|
|
||||||
|
img.save(PNG)
|
||||||
|
print(PNG)
|
||||||
BIN
exports/work_data_erd.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
7
exports/work_data_erd.svg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="1900" height="1280" viewBox="0 0 1900 1280">
|
||||||
|
<rect width="100%" height="100%" fill="#f6f8fb"/>
|
||||||
|
<text x="70" y="55" font-family="DejaVu Sans, Arial" font-size="34" font-weight="700" fill="#0f172a">Work Data ERD: SQL + Site Worksheet Integration</text>
|
||||||
|
<text x="72" y="82" font-family="DejaVu Sans, Arial" font-size="15" fill="#475569">PNG version generated at /home/hyein/jh-mh/장헌산업/exports/work_data_erd.png</text>
|
||||||
|
<image href="work_data_erd.png" x="0" y="0" width="1900" height="1280" opacity="0"/>
|
||||||
|
<text x="70" y="150" font-family="DejaVu Sans, Arial" font-size="22" fill="#334155">Open the PNG file for the full ERD diagram.</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 706 B |
BIN
exports/work_data_erd_clean.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
exports/work_data_erd_columns.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
exports/work_data_erd_dark.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
exports/work_data_erd_people.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
exports/work_data_erd_project.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
exports/work_data_erd_unified_lanes.png
Normal file
|
After Width: | Height: | Size: 202 KiB |
1925
index.html
Normal file
BIN
jangheon_manhour_ERD_business_style.png
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
jangheon_manhour_ERD_clean.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
jangheon_manhour_ERD_coreleft.png
Normal file
|
After Width: | Height: | Size: 305 KiB |
146
jangheon_manhour_ERD_coreleft_relations.json
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
{
|
||||||
|
"left_core_tables": [
|
||||||
|
"dallyproject_tbl",
|
||||||
|
"member_tbl"
|
||||||
|
],
|
||||||
|
"right_tables": [
|
||||||
|
"dallyproject_2005_2015_tbl",
|
||||||
|
"dallyproject_2016_tbl",
|
||||||
|
"dallyproject_2017_tbl",
|
||||||
|
"dallyproject_2018_tbl",
|
||||||
|
"dallyproject_2019_tbl",
|
||||||
|
"dallyproject_2020_tbl",
|
||||||
|
"project_tbl",
|
||||||
|
"systemconfig_tbl",
|
||||||
|
"userstate_tbl",
|
||||||
|
"worker_tardy_tbl"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
{
|
||||||
|
"from": "dallyproject_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2020_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "worker_tardy_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2020_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "member_tbl",
|
||||||
|
"from_col": "RankCode",
|
||||||
|
"to": "systemconfig_tbl",
|
||||||
|
"to_col": "Code(PositionCode)",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "member_tbl",
|
||||||
|
"from_col": "GroupCode",
|
||||||
|
"to": "systemconfig_tbl",
|
||||||
|
"to_col": "Code(GroupCode*)",
|
||||||
|
"card": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "member_tbl",
|
||||||
|
"from_col": "WorkPosition",
|
||||||
|
"to": "systemconfig_tbl",
|
||||||
|
"to_col": "Code(WorkPositionCode)",
|
||||||
|
"card": "N:1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
145
jangheon_manhour_ERD_relations.json
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
{
|
||||||
|
"database": "jangheon_manhour",
|
||||||
|
"tables": [
|
||||||
|
"dallyproject_2005_2015_tbl",
|
||||||
|
"dallyproject_2016_tbl",
|
||||||
|
"dallyproject_2017_tbl",
|
||||||
|
"dallyproject_2018_tbl",
|
||||||
|
"dallyproject_2019_tbl",
|
||||||
|
"dallyproject_2020_tbl",
|
||||||
|
"dallyproject_tbl",
|
||||||
|
"member_tbl",
|
||||||
|
"project_tbl",
|
||||||
|
"systemconfig_tbl",
|
||||||
|
"userstate_tbl",
|
||||||
|
"worker_tardy_tbl"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to_table": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to_table": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to_table": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to_table": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to_table": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to_table": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2020_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to_table": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "worker_tardy_tbl",
|
||||||
|
"from_col": "MemberNo",
|
||||||
|
"to_table": "member_tbl",
|
||||||
|
"to_col": "MemberNo",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to_table": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to_table": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to_table": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to_table": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to_table": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to_table": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "dallyproject_2020_tbl",
|
||||||
|
"from_col": "EntryPCode",
|
||||||
|
"to_table": "project_tbl",
|
||||||
|
"to_col": "ProjectCode",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "member_tbl",
|
||||||
|
"from_col": "RankCode",
|
||||||
|
"to_table": "systemconfig_tbl",
|
||||||
|
"to_col": "Code (SysKey=PositionCode)",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "member_tbl",
|
||||||
|
"from_col": "GroupCode",
|
||||||
|
"to_table": "systemconfig_tbl",
|
||||||
|
"to_col": "Code (SysKey=GroupCode*)",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_table": "member_tbl",
|
||||||
|
"from_col": "WorkPosition",
|
||||||
|
"to_table": "systemconfig_tbl",
|
||||||
|
"to_col": "Code (SysKey=WorkPositionCode)",
|
||||||
|
"cardinality": "N:1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
jangheon_manhour_ERD_table.png
Normal file
|
After Width: | Height: | Size: 442 KiB |
340
jangheon_manhour_relationships.json
Normal file
@@ -0,0 +1,340 @@
|
|||||||
|
{
|
||||||
|
"tables": [
|
||||||
|
"dallyproject_2005_2015_tbl",
|
||||||
|
"dallyproject_2016_tbl",
|
||||||
|
"dallyproject_2017_tbl",
|
||||||
|
"dallyproject_2018_tbl",
|
||||||
|
"dallyproject_2019_tbl",
|
||||||
|
"dallyproject_2020_tbl",
|
||||||
|
"dallyproject_tbl",
|
||||||
|
"member_tbl",
|
||||||
|
"project_tbl",
|
||||||
|
"systemconfig_tbl",
|
||||||
|
"userstate_tbl",
|
||||||
|
"worker_tardy_tbl"
|
||||||
|
],
|
||||||
|
"relationships": [
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2016_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2017_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2018_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2019_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2020_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2005_2015_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2017_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2018_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2019_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2020_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2016_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2018_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2019_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2020_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2017_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2019_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2020_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2018_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_2020_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2019_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2020_tbl",
|
||||||
|
"from_col": "entryjobcode,entrypcode",
|
||||||
|
"to": "dallyproject_tbl",
|
||||||
|
"to_col": "entryjobcode,entrypcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2020_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2020_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_2020_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "member_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "dallyproject_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "member_tbl",
|
||||||
|
"from_col": "groupcode,memberno",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "groupcode,memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "member_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "project_tbl",
|
||||||
|
"from_col": "projectcode",
|
||||||
|
"to": "userstate_tbl",
|
||||||
|
"to_col": "projectcode",
|
||||||
|
"type": "INFERRED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "userstate_tbl",
|
||||||
|
"from_col": "memberno",
|
||||||
|
"to": "worker_tardy_tbl",
|
||||||
|
"to_col": "memberno",
|
||||||
|
"type": "INFERRED"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
jangheon_manhour_relationships.png
Normal file
|
After Width: | Height: | Size: 182 KiB |
62
key_usage_analysis.csv
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
table,column,keyflag,rows,distinct,empty,fill_rate,uniqueness,usage_score
|
||||||
|
userstate_tbl,num,PRI,14133,14133,0,1.0,1.0,1.0
|
||||||
|
project_tbl,ProjectCode,PRI,2149,2149,0,1.0,1.0,1.0
|
||||||
|
worker_tardy_tbl,row_num,PRI,233,233,0,1.0,1.0,1.0
|
||||||
|
member_tbl,MemberNo,PRI,320,319,0,1.0,0.9969,0.9984
|
||||||
|
member_tbl,korName,PRI,320,301,2,0.9938,0.9406,0.9672
|
||||||
|
dallyproject_tbl,EntryTime,PRI,73489,60540,0,1.0,0.8238,0.9119
|
||||||
|
dallyproject_2020_tbl,EntryTime,PRI,8732,7172,0,1.0,0.8213,0.9107
|
||||||
|
dallyproject_2019_tbl,EntryTime,PRI,8779,6747,0,1.0,0.7685,0.8843
|
||||||
|
dallyproject_2016_tbl,EntryTime,PRI,9359,7167,0,1.0,0.7658,0.8829
|
||||||
|
dallyproject_2018_tbl,EntryTime,PRI,9485,7219,0,1.0,0.7611,0.8805
|
||||||
|
dallyproject_2017_tbl,EntryTime,PRI,9177,6859,0,1.0,0.7474,0.8737
|
||||||
|
dallyproject_2005_2015_tbl,EntryTime,PRI,80964,57059,0,1.0,0.7047,0.8524
|
||||||
|
systemconfig_tbl,Code,-,676,352,0,1.0,0.5207,0.7604
|
||||||
|
worker_tardy_tbl,memberno,-,233,103,0,1.0,0.4421,0.721
|
||||||
|
project_tbl,mpCode,-,2149,884,355,0.8348,0.4114,0.6231
|
||||||
|
project_tbl,oldProjectCode,-,2149,906,669,0.6887,0.4216,0.5551
|
||||||
|
member_tbl,RankCode,-,320,22,0,1.0,0.0688,0.5344
|
||||||
|
userstate_tbl,ProjectCode,-,14133,604,15,0.9989,0.0427,0.5208
|
||||||
|
member_tbl,GroupCode,-,320,12,0,1.0,0.0375,0.5188
|
||||||
|
dallyproject_2016_tbl,EntryPCode,-,9359,214,17,0.9982,0.0229,0.5105
|
||||||
|
dallyproject_2017_tbl,EntryPCode,-,9177,195,8,0.9991,0.0212,0.5102
|
||||||
|
dallyproject_2020_tbl,EntryPCode,-,8732,176,3,0.9997,0.0202,0.5099
|
||||||
|
dallyproject_2019_tbl,EntryPCode,-,8779,153,2,0.9998,0.0174,0.5086
|
||||||
|
dallyproject_2018_tbl,EntryPCode,-,9485,166,10,0.9989,0.0175,0.5082
|
||||||
|
member_tbl,WorkPosition,-,320,4,0,1.0,0.0125,0.5062
|
||||||
|
dallyproject_tbl,EntryPCode,-,73489,854,35,0.9995,0.0116,0.5056
|
||||||
|
userstate_tbl,MemberNo,-,14133,109,0,1.0,0.0077,0.5039
|
||||||
|
dallyproject_2018_tbl,MemberNo,PRI,9485,58,1,0.9999,0.0061,0.503
|
||||||
|
dallyproject_2016_tbl,MemberNo,PRI,9359,55,1,0.9999,0.0059,0.5029
|
||||||
|
dallyproject_2019_tbl,MemberNo,PRI,8779,52,1,0.9999,0.0059,0.5029
|
||||||
|
dallyproject_2017_tbl,MemberNo,PRI,9177,53,1,0.9999,0.0058,0.5028
|
||||||
|
dallyproject_2005_2015_tbl,EntryPCode,-,80964,603,160,0.998,0.0074,0.5027
|
||||||
|
dallyproject_2020_tbl,MemberNo,PRI,8732,47,0,1.0,0.0054,0.5027
|
||||||
|
dallyproject_2019_tbl,EntryJobCode,-,8779,30,2,0.9998,0.0034,0.5016
|
||||||
|
dallyproject_2020_tbl,EntryJobCode,-,8732,32,4,0.9995,0.0037,0.5016
|
||||||
|
dallyproject_2016_tbl,EntryJobCode,-,9359,40,14,0.9985,0.0043,0.5014
|
||||||
|
dallyproject_2017_tbl,EntryJobCode,-,9177,33,9,0.999,0.0036,0.5013
|
||||||
|
dallyproject_2018_tbl,EntryJobCode,-,9485,33,11,0.9988,0.0035,0.5012
|
||||||
|
dallyproject_2005_2015_tbl,MemberNo,PRI,80964,149,36,0.9996,0.0018,0.5007
|
||||||
|
dallyproject_tbl,MemberNo,PRI,73489,96,6,0.9999,0.0013,0.5006
|
||||||
|
userstate_tbl,GroupCode,-,14133,10,0,1.0,0.0007,0.5004
|
||||||
|
dallyproject_tbl,EntryJobCode,-,73489,49,57,0.9992,0.0007,0.4999
|
||||||
|
dallyproject_2005_2015_tbl,EntryJobCode,-,80964,124,743,0.9908,0.0015,0.4962
|
||||||
|
dallyproject_2020_tbl,LeavePCode,-,8732,168,1486,0.8298,0.0192,0.4245
|
||||||
|
dallyproject_2016_tbl,LeavePCode,-,9359,206,1643,0.8244,0.022,0.4232
|
||||||
|
dallyproject_2020_tbl,LeaveJobCode,-,8732,32,1488,0.8296,0.0037,0.4166
|
||||||
|
dallyproject_2019_tbl,LeavePCode,-,8779,149,1621,0.8154,0.017,0.4162
|
||||||
|
dallyproject_2017_tbl,LeavePCode,-,9177,189,1748,0.8095,0.0206,0.4151
|
||||||
|
dallyproject_tbl,LeavePCode,-,73489,861,13412,0.8175,0.0117,0.4146
|
||||||
|
dallyproject_2016_tbl,LeaveJobCode,-,9359,36,1640,0.8248,0.0038,0.4143
|
||||||
|
dallyproject_2019_tbl,LeaveJobCode,-,8779,29,1622,0.8152,0.0033,0.4093
|
||||||
|
dallyproject_tbl,LeaveJobCode,-,73489,44,13500,0.8163,0.0006,0.4084
|
||||||
|
dallyproject_2005_2015_tbl,LeavePCode,-,80964,594,15683,0.8063,0.0073,0.4068
|
||||||
|
dallyproject_2017_tbl,LeaveJobCode,-,9177,31,1749,0.8094,0.0034,0.4064
|
||||||
|
dallyproject_2018_tbl,LeavePCode,-,9485,162,2057,0.7831,0.0171,0.4001
|
||||||
|
dallyproject_2018_tbl,LeaveJobCode,-,9485,33,2062,0.7826,0.0035,0.393
|
||||||
|
dallyproject_2005_2015_tbl,LeaveJobCode,-,80964,112,22652,0.7202,0.0014,0.3608
|
||||||
|
project_tbl,OrderCompanyCode,-,2149,12,1256,0.4155,0.0056,0.2106
|
||||||
|
systemconfig_tbl,orderno,-,676,50,555,0.179,0.074,0.1265
|
||||||
|
userstate_tbl,sub_code,-,14133,449,12614,0.1075,0.0318,0.0696
|
||||||
|
userstate_tbl,active_code,-,14133,34,13939,0.0137,0.0024,0.0081
|
||||||
|
BIN
key_usage_analysis_chart.png
Normal file
|
After Width: | Height: | Size: 251 KiB |
BIN
matching.db
Normal file
270
member_match_page.html
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="ko">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>MemberNo - korName 매칭</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg: #f5f7fb;
|
||||||
|
--card: #ffffff;
|
||||||
|
--text: #18212f;
|
||||||
|
--muted: #546174;
|
||||||
|
--line: #d8dee8;
|
||||||
|
--brand: #1f6feb;
|
||||||
|
}
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
background: linear-gradient(180deg, #eef3ff 0%, var(--bg) 35%);
|
||||||
|
color: var(--text);
|
||||||
|
font-family: "Noto Sans KR", "Malgun Gothic", sans-serif;
|
||||||
|
}
|
||||||
|
.wrap {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 32px auto;
|
||||||
|
padding: 0 16px;
|
||||||
|
}
|
||||||
|
.card {
|
||||||
|
background: var(--card);
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 18px;
|
||||||
|
box-shadow: 0 8px 20px rgba(24, 33, 47, 0.06);
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
h1 { margin: 0 0 10px; font-size: 24px; }
|
||||||
|
p { margin: 8px 0; color: var(--muted); }
|
||||||
|
.row { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; }
|
||||||
|
.filebox { display: flex; flex-direction: column; gap: 6px; min-width: 280px; }
|
||||||
|
label { font-weight: 700; }
|
||||||
|
input[type="file"] { padding: 8px; border: 1px solid var(--line); border-radius: 8px; background: #fff; }
|
||||||
|
button {
|
||||||
|
border: 0;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 10px 14px;
|
||||||
|
font-weight: 700;
|
||||||
|
cursor: pointer;
|
||||||
|
background: var(--brand);
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
button:disabled { background: #8caee8; cursor: not-allowed; }
|
||||||
|
.ghost { background: #eef4ff; color: #204f9c; border: 1px solid #c9daf9; }
|
||||||
|
.stats { display: flex; gap: 10px; flex-wrap: wrap; }
|
||||||
|
.pill { background: #f4f7ff; border: 1px solid #d7e2ff; border-radius: 999px; padding: 6px 10px; font-size: 13px; }
|
||||||
|
.table-wrap { overflow: auto; border: 1px solid var(--line); border-radius: 8px; }
|
||||||
|
table { width: 100%; border-collapse: collapse; font-size: 13px; }
|
||||||
|
th, td { border-bottom: 1px solid #ecf0f6; padding: 8px; text-align: left; white-space: nowrap; }
|
||||||
|
th { position: sticky; top: 0; background: #f9fbff; }
|
||||||
|
.warn { color: #ac3d00; font-weight: 700; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="card">
|
||||||
|
<h1>MemberNo → korName 매칭 페이지</h1>
|
||||||
|
<p>`dallyproject.csv`의 `MemberNo`를 `member.csv`의 `MemberNo`와 매치해서 `korName`을 붙입니다.</p>
|
||||||
|
<p>인코딩이 깨질 경우를 대비해 <b>UTF-8 / EUC-KR(CP949)</b> 자동 시도 후, 실패 시 수동 선택도 지원합니다.</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="filebox">
|
||||||
|
<label for="dailyFile">1) dallyproject.csv</label>
|
||||||
|
<input id="dailyFile" type="file" accept=".csv,text/csv" />
|
||||||
|
</div>
|
||||||
|
<div class="filebox">
|
||||||
|
<label for="memberFile">2) member.csv</label>
|
||||||
|
<input id="memberFile" type="file" accept=".csv,text/csv" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row" style="margin-top: 10px;">
|
||||||
|
<button id="runBtn">매칭 실행</button>
|
||||||
|
<button id="downloadBtn" class="ghost" disabled>결과 CSV 다운로드</button>
|
||||||
|
<select id="encodingSelect" class="ghost" style="padding:10px; border-radius:8px;">
|
||||||
|
<option value="auto">인코딩 자동</option>
|
||||||
|
<option value="utf-8">UTF-8</option>
|
||||||
|
<option value="euc-kr">EUC-KR (CP949)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card">
|
||||||
|
<div class="stats" id="stats"></div>
|
||||||
|
<p id="status">파일을 선택한 뒤 매칭을 실행하세요.</p>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table id="resultTable"></table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const dailyFileEl = document.getElementById('dailyFile');
|
||||||
|
const memberFileEl = document.getElementById('memberFile');
|
||||||
|
const runBtn = document.getElementById('runBtn');
|
||||||
|
const downloadBtn = document.getElementById('downloadBtn');
|
||||||
|
const tableEl = document.getElementById('resultTable');
|
||||||
|
const statusEl = document.getElementById('status');
|
||||||
|
const statsEl = document.getElementById('stats');
|
||||||
|
const encodingEl = document.getElementById('encodingSelect');
|
||||||
|
|
||||||
|
let mergedRows = [];
|
||||||
|
let mergedHeaders = [];
|
||||||
|
|
||||||
|
function normalizeHeader(h) {
|
||||||
|
return (h || '').replace(/^\uFEFF/, '').trim().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function splitCsvLine(line) {
|
||||||
|
const out = [];
|
||||||
|
let cur = '';
|
||||||
|
let q = false;
|
||||||
|
for (let i = 0; i < line.length; i++) {
|
||||||
|
const c = line[i];
|
||||||
|
if (c === '"') {
|
||||||
|
if (q && line[i + 1] === '"') { cur += '"'; i++; }
|
||||||
|
else q = !q;
|
||||||
|
} else if (c === ',' && !q) {
|
||||||
|
out.push(cur);
|
||||||
|
cur = '';
|
||||||
|
} else {
|
||||||
|
cur += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.push(cur);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseCsv(text) {
|
||||||
|
const lines = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n').split('\n').filter(Boolean);
|
||||||
|
if (!lines.length) return { headers: [], rows: [] };
|
||||||
|
const headers = splitCsvLine(lines[0]).map(h => h.trim());
|
||||||
|
const rows = [];
|
||||||
|
for (let i = 1; i < lines.length; i++) {
|
||||||
|
const vals = splitCsvLine(lines[i]);
|
||||||
|
const row = {};
|
||||||
|
headers.forEach((h, idx) => row[h] = vals[idx] ?? '');
|
||||||
|
rows.push(row);
|
||||||
|
}
|
||||||
|
return { headers, rows };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function readFileText(file, encodingMode) {
|
||||||
|
const ab = await file.arrayBuffer();
|
||||||
|
if (encodingMode !== 'auto') {
|
||||||
|
return new TextDecoder(encodingMode).decode(ab);
|
||||||
|
}
|
||||||
|
const utf8 = new TextDecoder('utf-8').decode(ab);
|
||||||
|
const sample = utf8.slice(0, 2000);
|
||||||
|
const badScore = (sample.match(/<2F>/g) || []).length;
|
||||||
|
if (badScore > 3) {
|
||||||
|
try {
|
||||||
|
return new TextDecoder('euc-kr').decode(ab);
|
||||||
|
} catch {
|
||||||
|
return utf8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return utf8;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toCsv(rows, headers) {
|
||||||
|
const esc = (v) => {
|
||||||
|
const s = String(v ?? '');
|
||||||
|
if (/[",\n]/.test(s)) return '"' + s.replace(/"/g, '""') + '"';
|
||||||
|
return s;
|
||||||
|
};
|
||||||
|
const lines = [headers.map(esc).join(',')];
|
||||||
|
for (const r of rows) lines.push(headers.map(h => esc(r[h])).join(','));
|
||||||
|
return lines.join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderTable(headers, rows) {
|
||||||
|
if (!headers.length) {
|
||||||
|
tableEl.innerHTML = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const head = '<thead><tr>' + headers.map(h => `<th>${h}</th>`).join('') + '</tr></thead>';
|
||||||
|
const bodyRows = rows.slice(0, 500).map(r => '<tr>' + headers.map(h => `<td>${(r[h] ?? '').toString().replace(/</g, '<')}</td>`).join('') + '</tr>').join('');
|
||||||
|
tableEl.innerHTML = head + '<tbody>' + bodyRows + '</tbody>';
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderStats(total, matched, unmatched) {
|
||||||
|
statsEl.innerHTML = `
|
||||||
|
<span class="pill">전체 행: ${total.toLocaleString()}</span>
|
||||||
|
<span class="pill">매칭 성공: ${matched.toLocaleString()}</span>
|
||||||
|
<span class="pill">매칭 실패: ${unmatched.toLocaleString()}</span>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
runBtn.addEventListener('click', async () => {
|
||||||
|
const dailyFile = dailyFileEl.files[0];
|
||||||
|
const memberFile = memberFileEl.files[0];
|
||||||
|
if (!dailyFile || !memberFile) {
|
||||||
|
statusEl.innerHTML = '<span class="warn">두 파일을 모두 선택해 주세요.</span>';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
runBtn.disabled = true;
|
||||||
|
downloadBtn.disabled = true;
|
||||||
|
statusEl.textContent = 'CSV 읽는 중...';
|
||||||
|
|
||||||
|
try {
|
||||||
|
const mode = encodingEl.value;
|
||||||
|
const [dailyText, memberText] = await Promise.all([
|
||||||
|
readFileText(dailyFile, mode),
|
||||||
|
readFileText(memberFile, mode)
|
||||||
|
]);
|
||||||
|
|
||||||
|
const daily = parseCsv(dailyText);
|
||||||
|
const member = parseCsv(memberText);
|
||||||
|
|
||||||
|
const dailyMemberNo = daily.headers.find(h => normalizeHeader(h) === 'memberno');
|
||||||
|
const memberMemberNo = member.headers.find(h => normalizeHeader(h) === 'memberno');
|
||||||
|
const korNameHeader = member.headers.find(h => normalizeHeader(h) === 'korname');
|
||||||
|
|
||||||
|
if (!dailyMemberNo || !memberMemberNo || !korNameHeader) {
|
||||||
|
throw new Error('필수 컬럼(MemberNo, korName)을 찾을 수 없습니다. 헤더를 확인해 주세요.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const memberMap = new Map();
|
||||||
|
for (const r of member.rows) {
|
||||||
|
const key = (r[memberMemberNo] || '').trim();
|
||||||
|
if (!key) continue;
|
||||||
|
if (!memberMap.has(key)) memberMap.set(key, r[korNameHeader] || '');
|
||||||
|
}
|
||||||
|
|
||||||
|
let matched = 0;
|
||||||
|
mergedRows = daily.rows.map(r => {
|
||||||
|
const key = (r[dailyMemberNo] || '').trim();
|
||||||
|
const name = memberMap.get(key) || '';
|
||||||
|
if (name) matched++;
|
||||||
|
return { ...r, korName: name };
|
||||||
|
});
|
||||||
|
mergedHeaders = [...daily.headers, 'korName'];
|
||||||
|
|
||||||
|
renderStats(mergedRows.length, matched, mergedRows.length - matched);
|
||||||
|
renderTable(mergedHeaders, mergedRows);
|
||||||
|
|
||||||
|
statusEl.textContent = `완료: ${mergedRows.length.toLocaleString()}건 처리 (표는 500행만 미리보기)`;
|
||||||
|
downloadBtn.disabled = false;
|
||||||
|
} catch (err) {
|
||||||
|
statusEl.innerHTML = `<span class="warn">오류: ${err.message}</span>`;
|
||||||
|
} finally {
|
||||||
|
runBtn.disabled = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
downloadBtn.addEventListener('click', () => {
|
||||||
|
const csv = toCsv(mergedRows, mergedHeaders);
|
||||||
|
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
const a = document.createElement('a');
|
||||||
|
a.href = url;
|
||||||
|
a.download = 'dallyproject_with_korname.csv';
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
a.remove();
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
109
mysql-preview.html
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="ko">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>MySQL 데이터 미리보기</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg: #f5f7fb;
|
||||||
|
--card: #ffffff;
|
||||||
|
--line: #d6deea;
|
||||||
|
--text: #1f2a44;
|
||||||
|
--accent: #0d9488;
|
||||||
|
}
|
||||||
|
body { margin: 0; font-family: "Noto Sans KR", sans-serif; color: var(--text); background: linear-gradient(180deg, #eef4ff, var(--bg)); }
|
||||||
|
.wrap { max-width: 1200px; margin: 24px auto; padding: 0 16px; }
|
||||||
|
.card { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 16px; }
|
||||||
|
.row { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
|
||||||
|
select, input, button { padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; font-size: 14px; }
|
||||||
|
button { background: var(--accent); color: #fff; border: 0; cursor: pointer; }
|
||||||
|
button:hover { filter: brightness(0.95); }
|
||||||
|
.meta { margin: 10px 0; font-size: 13px; color: #475569; }
|
||||||
|
.table-wrap { overflow: auto; border: 1px solid var(--line); border-radius: 10px; }
|
||||||
|
table { border-collapse: collapse; width: 100%; min-width: 900px; background: #fff; }
|
||||||
|
th, td { border-bottom: 1px solid #ebf0f8; padding: 7px 9px; font-size: 13px; text-align: left; white-space: nowrap; }
|
||||||
|
th { position: sticky; top: 0; background: #f8fbff; z-index: 1; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="card">
|
||||||
|
<h2 style="margin-top:0;">MySQL 데이터 미리보기</h2>
|
||||||
|
<div class="row">
|
||||||
|
<button id="btnLoadTables">테이블 목록 불러오기</button>
|
||||||
|
<select id="tableSelect"><option value="">테이블 선택</option></select>
|
||||||
|
<input id="limitInput" type="number" min="1" max="500" value="100">
|
||||||
|
<button id="btnLoadRows">데이터 조회</button>
|
||||||
|
</div>
|
||||||
|
<div id="meta" class="meta">대기 중</div>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table id="resultTable">
|
||||||
|
<thead></thead>
|
||||||
|
<tbody></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
const tableSelect = document.getElementById('tableSelect');
|
||||||
|
const limitInput = document.getElementById('limitInput');
|
||||||
|
const meta = document.getElementById('meta');
|
||||||
|
const thead = document.querySelector('#resultTable thead');
|
||||||
|
const tbody = document.querySelector('#resultTable tbody');
|
||||||
|
|
||||||
|
function setMeta(text) { meta.textContent = text; }
|
||||||
|
|
||||||
|
async function loadTables() {
|
||||||
|
setMeta('테이블 목록 조회 중...');
|
||||||
|
const res = await fetch('/api/mysql-tables');
|
||||||
|
const data = await res.json();
|
||||||
|
tableSelect.innerHTML = '<option value="">테이블 선택</option>';
|
||||||
|
(data.tables || []).forEach((t) => {
|
||||||
|
const opt = document.createElement('option');
|
||||||
|
opt.value = t;
|
||||||
|
opt.textContent = t;
|
||||||
|
tableSelect.appendChild(opt);
|
||||||
|
});
|
||||||
|
setMeta(`테이블 ${data.count || 0}개 로드 완료`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadRows() {
|
||||||
|
const table = tableSelect.value;
|
||||||
|
const limit = Number(limitInput.value || 100);
|
||||||
|
if (!table) return setMeta('테이블을 먼저 선택하세요.');
|
||||||
|
setMeta(`${table} 조회 중...`);
|
||||||
|
const res = await fetch(`/api/mysql-table-preview?table=${encodeURIComponent(table)}&limit=${encodeURIComponent(limit)}`);
|
||||||
|
const data = await res.json();
|
||||||
|
renderRows(data.rows || []);
|
||||||
|
setMeta(`${data.table} - ${data.count || 0}건`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderRows(rows) {
|
||||||
|
thead.innerHTML = '';
|
||||||
|
tbody.innerHTML = '';
|
||||||
|
if (!rows.length) return;
|
||||||
|
const cols = Object.keys(rows[0]);
|
||||||
|
const trh = document.createElement('tr');
|
||||||
|
cols.forEach((c) => {
|
||||||
|
const th = document.createElement('th');
|
||||||
|
th.textContent = c;
|
||||||
|
trh.appendChild(th);
|
||||||
|
});
|
||||||
|
thead.appendChild(trh);
|
||||||
|
rows.forEach((r) => {
|
||||||
|
const tr = document.createElement('tr');
|
||||||
|
cols.forEach((c) => {
|
||||||
|
const td = document.createElement('td');
|
||||||
|
td.textContent = r[c] == null ? '' : String(r[c]);
|
||||||
|
tr.appendChild(td);
|
||||||
|
});
|
||||||
|
tbody.appendChild(tr);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('btnLoadTables').addEventListener('click', loadTables);
|
||||||
|
document.getElementById('btnLoadRows').addEventListener('click', loadRows);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
4200
mysql_preview_server.py
Normal file
1146
people-unified.html
Normal file
1253
project-codes.html
Normal file
33
project_code_viewer_server.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import os
|
||||||
|
import sqlite3
|
||||||
|
from http.server import ThreadingHTTPServer
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
|
import mysql_preview_server as base
|
||||||
|
|
||||||
|
|
||||||
|
class ProjectCodeViewerHandler(base.Handler):
|
||||||
|
def do_GET(self):
|
||||||
|
parsed = urlparse(self.path)
|
||||||
|
if parsed.path == '/':
|
||||||
|
return self._html(base.PROJECT_CODES_HTML)
|
||||||
|
return super().do_GET()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
os.makedirs(base.BASE_DIR, exist_ok=True)
|
||||||
|
try:
|
||||||
|
with sqlite3.connect(base.DB_PATH, timeout=30) as conn:
|
||||||
|
base.init_db(conn)
|
||||||
|
except sqlite3.OperationalError as error:
|
||||||
|
if 'locked' in str(error).lower():
|
||||||
|
print(f'Skip startup DB init because database is locked: {error}')
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
port = int(os.environ.get('PORT', '8092'))
|
||||||
|
host = '0.0.0.0'
|
||||||
|
print(f'Server running: http://{base.local_ip()}:{port}')
|
||||||
|
print(f'Local access: http://127.0.0.1:{port}')
|
||||||
|
print('Tip: root path serves the project code viewer page.')
|
||||||
|
ThreadingHTTPServer((host, port), ProjectCodeViewerHandler).serve_forever()
|
||||||
2
requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
requests>=2.31.0
|
||||||
|
PyMySQL>=1.1.0
|
||||||