From cda5f9591e1e5a46bf27b9e8692d553496195da3 Mon Sep 17 00:00:00 2001 From: accura0117 Date: Mon, 30 Mar 2026 20:50:23 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20React=2018=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=EC=97=94=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - wtm-frontend → wtm-frontend-vue 이름 변경 - wtm-frontend-react 추가 (React 18 + PrimeReact + Zustand) - 동일한 모듈 구조 및 API 연동 (Vue 버전과 기능 동일) - Vue:5173 / React:5174 포트 분리 - 개발자 가이드에 React 프론트엔드 안내 추가 - .gitignore: Claude/OMC, 문서 생성 스크립트, package-lock 제외 - 불필요 파일 git 추적 제거 (.omc, generate_*.py, regenerate_*.py) Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 12 +- ...6666f085-e1ae-4dd4-86ee-7f7d5466a239.jsonl | 12 - .../.omc/state/subagent-tracking.json | 62 - .../libs/wbx-spring-core-1.0.0-SNAPSHOT.jar | Bin 201466 -> 204537 bytes ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../resources/main/application-example.yml | 9 +- .../build/resources/main/application-test.yml | 5 - .../stash-dir/AdminController.class.uniqueId1 | Bin 9459 -> 0 bytes .../AdminLoginController.class.uniqueId3 | Bin 640 -> 0 bytes .../AdminUserDetailsService.class.uniqueId4 | Bin 3267 -> 0 bytes .../AdminViewController.class.uniqueId2 | Bin 22170 -> 0 bytes .../SecurityAutoConfig.class.uniqueId0 | Bin 9318 -> 0 bytes .../compileJava/previous-compilation-data.bin | Bin 112961 -> 253881 bytes .../docs/generate_system_design.py | 838 ---- wbx-spring-core/docs/regenerate_pdfs.py | 372 -- .../docs/개발환경_사전설치_가이드.txt | 70 +- {wtm-frontend => wtm-frontend-react}/.env | 0 .../.env.development | 0 .../.env.production | 0 wtm-frontend-react/index.html | 13 + wtm-frontend-react/package.json | 38 + wtm-frontend-react/src/app/App.tsx | 6 + wtm-frontend-react/src/app/main.tsx | 21 + wtm-frontend-react/src/app/router.tsx | 68 + .../src/assets/images/logo.svg | 0 .../src/assets/styles/_form-grid.scss | 0 .../src/assets/styles/_overrides.scss | 1 + .../src/assets/styles/_variables.scss | 53 + .../src/assets/styles/main.scss | 0 .../src/core/api/api.types.ts | 0 wtm-frontend-react/src/core/api/axios.ts | 63 + .../src/core/auth/auth.service.ts | 0 .../src/core/auth/auth.types.ts | 0 .../src/core/components/AppLayout.scss | 31 + .../src/core/components/AppLayout.tsx | 73 + .../src/core/components/AppSidebar.scss | 62 + .../src/core/components/AppSidebar.tsx | 60 + .../src/core/components/AppTopbar.scss | 39 + .../src/core/components/AppTopbar.tsx | 47 + .../src/core/components/AuthGuard.tsx | 37 + .../src/core/components/BaseCrudTable.scss | 36 + .../src/core/components/BaseCrudTable.tsx | 91 + .../src/core/components/BaseFormDialog.scss | 15 + .../src/core/components/BaseFormDialog.tsx | 50 + .../src/core/components/BasePageHeader.scss | 37 + .../src/core/components/BasePageHeader.tsx | 20 + .../src/core/components/NotFoundView.tsx | 11 + .../src/core/constants/app.constants.ts | 151 + .../src/core/hooks/useCurrentUser.ts | 16 + .../src/modules/approval/approval.service.ts | 14 + .../src/modules/approval/approval.types.ts | 25 + .../approval/views/ApprovalHistoryView.tsx | 54 + .../approval/views/ApprovalPendingView.tsx | 72 + .../src/modules/auth/auth.service.ts | 0 .../src/modules/auth/auth.store.ts | 64 + .../src/modules/auth/auth.types.ts | 0 .../modules/auth/views/ChangePasswordView.tsx | 66 + .../modules/auth/views/ForgotPasswordView.tsx | 11 + .../src/modules/auth/views/LoginView.scss | 64 + .../src/modules/auth/views/LoginView.tsx | 86 + .../modules/dashboard/dashboard.service.ts | 8 + .../src/modules/dashboard/dashboard.types.ts | 6 + .../dashboard/views/DashboardView.scss | 83 + .../modules/dashboard/views/DashboardView.tsx | 123 + .../project/components/ProjectFormDialog.tsx | 81 + .../src/modules/project/project.service.ts | 13 + .../src/modules/project/project.types.ts | 12 + .../project/views/ProjectDetailView.tsx | 13 + .../modules/project/views/ProjectListView.tsx | 69 + .../src/modules/report/report.service.ts | 12 + .../src/modules/report/report.types.ts | 7 + .../src/modules/report/views/ReportView.tsx | 124 + .../components/OverheadTypeDialog.tsx | 57 + .../src/modules/settings/settings.service.ts | 11 + .../src/modules/settings/settings.types.ts | 13 + .../modules/settings/views/SettingsView.tsx | 104 + .../teal/components/TealUploadDialog.tsx | 43 + .../src/modules/teal/teal.service.ts | 13 + .../src/modules/teal/teal.types.ts | 16 + .../src/modules/teal/views/TealListView.tsx | 73 + .../components/TimesheetEntryRow.tsx | 91 + .../modules/timesheet/timesheet.service.ts | 18 + .../src/modules/timesheet/timesheet.types.ts | 26 + .../timesheet/views/TimesheetHistoryView.tsx | 56 + .../timesheet/views/TimesheetUploadView.tsx | 13 + .../timesheet/views/TimesheetWeekView.scss | 60 + .../timesheet/views/TimesheetWeekView.tsx | 253 ++ .../user/components/UserFormDialog.tsx | 94 + .../src/modules/user/user.service.ts | 21 + .../src/modules/user/user.types.ts | 12 + .../src/modules/user/views/UserDetailView.tsx | 13 + .../src/modules/user/views/UserListView.tsx | 69 + .../wbs/components/WbsUploadDialog.tsx | 43 + .../src/modules/wbs/views/WbsTreeView.tsx | 87 + .../src/modules/wbs/wbs.service.ts | 15 + .../src/modules/wbs/wbs.types.ts | 17 + wtm-frontend-react/src/vite-env.d.ts | 11 + wtm-frontend-react/tsconfig.app.json | 25 + wtm-frontend-react/tsconfig.app.tsbuildinfo | 1 + .../tsconfig.json | 0 wtm-frontend-react/tsconfig.node.json | 18 + wtm-frontend-react/tsconfig.node.tsbuildinfo | 1 + wtm-frontend-react/vite.config.ts | 32 + wtm-frontend-vue/.env | 1 + wtm-frontend-vue/.env.development | 2 + wtm-frontend-vue/.env.production | 2 + {wtm-frontend => wtm-frontend-vue}/.gitignore | 0 .../.prettierrc.json | 0 {wtm-frontend => wtm-frontend-vue}/README.md | 0 .../eslint.config.js | 0 {wtm-frontend => wtm-frontend-vue}/index.html | 2 +- .../package.json | 2 +- .../public/favicon.svg | 0 .../public/icons.svg | 0 .../src/app/App.vue | 0 .../src/app/main.ts | 0 .../src/app/plugins/primevue.ts | 0 .../src/app/router.ts | 0 .../src/assets/hero.png | Bin wtm-frontend-vue/src/assets/images/logo.svg | 4 + .../src/assets/styles/_form-grid.scss | 49 + .../src/assets/styles/_overrides.scss | 0 .../src/assets/styles/_variables.scss | 0 wtm-frontend-vue/src/assets/styles/main.scss | 39 + .../src/assets/vite.svg | 0 .../src/assets/vue.svg | 0 wtm-frontend-vue/src/core/api/api.types.ts | 13 + .../src/core/api/axios.ts | 0 .../src/core/auth/auth.guard.ts | 0 .../src/core/auth/auth.service.ts | 43 + wtm-frontend-vue/src/core/auth/auth.types.ts | 20 + .../src/core/components/AppLayout.vue | 0 .../src/core/components/AppSidebar.vue | 0 .../src/core/components/AppTopbar.vue | 0 .../src/core/components/BaseCrudTable.vue | 0 .../src/core/components/BaseFormDialog.vue | 0 .../src/core/components/BasePageHeader.vue | 0 .../src/core/components/NotFoundView.vue | 0 .../src/core/composables/useCurrentUser.ts | 0 .../src/core/constants/app.constants.ts | 0 .../src/env.d.ts | 0 .../src/modules/approval/approval.routes.ts | 0 .../src/modules/approval/approval.service.ts | 0 .../src/modules/approval/approval.store.ts | 0 .../src/modules/approval/approval.types.ts | 0 .../components/ApprovalDetailDialog.vue | 0 .../approval/views/ApprovalHistoryView.vue | 0 .../approval/views/ApprovalPendingView.vue | 0 .../src/modules/auth/auth.routes.ts | 0 .../src/modules/auth/auth.service.ts | 14 + .../src/modules/auth/auth.store.ts | 0 .../src/modules/auth/auth.types.ts | 1 + .../modules/auth/views/ChangePasswordView.vue | 0 .../modules/auth/views/ForgotPasswordView.vue | 0 .../src/modules/auth/views/LoginView.vue | 0 .../src/modules/dashboard/dashboard.routes.ts | 0 .../modules/dashboard/dashboard.service.ts | 0 .../src/modules/dashboard/dashboard.store.ts | 0 .../src/modules/dashboard/dashboard.types.ts | 0 .../modules/dashboard/views/DashboardView.vue | 0 .../project/components/ProjectFormDialog.vue | 0 .../src/modules/project/project.routes.ts | 0 .../src/modules/project/project.service.ts | 0 .../src/modules/project/project.store.ts | 0 .../src/modules/project/project.types.ts | 0 .../project/views/ProjectDetailView.vue | 0 .../modules/project/views/ProjectListView.vue | 0 .../src/modules/report/report.routes.ts | 0 .../src/modules/report/report.service.ts | 0 .../src/modules/report/report.store.ts | 0 .../src/modules/report/report.types.ts | 0 .../src/modules/report/views/ReportView.vue | 0 .../components/OverheadTypeDialog.vue | 0 .../src/modules/settings/settings.routes.ts | 0 .../src/modules/settings/settings.service.ts | 0 .../src/modules/settings/settings.store.ts | 0 .../src/modules/settings/settings.types.ts | 0 .../modules/settings/views/SettingsView.vue | 0 .../teal/components/TealUploadDialog.vue | 0 .../teal/components/TealVersionSelect.vue | 0 .../src/modules/teal/teal.routes.ts | 0 .../src/modules/teal/teal.service.ts | 0 .../src/modules/teal/teal.store.ts | 0 .../src/modules/teal/teal.types.ts | 0 .../src/modules/teal/views/TealListView.vue | 0 .../components/TimesheetEntryRow.vue | 0 .../src/modules/timesheet/timesheet.routes.ts | 0 .../modules/timesheet/timesheet.service.ts | 0 .../src/modules/timesheet/timesheet.store.ts | 0 .../src/modules/timesheet/timesheet.types.ts | 0 .../timesheet/views/TimesheetHistoryView.vue | 0 .../timesheet/views/TimesheetUploadView.vue | 0 .../timesheet/views/TimesheetWeekView.vue | 0 .../user/components/UserFormDialog.vue | 0 .../src/modules/user/user.routes.ts | 0 .../src/modules/user/user.service.ts | 0 .../src/modules/user/user.store.ts | 0 .../src/modules/user/user.types.ts | 0 .../src/modules/user/views/UserDetailView.vue | 0 .../src/modules/user/views/UserListView.vue | 0 .../wbs/components/WbsUploadDialog.vue | 0 .../wbs/components/WbsVersionSelect.vue | 0 .../src/modules/wbs/views/WbsTreeView.vue | 0 .../src/modules/wbs/wbs.routes.ts | 0 .../src/modules/wbs/wbs.service.ts | 0 .../src/modules/wbs/wbs.store.ts | 0 .../src/modules/wbs/wbs.types.ts | 0 .../tsconfig.app.json | 0 wtm-frontend-vue/tsconfig.json | 7 + .../tsconfig.node.json | 0 .../vite.config.ts | 0 wtm-frontend/package-lock.json | 3944 ----------------- 212 files changed, 3633 insertions(+), 5244 deletions(-) delete mode 100644 wbx-spring-core/.omc/state/agent-replay-6666f085-e1ae-4dd4-86ee-7f7d5466a239.jsonl delete mode 100644 wbx-spring-core/.omc/state/subagent-tracking.json delete mode 100644 wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/AdminController.class.uniqueId1 delete mode 100644 wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/AdminLoginController.class.uniqueId3 delete mode 100644 wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/AdminUserDetailsService.class.uniqueId4 delete mode 100644 wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/AdminViewController.class.uniqueId2 delete mode 100644 wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/SecurityAutoConfig.class.uniqueId0 delete mode 100644 wbx-spring-core/docs/generate_system_design.py delete mode 100644 wbx-spring-core/docs/regenerate_pdfs.py rename {wtm-frontend => wtm-frontend-react}/.env (100%) rename {wtm-frontend => wtm-frontend-react}/.env.development (100%) rename {wtm-frontend => wtm-frontend-react}/.env.production (100%) create mode 100644 wtm-frontend-react/index.html create mode 100644 wtm-frontend-react/package.json create mode 100644 wtm-frontend-react/src/app/App.tsx create mode 100644 wtm-frontend-react/src/app/main.tsx create mode 100644 wtm-frontend-react/src/app/router.tsx rename {wtm-frontend => wtm-frontend-react}/src/assets/images/logo.svg (100%) rename {wtm-frontend => wtm-frontend-react}/src/assets/styles/_form-grid.scss (100%) create mode 100644 wtm-frontend-react/src/assets/styles/_overrides.scss create mode 100644 wtm-frontend-react/src/assets/styles/_variables.scss rename {wtm-frontend => wtm-frontend-react}/src/assets/styles/main.scss (100%) rename {wtm-frontend => wtm-frontend-react}/src/core/api/api.types.ts (100%) create mode 100644 wtm-frontend-react/src/core/api/axios.ts rename {wtm-frontend => wtm-frontend-react}/src/core/auth/auth.service.ts (100%) rename {wtm-frontend => wtm-frontend-react}/src/core/auth/auth.types.ts (100%) create mode 100644 wtm-frontend-react/src/core/components/AppLayout.scss create mode 100644 wtm-frontend-react/src/core/components/AppLayout.tsx create mode 100644 wtm-frontend-react/src/core/components/AppSidebar.scss create mode 100644 wtm-frontend-react/src/core/components/AppSidebar.tsx create mode 100644 wtm-frontend-react/src/core/components/AppTopbar.scss create mode 100644 wtm-frontend-react/src/core/components/AppTopbar.tsx create mode 100644 wtm-frontend-react/src/core/components/AuthGuard.tsx create mode 100644 wtm-frontend-react/src/core/components/BaseCrudTable.scss create mode 100644 wtm-frontend-react/src/core/components/BaseCrudTable.tsx create mode 100644 wtm-frontend-react/src/core/components/BaseFormDialog.scss create mode 100644 wtm-frontend-react/src/core/components/BaseFormDialog.tsx create mode 100644 wtm-frontend-react/src/core/components/BasePageHeader.scss create mode 100644 wtm-frontend-react/src/core/components/BasePageHeader.tsx create mode 100644 wtm-frontend-react/src/core/components/NotFoundView.tsx create mode 100644 wtm-frontend-react/src/core/constants/app.constants.ts create mode 100644 wtm-frontend-react/src/core/hooks/useCurrentUser.ts create mode 100644 wtm-frontend-react/src/modules/approval/approval.service.ts create mode 100644 wtm-frontend-react/src/modules/approval/approval.types.ts create mode 100644 wtm-frontend-react/src/modules/approval/views/ApprovalHistoryView.tsx create mode 100644 wtm-frontend-react/src/modules/approval/views/ApprovalPendingView.tsx rename {wtm-frontend => wtm-frontend-react}/src/modules/auth/auth.service.ts (100%) create mode 100644 wtm-frontend-react/src/modules/auth/auth.store.ts rename {wtm-frontend => wtm-frontend-react}/src/modules/auth/auth.types.ts (100%) create mode 100644 wtm-frontend-react/src/modules/auth/views/ChangePasswordView.tsx create mode 100644 wtm-frontend-react/src/modules/auth/views/ForgotPasswordView.tsx create mode 100644 wtm-frontend-react/src/modules/auth/views/LoginView.scss create mode 100644 wtm-frontend-react/src/modules/auth/views/LoginView.tsx create mode 100644 wtm-frontend-react/src/modules/dashboard/dashboard.service.ts create mode 100644 wtm-frontend-react/src/modules/dashboard/dashboard.types.ts create mode 100644 wtm-frontend-react/src/modules/dashboard/views/DashboardView.scss create mode 100644 wtm-frontend-react/src/modules/dashboard/views/DashboardView.tsx create mode 100644 wtm-frontend-react/src/modules/project/components/ProjectFormDialog.tsx create mode 100644 wtm-frontend-react/src/modules/project/project.service.ts create mode 100644 wtm-frontend-react/src/modules/project/project.types.ts create mode 100644 wtm-frontend-react/src/modules/project/views/ProjectDetailView.tsx create mode 100644 wtm-frontend-react/src/modules/project/views/ProjectListView.tsx create mode 100644 wtm-frontend-react/src/modules/report/report.service.ts create mode 100644 wtm-frontend-react/src/modules/report/report.types.ts create mode 100644 wtm-frontend-react/src/modules/report/views/ReportView.tsx create mode 100644 wtm-frontend-react/src/modules/settings/components/OverheadTypeDialog.tsx create mode 100644 wtm-frontend-react/src/modules/settings/settings.service.ts create mode 100644 wtm-frontend-react/src/modules/settings/settings.types.ts create mode 100644 wtm-frontend-react/src/modules/settings/views/SettingsView.tsx create mode 100644 wtm-frontend-react/src/modules/teal/components/TealUploadDialog.tsx create mode 100644 wtm-frontend-react/src/modules/teal/teal.service.ts create mode 100644 wtm-frontend-react/src/modules/teal/teal.types.ts create mode 100644 wtm-frontend-react/src/modules/teal/views/TealListView.tsx create mode 100644 wtm-frontend-react/src/modules/timesheet/components/TimesheetEntryRow.tsx create mode 100644 wtm-frontend-react/src/modules/timesheet/timesheet.service.ts create mode 100644 wtm-frontend-react/src/modules/timesheet/timesheet.types.ts create mode 100644 wtm-frontend-react/src/modules/timesheet/views/TimesheetHistoryView.tsx create mode 100644 wtm-frontend-react/src/modules/timesheet/views/TimesheetUploadView.tsx create mode 100644 wtm-frontend-react/src/modules/timesheet/views/TimesheetWeekView.scss create mode 100644 wtm-frontend-react/src/modules/timesheet/views/TimesheetWeekView.tsx create mode 100644 wtm-frontend-react/src/modules/user/components/UserFormDialog.tsx create mode 100644 wtm-frontend-react/src/modules/user/user.service.ts create mode 100644 wtm-frontend-react/src/modules/user/user.types.ts create mode 100644 wtm-frontend-react/src/modules/user/views/UserDetailView.tsx create mode 100644 wtm-frontend-react/src/modules/user/views/UserListView.tsx create mode 100644 wtm-frontend-react/src/modules/wbs/components/WbsUploadDialog.tsx create mode 100644 wtm-frontend-react/src/modules/wbs/views/WbsTreeView.tsx create mode 100644 wtm-frontend-react/src/modules/wbs/wbs.service.ts create mode 100644 wtm-frontend-react/src/modules/wbs/wbs.types.ts create mode 100644 wtm-frontend-react/src/vite-env.d.ts create mode 100644 wtm-frontend-react/tsconfig.app.json create mode 100644 wtm-frontend-react/tsconfig.app.tsbuildinfo rename {wtm-frontend => wtm-frontend-react}/tsconfig.json (100%) create mode 100644 wtm-frontend-react/tsconfig.node.json create mode 100644 wtm-frontend-react/tsconfig.node.tsbuildinfo create mode 100644 wtm-frontend-react/vite.config.ts create mode 100644 wtm-frontend-vue/.env create mode 100644 wtm-frontend-vue/.env.development create mode 100644 wtm-frontend-vue/.env.production rename {wtm-frontend => wtm-frontend-vue}/.gitignore (100%) rename {wtm-frontend => wtm-frontend-vue}/.prettierrc.json (100%) rename {wtm-frontend => wtm-frontend-vue}/README.md (100%) rename {wtm-frontend => wtm-frontend-vue}/eslint.config.js (100%) rename {wtm-frontend => wtm-frontend-vue}/index.html (88%) rename {wtm-frontend => wtm-frontend-vue}/package.json (96%) rename {wtm-frontend => wtm-frontend-vue}/public/favicon.svg (100%) rename {wtm-frontend => wtm-frontend-vue}/public/icons.svg (100%) rename {wtm-frontend => wtm-frontend-vue}/src/app/App.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/app/main.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/app/plugins/primevue.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/app/router.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/assets/hero.png (100%) create mode 100644 wtm-frontend-vue/src/assets/images/logo.svg create mode 100644 wtm-frontend-vue/src/assets/styles/_form-grid.scss rename {wtm-frontend => wtm-frontend-vue}/src/assets/styles/_overrides.scss (100%) rename {wtm-frontend => wtm-frontend-vue}/src/assets/styles/_variables.scss (100%) create mode 100644 wtm-frontend-vue/src/assets/styles/main.scss rename {wtm-frontend => wtm-frontend-vue}/src/assets/vite.svg (100%) rename {wtm-frontend => wtm-frontend-vue}/src/assets/vue.svg (100%) create mode 100644 wtm-frontend-vue/src/core/api/api.types.ts rename {wtm-frontend => wtm-frontend-vue}/src/core/api/axios.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/auth/auth.guard.ts (100%) create mode 100644 wtm-frontend-vue/src/core/auth/auth.service.ts create mode 100644 wtm-frontend-vue/src/core/auth/auth.types.ts rename {wtm-frontend => wtm-frontend-vue}/src/core/components/AppLayout.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/components/AppSidebar.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/components/AppTopbar.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/components/BaseCrudTable.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/components/BaseFormDialog.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/components/BasePageHeader.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/components/NotFoundView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/composables/useCurrentUser.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/core/constants/app.constants.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/env.d.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/approval/approval.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/approval/approval.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/approval/approval.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/approval/approval.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/approval/components/ApprovalDetailDialog.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/approval/views/ApprovalHistoryView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/approval/views/ApprovalPendingView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/auth/auth.routes.ts (100%) create mode 100644 wtm-frontend-vue/src/modules/auth/auth.service.ts rename {wtm-frontend => wtm-frontend-vue}/src/modules/auth/auth.store.ts (100%) create mode 100644 wtm-frontend-vue/src/modules/auth/auth.types.ts rename {wtm-frontend => wtm-frontend-vue}/src/modules/auth/views/ChangePasswordView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/auth/views/ForgotPasswordView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/auth/views/LoginView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/dashboard/dashboard.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/dashboard/dashboard.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/dashboard/dashboard.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/dashboard/dashboard.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/dashboard/views/DashboardView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/project/components/ProjectFormDialog.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/project/project.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/project/project.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/project/project.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/project/project.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/project/views/ProjectDetailView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/project/views/ProjectListView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/report/report.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/report/report.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/report/report.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/report/report.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/report/views/ReportView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/settings/components/OverheadTypeDialog.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/settings/settings.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/settings/settings.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/settings/settings.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/settings/settings.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/settings/views/SettingsView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/teal/components/TealUploadDialog.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/teal/components/TealVersionSelect.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/teal/teal.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/teal/teal.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/teal/teal.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/teal/teal.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/teal/views/TealListView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/timesheet/components/TimesheetEntryRow.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/timesheet/timesheet.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/timesheet/timesheet.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/timesheet/timesheet.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/timesheet/timesheet.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/timesheet/views/TimesheetHistoryView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/timesheet/views/TimesheetUploadView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/timesheet/views/TimesheetWeekView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/user/components/UserFormDialog.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/user/user.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/user/user.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/user/user.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/user/user.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/user/views/UserDetailView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/user/views/UserListView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/wbs/components/WbsUploadDialog.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/wbs/components/WbsVersionSelect.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/wbs/views/WbsTreeView.vue (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/wbs/wbs.routes.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/wbs/wbs.service.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/wbs/wbs.store.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/src/modules/wbs/wbs.types.ts (100%) rename {wtm-frontend => wtm-frontend-vue}/tsconfig.app.json (100%) create mode 100644 wtm-frontend-vue/tsconfig.json rename {wtm-frontend => wtm-frontend-vue}/tsconfig.node.json (100%) rename {wtm-frontend => wtm-frontend-vue}/vite.config.ts (100%) delete mode 100644 wtm-frontend/package-lock.json diff --git a/.gitignore b/.gitignore index 6fa5ad6..66abc74 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ out/ # Node node_modules/ -wtm-frontend/node_modules/ # OS .DS_Store @@ -22,9 +21,10 @@ Thumbs.db .env.local .env.*.local -# Claude/OMC +# Claude/OMC/AI .claude/ .omc/ +CLAUDE.md # Logs *.log @@ -32,3 +32,11 @@ logs/ # Plans plans/ + +# Document generation scripts (keep PDFs, exclude generators) +wbx-spring-core/docs/generate_system_design.py +wbx-spring-core/docs/regenerate_pdfs.py + +# Package lock files (frontend) +wtm-frontend-vue/package-lock.json +wtm-frontend-react/package-lock.json diff --git a/wbx-spring-core/.omc/state/agent-replay-6666f085-e1ae-4dd4-86ee-7f7d5466a239.jsonl b/wbx-spring-core/.omc/state/agent-replay-6666f085-e1ae-4dd4-86ee-7f7d5466a239.jsonl deleted file mode 100644 index 38868f2..0000000 --- a/wbx-spring-core/.omc/state/agent-replay-6666f085-e1ae-4dd4-86ee-7f7d5466a239.jsonl +++ /dev/null @@ -1,12 +0,0 @@ -{"t":0,"agent":"a18f090","agent_type":"Explore","event":"agent_start","parent_mode":"none"} -{"t":0,"agent":"a18f090","agent_type":"Explore","event":"agent_stop","success":true,"duration_ms":44564} -{"t":0,"agent":"ad9b656","agent_type":"architect","event":"agent_start","parent_mode":"none"} -{"t":0,"agent":"ad9b656","agent_type":"architect","event":"agent_stop","success":true,"duration_ms":169049} -{"t":0,"agent":"ad7c101","agent_type":"architect","event":"agent_start","parent_mode":"none"} -{"t":0,"agent":"ad7c101","agent_type":"architect","event":"agent_stop","success":true,"duration_ms":202690} -{"t":0,"agent":"aeff378","agent_type":"critic","event":"agent_start","parent_mode":"none"} -{"t":0,"agent":"aeff378","agent_type":"critic","event":"agent_stop","success":true,"duration_ms":175651} -{"t":0,"agent":"a35d81f","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"} -{"t":0,"agent":"a66b53d","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"} -{"t":0,"agent":"a35d81f","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":105638} -{"t":0,"agent":"a66b53d","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":411042} diff --git a/wbx-spring-core/.omc/state/subagent-tracking.json b/wbx-spring-core/.omc/state/subagent-tracking.json deleted file mode 100644 index 0b209b2..0000000 --- a/wbx-spring-core/.omc/state/subagent-tracking.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "agents": [ - { - "agent_id": "a18f0906df8444921", - "agent_type": "Explore", - "started_at": "2026-03-25T09:57:59.104Z", - "parent_mode": "none", - "status": "completed", - "completed_at": "2026-03-25T09:58:43.668Z", - "duration_ms": 44564 - }, - { - "agent_id": "ad9b65686f679467a", - "agent_type": "oh-my-claudecode:architect", - "started_at": "2026-03-25T10:12:41.765Z", - "parent_mode": "none", - "status": "completed", - "completed_at": "2026-03-25T10:15:30.814Z", - "duration_ms": 169049 - }, - { - "agent_id": "ad7c101944473c52f", - "agent_type": "oh-my-claudecode:architect", - "started_at": "2026-03-25T10:20:25.037Z", - "parent_mode": "none", - "status": "completed", - "completed_at": "2026-03-25T10:23:47.727Z", - "duration_ms": 202690 - }, - { - "agent_id": "aeff378642946b837", - "agent_type": "oh-my-claudecode:critic", - "started_at": "2026-03-25T10:32:26.548Z", - "parent_mode": "none", - "status": "completed", - "completed_at": "2026-03-25T10:35:22.199Z", - "duration_ms": 175651 - }, - { - "agent_id": "a35d81fe5c1491345", - "agent_type": "general-purpose", - "started_at": "2026-03-25T10:54:19.348Z", - "parent_mode": "none", - "status": "completed", - "completed_at": "2026-03-25T10:56:04.986Z", - "duration_ms": 105638 - }, - { - "agent_id": "a66b53d0c9bd248ef", - "agent_type": "general-purpose", - "started_at": "2026-03-25T10:54:45.602Z", - "parent_mode": "none", - "status": "completed", - "completed_at": "2026-03-25T11:01:36.644Z", - "duration_ms": 411042 - } - ], - "total_spawned": 6, - "total_completed": 6, - "total_failed": 0, - "last_updated": "2026-03-25T11:01:36.764Z" -} \ No newline at end of file diff --git a/wbx-spring-core/build/libs/wbx-spring-core-1.0.0-SNAPSHOT.jar b/wbx-spring-core/build/libs/wbx-spring-core-1.0.0-SNAPSHOT.jar index 7ace0ac86b04a390762fdc315a0f60cd7e0997db..17bfcc2580b2f79d3295fa5de5ec413b977ee347 100644 GIT binary patch delta 7705 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 delta 4751 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 Z0s8--TiS4vLI#mRNLmuavwx{o^?$D$+|K|2 diff --git a/wbx-spring-core/build/resources/main/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/wbx-spring-core/build/resources/main/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index c0db889..4cefd95 100644 --- a/wbx-spring-core/build/resources/main/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/wbx-spring-core/build/resources/main/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,2 +1,4 @@ +kr.co.accura.wbx.spring.config.EmbeddedRedisConfig +kr.co.accura.wbx.spring.config.RedisCacheAutoConfig kr.co.accura.wbx.spring.config.WbxAutoConfiguration kr.co.accura.wbx.spring.admin.AdminAutoConfiguration diff --git a/wbx-spring-core/build/resources/main/application-example.yml b/wbx-spring-core/build/resources/main/application-example.yml index d3f6f67..0dda507 100644 --- a/wbx-spring-core/build/resources/main/application-example.yml +++ b/wbx-spring-core/build/resources/main/application-example.yml @@ -26,10 +26,11 @@ spring: minimum-idle: 5 connection-timeout: 30000 - data: - redis: - host: localhost - port: 6379 + # Redis (선택 — 미설정 시 인메모리 캐시 자동 사용) + # data: + # redis: + # host: localhost + # port: 6379 server: port: 8080 diff --git a/wbx-spring-core/build/resources/main/application-test.yml b/wbx-spring-core/build/resources/main/application-test.yml index 18cdd23..61f1f86 100644 --- a/wbx-spring-core/build/resources/main/application-test.yml +++ b/wbx-spring-core/build/resources/main/application-test.yml @@ -16,11 +16,6 @@ spring: flyway: enabled: false - data: - redis: - host: localhost - port: 6379 - wbx: spring: jwt: diff --git a/wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/AdminController.class.uniqueId1 b/wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/AdminController.class.uniqueId1 deleted file mode 100644 index 20ede333bec36d388b74f7672be5c3dee91d15ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9459 zcmcIq349dSeg57`Vx?seVgV5hHp0k85)zBRAdD~|ZaFIS%W)jWxTo-kAjy z$4&1xX`80$mEL#Sv~HWW0VC47>D{L3kv6@Lr1yQ_SK9CYW_EX0+Ev!gukd4M=FNNm zBSGNq!Kx;b|%y(VUXYp z<_$CDm}EI&`ilxJIrEl6Ti^J2|9AqO*c?Zffh|ZX9B_*Zp?vd2GiTj&i%Y4j>6@vn zn=>iyl(}F{TQ8O@&sT`K^9sX4C;d9sjc&v?Y>%Vczz)1Y;o$32Pa!^U=d)vuqcGjq z6k~JFu|}JdakL%x5gXgLa^6Pl#{F?TU|z<$+w+U z+V*@hc#sTy*Ebzu&}-l!Jgm^gWwSDP!Lf2&>(Neq{f{TmhyFMQ3>?54QkcaY(E?tgxvn%7j@^c&aZDPA|AJ_kxx2NB?glQ7uVY zoA`)6L?R!gn`H??5RO=zLd|%)YMF= zP;hLkNT(mg$v7S}a0;ghd{xylQH70e@q*)7vx`OdrZ{fIG;0Y)!3?p9GrZB;jJqbG zFp|I-oHuX*7Ztia%fD#aj+ITj3wD0Yr-K#5$gO?j{a0n?Wdq}QoRV{9+VrBc6?TWR z`gYDrrQM9_oHu=ImQSO>>a>9gS=}kC-OQ4eeKJp%lTf>2U^*77NIJD#NTNS5g-jU+5RH$Jm1t& zw7oViW_(G$qmrcO4J?59aC5=*JZ8G=g?z@%N)A3%H?4RUWwHI`RHnFG@ZD5-8Ixko zdV2p0Sc=0jkV9VKWWB`EEHN6v(qbtLMsYs3XclKA5$7|K+akaP3W`e=47>=cvxQD^ z+4L5zY*|u;?NMSOD1j^a21>ZW8C*3{@_cg2FId%;t$o+~ueO6Fq_aHOQ?xj_9dD+a zh+{ur2oXu56(j9?ESiqDASGbN>c7KN*de%5sz%OqmmWD!v*9M|dW za}0bgK2O15R=83;Z_S$}hw0&XRGo&YEJ`$-B+`6=fw$r9q&XJ|a8+`u&cD|M#xFAP z#R5nNbsWsR0_>{ItwYucMDptFc~!hYFz>X*Y_IuKD>|d=J`d-Wa`;fQ*wgQ6hnnCnZ4TZ z0|tH&?*HXpSqZ> zSw?O@j-QC*Ck_0Rba+P^*<>9W3ipR?-r40VMP}u*%jbwZ18vMdZ+V$^{0!SD>6O{1 zZNrBQ{G3#ftr@qJ_t|ZDL8Q(WOIAC6URzb7wH?1Ged|&JAHgrj@hb*CieF{-RZT)c zUf_b0cHZ_+=`_Fs{pZ{fGuCO1;3j*~HOFja}?N(WSF2&+w+w0OU3;P>z` zGG#_L9kvBE={ZbQ{nz98eeMSuG0(WU99yDE*S|;*vKMY;EZtAF;}4kubotJ^e$TwT zOyJ}AV^N-7)xo0b%WLx8s=N8BCrYKJho56zWT8ykd26zio3o0u(o<6%-HTi`i?%$6 zgRTCeO;V}GuA_6-s-2Ip@s@11rD~j(b?lrid8)t-2b-3<1$p(xge1Ca1zIkYg_>-N z!pX)mNA_Byr^u;e#$L$NrHT~q(Y2_ZjO0t^4Cy%{BcVlw&dzB%ESsCFwr3N=u{>>L zN^eUDAE_(!O=~VS$DTT6R_3NIu~wUfg0LZYdQ(7eO6mAec(9holqq{VW|SIc$C_pq zZU8kIvNN(l6%Na$I>ZP&%%3>@UfgO`bq-TwBQMrDA>7oGc+6(hbVZ=k%h}5Zx}{#S zv+ORKmwk#`;IhAxd?ILQ12Olmo590S5J<%#o0R|3C!@K(qlB&_j&ihV`%JlB#2b$N-xGzdWFC8kkc(lLoE-W}!&<-&_t z7_CwPs4Ye7MM*EK^Ukr_k@cY}cZq`4%b!GsW+|-_b^T=#TQwiJQ>8|x;s%BV>-E?@ zjLWlbc9|IHv@UgrG`7^VG6Cpq#o%2ST-rR+7jWtE2<|e}I4wr|JDnCsR&!b(vq&P` zkO~D#WOShy(G@298b(?T@BZedv7!i<^#ZttEaM@p-qpU7c(zIV%IoRZ2b8E(rK9os z6!Sv_za0U7IwPh;zM#FPlt#3>Q@C0;k*qGJjcs1e(9z~k>(ZIhjD}eLgQLsXQI-M2 z(_8t=mg&gpV`nOO9$E|rRA*xgmpMs#u6CuP4NbjHKe^7L`a7t`3+gm^QQcHG>YyTp>8w~EpbGhlZ)W^OKP_OA8S-bWP9tj&gvs#hJ|M*FX` zCu3hW)DZW2tJuSaLPg6%?-6!2Oc9OvH|k-jV|PfdrgHTjX3rYFsFw0x9(HzBArbfK zr6(q4+)^=PUF0zwcc82K&x2BYB=yy^U%i%Vn!CR0!M)C!%`ep_=*+`m$F{HcrJHlN z4hCNa4w?mfs8F=#?OP{Oyni|PRG@I8u56W)Bz|JBJTJwSJb3U^+-Q!mX?2U-=~KE* zi>4>}r*Hqv*#3Uv!+Pm^e$gyUSe%vhy3~21QcmB|v%t+8)Wrm1>XM;OsF5x;!U3L4 z$J84Q^{9TDkf%vQ9akgmYKoobEZYgSm-D9O&5WUraUnj&0q&(@>YAYrt0P_NDcvqK za)x?t)qkBdo=&J|)U$E*oS~jqpT_>Sx_z_rH{2zjk?MG$X68Iko%DBD?EO#5x>CL|kSgyY|Y(=7M&zX)h!%r2X zgk&zEGAbKa77s)fKL_-#fh3SVI3vAS2IbxV|1gB8Jsp9qyrGQ@g)ab+t!v__|T7K^JTg$LH3N)HXpi@iJr`3R4b+aO0e8+ezLBN2V&S)RV~#7bXz zTFh$~&-VWWf69~1KjYKexvG`d!GZTf?b_XX7jb9zU2Iyx))*#}JBL=Vi%rB{UiT^7 z#s0e(dLQSv;LrKXSm19jw(}#6uigL8xG4lc>h8)eeq3MON?mYhz`-o@3b zhz}r6I)^CYFhx6zT{wasew2C$M>%>-i`*0Ns)&3%6uFz9>Ef!LvS?IQM_CD#ph6l| zwQ;o)Mn#ENsEjCBpDXwGDKkOJmb_ZMUz^m2jW^#EbbejPC zK(SFOc9M!chJF0#HH_0#=?upBx9Upiiel-CV#h+o_Mu;GQewx(DsEn_Vwc(y+UdQa zil?J0zEoCma%eF57DmITui&#=7*TJ%gU`Q%FO<1dH8j^dLURSd(9KW+E>f#Y)ao)_ zejFosJfh9%iZ-W1ZNQIxNwt+`>ZUeguxelg@3vJ;xV>V+?urR_X#FH6q>5+IfoJ(C{W&dL5O>2B*@i=d?jc4G5u;cIqhRD=jszI(FUudnsIMx2kWTt5 z3Hn`;1pQh~g8s24610545+{iBQ{iS_x3dIPqie7te$$Cs4G>MONWDa@4roQ{Cu%iF zPZ+9r=4FZ|w(d^;v_#bkepc6)ZU*)#Aeere#qZK#34+jwnY=r-Otu(S0x-ZQYX?KUhr24_lr3%s#g^E?%- ztw7eJ>#fMqqbsg>b&q^M)9%(I--$H%J@Sm~44P$5z90elo< zya|LN4J+-8#`E61nXx~=-ah~|(I_K_dEl^sXr@c_x8xh8IQV&cd;+C+=$D_l7yH^Rre(-;(1BRKb*Gti%@=F_=!FbAR z=NlzR<0{oo^<+yWie#Hw8z-DHI#V^aGn(nnik=)8+vNip@=)nE7r$73D&3jr_lG5m zk0MSd4P4y&{g^`2j(x6 zY=t6Do{=wZy@9=E=_*;D21=METO9&0hZ;rn2(Um!Jb8yAkIUCfFXVCr{h?O=Q1c^d aow9R8SfqdH7A(OsaaJn%5;H#daRN)+tpFRF2@txg;Zkx1#M{}~9%)IZsx96F6=Fh(${th6AZ@Ljfmx8#4 zZP?Cmy6)%|Tj!NZ%i;P`d0BUxj$zH~yxK4ex!YL2)r;GKG75 zk?SU>*o&S_Av+vQwLHVrr<9xMD;p%U2;^F($_Q$;SgCe+#Ho_kvP(o8NMw=uWQJJqJmwii>iVV zhOuWy%!xU+pFq)QG)-~Y;g%<=xhK=o_z?|nNaG6mm1Ipor@_p0A%C}+OW-&|w?DX9 z%+IJ8#z_sQaGGKJ1;aADiwt`@!C&gZ8JtycPQ!U*iSBC<7Yvt36SHdsPjqRBTa|@m5VM2OWV%d+w_T0cic8jVgxZTJ6uw62{{F0(%?8la*gzXf4}M_1$ltCGrNEAlO)XPE97$iH?*;K#@9DjDuA7?!x!YLtaD%gZLs zq=?SkEOEz><8U(WEf`dfGn@CrtvV~Y+a`jRmTG4P#Udf2YHw~m(rwAuj-tma^(o%; zqf>Bu9cKaxGN@0%rpQlbp38Wol@FH~`e#~}XEelBYte8GDo4(;Y>!LYlFd}Xv>Ro+ zu3r|Ga5!yZiml(|jdGO_wWBz6jNya-2*-|`Chuy|ZaEb(X-FgoHaX~y%KgRA7baKg zkXokDkz1Z{gzc>~g8QS^;VwQ( zf{wU%sWEqSwPly@oPGipHFCLW1_`CXn%wZ`2N`*7s`wa=0#}2F7Q?}{4r5r0c3tQN zA2rH=*LWp3{CgVF(O*&I!bL&CSGZL*g*#NR?Ru-3Z6|nSX5GSBDr8js`GtYYt=C5T zRA_men`Y7QM3zdjq+%H>3OC()lf11z#{6YRjn;VhX-u*uS+Z9jyVpbX$ngX+^}PCnc|&boJ_@|5La| zl4*eD>F(D>vo}V51{?hiN(`e9u>*L3U4I}w^$2})M;@S`o&)q8jK}GH_y;KQ`-pcv z!myN%evd@z=zVNU9b3hTU-9NDF8t`bx=!!I=%)8xB_+vVK=@K1NFsG1INgz#Me>BG! zdrVppabkm*26MY5G1U&k-v&iWwIE&35A=0+Z35?IAM zvf@$OY2UWy``PK&QO3x9tuiX1?JE5WdQ!C3Cc8B(ppHda)xc*ouhPHI@g=@S-#?6_ Bs22bL diff --git a/wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/AdminViewController.class.uniqueId2 b/wbx-spring-core/build/tmp/compileJava/compileTransaction/stash-dir/AdminViewController.class.uniqueId2 deleted file mode 100644 index 2c10c4a08b080e34cd448ed7db767711ceecdb91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22170 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 diff --git a/wbx-spring-core/build/tmp/compileJava/previous-compilation-data.bin b/wbx-spring-core/build/tmp/compileJava/previous-compilation-data.bin index 0699c346228eda93b1f2be6a9c388773ff3ed4ee..29f7c53406f8ad8114c03e5506ce0a6a50a74d69 100644 GIT binary patch literal 253881 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

q>>&p~8ta8Tz?H4% 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�|R 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 Pv0APurCk}TAk4o3eyd}8 literal 112961 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

@t4Bt=9Kk&^oE;k>`^e_iJ~hXXTvKmFXX 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

~HRw)eGTo61N{c8OmlWn_o#kR+_3WQcA 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 diff --git a/wbx-spring-core/docs/generate_system_design.py b/wbx-spring-core/docs/generate_system_design.py deleted file mode 100644 index 9fc3158..0000000 --- a/wbx-spring-core/docs/generate_system_design.py +++ /dev/null @@ -1,838 +0,0 @@ -""" -한화오션 EPU WTM 시스템 설계서 PPT 생성 -요구사항정의 → To-Be → 시스템구성도 → 기능정의 → 시스템설계 -""" -from pptx import Presentation -from pptx.util import Inches, Pt, Emu -from pptx.dml.color import RGBColor -from pptx.enum.text import PP_ALIGN, MSO_ANCHOR -from pptx.enum.shapes import MSO_SHAPE -import os - -OUTPUT = os.path.join(os.path.dirname(__file__), "한화오션_EPU_WTM_시스템설계서.pptx") - -# 색상 -PRIMARY = RGBColor(30, 60, 120) -ACCENT = RGBColor(0, 120, 200) -DARK = RGBColor(40, 40, 40) -BODY = RGBColor(80, 80, 80) -WHITE = RGBColor(255, 255, 255) -LIGHT_BG = RGBColor(240, 245, 255) -GREEN_BG = RGBColor(220, 240, 220) -ORANGE_BG = RGBColor(255, 240, 220) -RED_ACCENT = RGBColor(200, 60, 60) - - -def add_box(slide, left, top, width, height, text, fill_color=LIGHT_BG, font_color=PRIMARY, font_size=10, bold=True): - shape = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height) - shape.fill.solid() - shape.fill.fore_color.rgb = fill_color - shape.line.color.rgb = PRIMARY - shape.line.width = Pt(1) - tf = shape.text_frame - tf.word_wrap = True - p = tf.paragraphs[0] - p.text = text - p.font.size = Pt(font_size) - p.font.color.rgb = font_color - p.font.bold = bold - p.alignment = PP_ALIGN.CENTER - tf.paragraphs[0].space_before = Pt(2) - return shape - - -def add_textbox(slide, left, top, width, height, text, font_size=10, color=BODY, bold=False, align=PP_ALIGN.LEFT): - txBox = slide.shapes.add_textbox(left, top, width, height) - tf = txBox.text_frame - tf.word_wrap = True - p = tf.paragraphs[0] - p.text = text - p.font.size = Pt(font_size) - p.font.color.rgb = color - p.font.bold = bold - p.alignment = align - return txBox - - -def add_multiline_box(slide, left, top, width, height, title, items, fill_color=LIGHT_BG): - shape = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height) - shape.fill.solid() - shape.fill.fore_color.rgb = fill_color - shape.line.color.rgb = PRIMARY - shape.line.width = Pt(1) - tf = shape.text_frame - tf.word_wrap = True - p = tf.paragraphs[0] - p.text = title - p.font.size = Pt(9) - p.font.color.rgb = PRIMARY - p.font.bold = True - for item in items: - p2 = tf.add_paragraph() - p2.text = f"• {item}" - p2.font.size = Pt(7) - p2.font.color.rgb = BODY - p2.space_before = Pt(1) - return shape - - -def add_arrow(slide, start_left, start_top, end_left, end_top): - connector = slide.shapes.add_connector( - 1, start_left, start_top, end_left, end_top) # 1 = straight - connector.line.color.rgb = PRIMARY - connector.line.width = Pt(1.5) - return connector - - -def add_table(slide, left, top, width, rows_data, col_widths=None): - rows = len(rows_data) - cols = len(rows_data[0]) - table_shape = slide.shapes.add_table(rows, cols, left, top, width, Inches(0.3 * rows)) - table = table_shape.table - - if col_widths: - for i, w in enumerate(col_widths): - table.columns[i].width = w - - for ri, row in enumerate(rows_data): - for ci, val in enumerate(row): - cell = table.cell(ri, ci) - cell.text = str(val) - p = cell.text_frame.paragraphs[0] - p.font.size = Pt(8) - if ri == 0: - p.font.bold = True - p.font.color.rgb = WHITE - cell.fill.solid() - cell.fill.fore_color.rgb = PRIMARY - else: - p.font.color.rgb = BODY - if ri % 2 == 0: - cell.fill.solid() - cell.fill.fore_color.rgb = LIGHT_BG - p.alignment = PP_ALIGN.CENTER if ci > 0 else PP_ALIGN.LEFT - - -def title_slide(prs, title, subtitle): - slide = prs.slides.add_slide(prs.slide_layouts[6]) # blank - # 배경 - bg = slide.background.fill - bg.solid() - bg.fore_color.rgb = PRIMARY - # 타이틀 - add_textbox(slide, Inches(1), Inches(2), Inches(8), Inches(1), - title, font_size=32, color=WHITE, bold=True, align=PP_ALIGN.CENTER) - add_textbox(slide, Inches(1), Inches(3.2), Inches(8), Inches(0.8), - subtitle, font_size=16, color=RGBColor(180, 200, 230), align=PP_ALIGN.CENTER) - add_textbox(slide, Inches(1), Inches(5.5), Inches(8), Inches(0.5), - "아큐라시스템 | 2026년 3월", font_size=12, color=RGBColor(150, 170, 200), align=PP_ALIGN.CENTER) - return slide - - -def section_slide(prs, num, title, subtitle=""): - slide = prs.slides.add_slide(prs.slide_layouts[6]) - bg = slide.background.fill - bg.solid() - bg.fore_color.rgb = RGBColor(25, 50, 100) - # 큰 번호 - add_textbox(slide, Inches(0.8), Inches(1.5), Inches(2), Inches(1.2), - f"{num:02d}", font_size=72, color=ACCENT, bold=True) - # 구분선 - shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, - Inches(0.8), Inches(3.0), Inches(8), Pt(3)) - shape.fill.solid() - shape.fill.fore_color.rgb = ACCENT - shape.line.fill.background() - # 타이틀 - add_textbox(slide, Inches(0.8), Inches(3.3), Inches(9), Inches(0.8), - title, font_size=28, color=WHITE, bold=True) - # 서브타이틀 - if subtitle: - add_textbox(slide, Inches(0.8), Inches(4.3), Inches(8), Inches(0.5), - subtitle, font_size=12, color=RGBColor(150, 180, 220)) - return slide - - -def content_slide(prs, title): - slide = prs.slides.add_slide(prs.slide_layouts[6]) - # 상단 바 - shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, Inches(10), Inches(0.6)) - shape.fill.solid() - shape.fill.fore_color.rgb = PRIMARY - shape.line.fill.background() - add_textbox(slide, Inches(0.3), Inches(0.05), Inches(9), Inches(0.5), - title, font_size=16, color=WHITE, bold=True) - return slide - - -def build(): - prs = Presentation() - prs.slide_width = Inches(10) - prs.slide_height = Inches(7.5) - - # ============================================================ - # 표지 - # ============================================================ - title_slide(prs, - "한화오션 EPU\nWork Time Manager (WTM)", - "시스템 설계서 — 요구사항정의 · To-Be · 시스템구성 · 기능정의 · 설계") - - # ============================================================ - # 목차 - # ============================================================ - slide = content_slide(prs, "목차") - toc = [ - "01. 프로젝트 개요", - "02. 요구사항 정의서", - "03. As-Is / To-Be 분석", - "04. 시스템 구성도", - "05. 기능 정의서", - "06. 데이터베이스 설계", - "07. API 설계", - "08. 화면 구성", - "09. 인터페이스 설계 (SAP/P6/Cognite)", - "10. 보안 설계", - "11. 단계별 추진 일정", - ] - y = 1.0 - for item in toc: - add_textbox(slide, Inches(1.5), Inches(y), Inches(7), Inches(0.35), - item, font_size=14, color=DARK) - y += 0.4 - - # ============================================================ - # 01. 프로젝트 개요 - # ============================================================ - section_slide(prs, 1, "프로젝트 개요", "WTM 시스템 범위, 기술 스택, 추진 구조") - - slide = content_slide(prs, "01. 프로젝트 개요") - overview_data = [ - ["항목", "내용"], - ["프로젝트명", "WTM (Work Time Manager)"], - ["고객", "한화오션 EPU (Engineering Procurement Unit)"], - ["목적", "EPC 프로젝트 인력 시수 관리, WBS 연동, 결재, 리포트"], - ["기능 요구사항", "86개 (PH1 Y=62 / PH2 이관=24)"], - ["비기능 요구사항", "17개 (NF.1~17)"], - ["화면 수", "49개 (PH1-1차 26 / PH1-2차 11 / PH2 12)"], - ["API 수", "79개 (PH1-1: 67 / PH1-2: 6 / PH2: 6)"], - ["기술 스택", "Spring Boot 3.5.0 + Java 21 (wbx-spring 프레임워크)"], - ["DB", "Azure SQL (프로필 전환: Oracle/MSSQL/MySQL/PG)"], - ["인증", "Azure Entra ID SSO + MFA/TOTP"], - ] - add_table(slide, Inches(0.5), Inches(1.0), Inches(9), - overview_data, col_widths=[Inches(2.5), Inches(6.5)]) - - # ============================================================ - # 02. 요구사항 정의서 - # ============================================================ - section_slide(prs, 2, "요구사항 정의서", "기능 86개 (Y=62/N=24) + 비기능 17개 + 확인필요사항 7건") - - # 기능 요구사항 요약 - slide = content_slide(prs, "02-1. 기능 요구사항 (86개) — 영역별 분류") - req_data = [ - ["영역", "PH1 (Y)", "PH2 이관 (N)", "합계"], - ["User Registration (No.1~7)", "5", "2", "7"], - ["Login / 인증 (No.8~16)", "8", "1", "9"], - ["User Home / 권한 (No.17~24)", "6", "2", "8"], - ["Project / WBS (No.25~41)", "14", "3", "17"], - ["Resource Assignment (No.42~54)", "6", "7", "13"], - ["Time Sheet (No.55~69)", "13", "2", "15"], - ["Approval (No.70~75)", "6", "0", "6"], - ["Reporting (No.76~86)", "2", "9", "11"], - ["합계", "62", "24", "86"], - ] - add_table(slide, Inches(0.5), Inches(1.0), Inches(9), - req_data, col_widths=[Inches(4), Inches(2), Inches(2), Inches(1)]) - - # 비기능 요구사항 - slide = content_slide(prs, "02-2. 비기능 요구사항 (17개)") - nf_data = [ - ["No.", "카테고리", "요구사항", "비고"], - ["NF.1~2", "클라우드", "Azure Hybrid Security Zone 내 구성", "MS Azure"], - ["NF.3", "보안(서버)", "HIWARE, V3, Secuver TOS", "한화 표준"], - ["NF.4", "보안(DB)", "Cubeone(암호화), Dbsafer(접근제어)", "한화 표준"], - ["NF.5", "보안(Cloud)", "Defender + Analytics", "Native"], - ["NF.6~7", "정보보호", "보안성 심의, 컴플라이언스", "그룹 표준"], - ["NF.8~10", "모니터링", "onTune(SMS), Maxguage(DB), Jennifer(WAS)", "한화 표준"], - ["NF.11", "인증(내부)", "Azure Entra ID SSO", ""], - ["NF.12", "인증(외부)", "2-Way 인증 (MFA)", "TOTP"], - ["NF.13", "I/F(HR)", "SAP BTP 경유 SuccessFactors 연동", ""], - ["NF.14", "I/F(P6)", "파일 기반 (물리적 I/F 없음)", ""], - ["NF.15", "I/F(Cognite)", "Extractor 서버 구성", "PH2"], - ["NF.16~17", "아키텍처", "이중화, 백업 전략", ""], - ] - add_table(slide, Inches(0.3), Inches(1.0), Inches(9.4), - nf_data, col_widths=[Inches(1), Inches(1.5), Inches(4.5), Inches(1.5)]) - - # 확인필요사항 - slide = content_slide(prs, "02-3. 확인필요사항 (7건)") - confirm_data = [ - ["#", "영역", "내용", "현재 상태"], - ["1", "User", "파트너사/외주 인력 관리 정책", "파트너 마스터 미연계"], - ["2", "권한", "사용자 관리규정 및 권한정책", "No.18 확정 (기능 기반 역할)"], - ["3", "WBS", "WBS별 Resource Plan 방식", "TT에서 투입시수 세팅"], - ["4", "배정", "인력 배치 시 스케줄 확인 절차", "Discipline별 인력 선정 후 제출"], - ["5", "EPC", "C단계 시수 입력 방안", "C단계 대상 제외 (EPU만)"], - ["6", "결재", "업무별 승인 절차", "User→DL→PM 3단계 확정"], - ["7", "배정", "Project Assignment 프로세스", "SA 생성→PM 배정→확정"], - ] - add_table(slide, Inches(0.3), Inches(1.0), Inches(9.4), - confirm_data, col_widths=[Inches(0.5), Inches(1), Inches(3.5), Inches(3.5)]) - - # ============================================================ - # 03. As-Is / To-Be - # ============================================================ - section_slide(prs, 3, "As-Is / To-Be 분석", "Excel 수작업 → WTM 시스템 전환 효과") - - slide = content_slide(prs, "03. As-Is → To-Be 전환") - - # As-Is 박스들 - add_textbox(slide, Inches(0.5), Inches(0.9), Inches(4), Inches(0.4), - "As-Is (현재)", font_size=14, color=RED_ACCENT, bold=True) - - as_is = [ - ("Excel 기반 시수 관리", "수작업 입력, 오류 빈번"), - ("이메일 기반 결재", "추적 불가, 지연"), - ("P6 WBS 수동 매핑", "버전 관리 어려움"), - ("리포트 수동 집계", "실시간 분석 불가"), - ("인력 배정 구두 전달", "이력 관리 없음"), - ] - y = 1.4 - for title, desc in as_is: - add_multiline_box(slide, Inches(0.5), Inches(y), Inches(4), Inches(0.55), - title, [desc], fill_color=RGBColor(255, 235, 235)) - y += 0.6 - - # 화살표 영역 - add_textbox(slide, Inches(4.5), Inches(2.5), Inches(1), Inches(0.5), - "→", font_size=36, color=ACCENT, bold=True, align=PP_ALIGN.CENTER) - - # To-Be 박스들 - add_textbox(slide, Inches(5.5), Inches(0.9), Inches(4), Inches(0.4), - "To-Be (WTM 시스템)", font_size=14, color=ACCENT, bold=True) - - to_be = [ - ("통합 시수 입력 (3종)", "Non-Project/Other/EPC 탭 전환, 규칙 엔진"), - ("온라인 결재 워크플로우", "User→DL→PM 3단계, 일괄 승인, 실시간 알림"), - ("P6 WBS 자동 파싱", "Canonical WBS 매핑, 버전 관리, 비교 UI"), - ("실시간 리포트", "프로젝트별/WBS별 시수 분석, Excel Export"), - ("체계적 인력 배정", "프로젝트-Discipline-인력 매핑, 이력 관리"), - ] - y = 1.4 - for title, desc in to_be: - add_multiline_box(slide, Inches(5.5), Inches(y), Inches(4), Inches(0.55), - title, [desc], fill_color=RGBColor(230, 245, 255)) - y += 0.6 - - # 하단 기대효과 - add_textbox(slide, Inches(0.5), Inches(5.0), Inches(9), Inches(0.3), - "기대효과", font_size=12, color=PRIMARY, bold=True) - effects = "• 시수 입력 오류 90% 감소 • 결재 처리 시간 70% 단축 • 실시간 프로젝트 시수 현황 파악 • WBS 변경 추적 자동화" - add_textbox(slide, Inches(0.5), Inches(5.3), Inches(9), Inches(0.5), - effects, font_size=10, color=BODY) - - # ============================================================ - # 04. 시스템 구성도 - # ============================================================ - section_slide(prs, 4, "시스템 구성도", "전체 아키텍처, 기술 스택, 네트워크 구성") - - # 전체 아키텍처 - slide = content_slide(prs, "04-1. 전체 시스템 아키텍처") - - # 클라이언트 영역 - add_textbox(slide, Inches(0.3), Inches(0.9), Inches(2), Inches(0.3), - "클라이언트", font_size=10, color=BODY, bold=True) - clients = ["WBX No-Code", "Web Browser", "Mobile"] - cx = 0.3 - for c in clients: - add_box(slide, Inches(cx), Inches(1.2), Inches(1.4), Inches(0.5), - c, fill_color=RGBColor(200, 220, 255), font_size=8) - cx += 1.6 - - # Nginx - add_box(slide, Inches(5.5), Inches(1.2), Inches(1.8), Inches(0.5), - "Nginx (SSL/LB)", fill_color=RGBColor(220, 220, 220), font_color=DARK, font_size=9) - - # Spring Boot WTM - add_multiline_box(slide, Inches(0.3), Inches(2.2), Inches(4.5), Inches(2.8), - "Spring Boot WTM-API (wbx-spring 프레임워크)", [ - "JWT 인증 / Azure Entra ID SSO / MFA", - "RBAC 권한 (dept_scope)", - "통합 결재 엔진 (Handler Registry)", - "SSE 실시간 알림", - "시수 입력 3종 + 규칙 엔진", - "WBS/TEAL 관리 + P6 파서", - "리포트 (QueryDSL)", - "SAP BTP HR 연동", - ], fill_color=RGBColor(230, 240, 255)) - - # WBX FastAPI - add_multiline_box(slide, Inches(5.2), Inches(2.2), Inches(2.3), Inches(2.0), - "WBX FastAPI (선택)", [ - "문서관리", - "이메일", - "게시판/일정", - "/api/gw/*" - ], fill_color=RGBColor(245, 240, 255)) - - # DB - add_multiline_box(slide, Inches(7.8), Inches(2.2), Inches(2), Inches(1.5), - "Database", [ - "wtm_db (Azure SQL)", - "wbx_gw (MySQL)", - "프로필 전환 지원" - ], fill_color=RGBColor(255, 245, 230)) - - # Redis - add_box(slide, Inches(7.8), Inches(4.0), Inches(1), Inches(0.5), - "Redis", fill_color=GREEN_BG, font_size=9) - - # Blob Storage - add_box(slide, Inches(8.9), Inches(4.0), Inches(1), Inches(0.5), - "Storage", fill_color=ORANGE_BG, font_size=9) - - # SSO - add_box(slide, Inches(5.2), Inches(4.5), Inches(2.3), Inches(0.5), - "Azure Entra ID (SSO+MFA)", fill_color=RGBColor(255, 235, 235), font_size=8) - - # SAP BTP - add_box(slide, Inches(0.3), Inches(5.3), Inches(2), Inches(0.5), - "SAP BTP (HR)", fill_color=RGBColor(255, 240, 220), font_size=9) - - # P6 - add_box(slide, Inches(2.5), Inches(5.3), Inches(1.5), Inches(0.5), - "P6 (WBS)", fill_color=RGBColor(255, 240, 220), font_size=9) - - # Cognite - add_box(slide, Inches(4.2), Inches(5.3), Inches(1.5), Inches(0.5), - "Cognite", fill_color=RGBColor(255, 240, 220), font_size=9) - - # 기술 스택 슬라이드 - slide = content_slide(prs, "04-2. 기술 스택") - tech_data = [ - ["레이어", "기술", "버전/비고"], - ["Language", "Java", "21 (LTS)"], - ["Framework", "Spring Boot + wbx-spring", "3.5.0"], - ["Security", "Spring Security 6 + OAuth2", "Entra ID SSO + MFA"], - ["ORM", "Spring Data JPA + QueryDSL", "Hibernate 6"], - ["DB", "Azure SQL / Oracle / MySQL / PG", "프로필 전환"], - ["Migration", "Flyway", "DBMS별 DDL 분리"], - ["Cache", "Redis", "세션 + 캐시"], - ["WEB/WAS", "Nginx + Embedded Tomcat", "이중화"], - ["CI/CD", "GitHub Actions + Azure DevOps", "승인 게이트"], - ["형상관리", "GitHub + Azure Repos", "SemVer"], - ["모니터링", "Jennifer + Actuator + Prometheus", "한화 표준"], - ["Cloud", "Microsoft Azure", "Hybrid Security Zone"], - ] - add_table(slide, Inches(0.5), Inches(1.0), Inches(9), - tech_data, col_widths=[Inches(2), Inches(3.5), Inches(3.5)]) - - # ============================================================ - # 05. 기능 정의서 - # ============================================================ - section_slide(prs, 5, "기능 정의서", "시수 입력 3종, WBS/TEAL, 결재 워크플로우, 리포트") - - # 시수 입력 - slide = content_slide(prs, "05-1. 시수 입력 (3종 통합 UI)") - - # 탭 UI 도식 - tabs = ["Non-Project", "Other Project", "EPC Project"] - tx = 0.5 - for i, tab in enumerate(tabs): - color = ACCENT if i == 2 else RGBColor(180, 180, 180) - add_box(slide, Inches(tx), Inches(1.0), Inches(2), Inches(0.4), - tab, fill_color=RGBColor(230, 240, 255) if i == 2 else RGBColor(245, 245, 245), - font_color=color, font_size=9) - tx += 2.2 - - # EPC 입력 폼 도식 - fields = [ - "프로젝트: [EPU-2025-001 ▼]", - "WBS: [E.01.03 Piping Detail ▼]", - "TEAL: [Detail Engineering ▼]", - ] - fy = 1.6 - for field in fields: - add_textbox(slide, Inches(0.8), Inches(fy), Inches(6), Inches(0.3), - field, font_size=10, color=DARK) - fy += 0.35 - - # 주간 그리드 - days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "합계"] - vals = ["8.0", "8.0", "8.0", "8.0", "4.0", "-", "36.0h"] - grid_data = [days, vals] - add_table(slide, Inches(0.5), Inches(2.9), Inches(6.5), - grid_data, col_widths=[Inches(0.9)] * 7) - - # 규칙 엔진 박스 - add_multiline_box(slide, Inches(7.3), Inches(1.0), Inches(2.5), Inches(2.5), - "규칙 엔진", [ - "일 최소 8시간", - "주 최대 52시간", - "Activity 최소 1개", - "Location별 규칙", - "미래 날짜 입력 불가", - "초과 시 경고/차단", - ], fill_color=ORANGE_BG) - - # 하단 설명 - add_textbox(slide, Inches(0.5), Inches(3.6), Inches(6), Inches(0.3), - "[임시 저장] [결재 요청] 주간 합계: 36.0 / 52h", - font_size=9, color=BODY) - - ts_desc = [ - ("Non-Project (No.55~59)", "Overhead Type 선택 → TEAL Activity → 시간 입력. WBS/프로젝트 입력 불가"), - ("Other Project (No.60~62)", "프로젝트 선택 → Canonical WBS L2~4 → Activity → 시간. P6 연동 불필요"), - ("EPC Project (No.64~69)", "프로젝트 → Canonical WBS L2~5 → TEAL → 시간. Revision 관리(PH1-2)"), - ] - fy = 4.2 - for title, desc in ts_desc: - add_textbox(slide, Inches(0.5), Inches(fy), Inches(9), Inches(0.2), - title, font_size=9, color=PRIMARY, bold=True) - add_textbox(slide, Inches(0.5), Inches(fy + 0.2), Inches(9), Inches(0.25), - desc, font_size=8, color=BODY) - fy += 0.5 - - # WBS/TEAL - slide = content_slide(prs, "05-2. WBS · TEAL 관리") - - # Canonical WBS 구조 - add_textbox(slide, Inches(0.5), Inches(0.9), Inches(4), Inches(0.3), - "Canonical WBS 구조 (No.34)", font_size=12, color=PRIMARY, bold=True) - wbs_levels = [ - ["Level", "구분", "설명", "예시"], - ["L1", "Project", "프로젝트", "EPU-2025-001"], - ["L2", "Phase", "Engineering/Procurement/Construction/...", "Engineering"], - ["L3", "Asset/Area", "자산 또는 영역", "Hull Structure"], - ["L4", "Work/Discipline", "작업 또는 Discipline", "Piping"], - ["L5", "Deliverable", "산출물 (Eng/SCM only)", "Detail Drawing"], - ] - add_table(slide, Inches(0.5), Inches(1.3), Inches(9), - wbs_levels, col_widths=[Inches(0.8), Inches(1.5), Inches(4), Inches(2.5)]) - - # WBS 흐름 - add_textbox(slide, Inches(0.5), Inches(3.5), Inches(4), Inches(0.3), - "WBS 업로드 흐름", font_size=12, color=PRIMARY, bold=True) - flow_steps = ["P6 Export\n(PM 업로드)", "WBS 파싱\n(Level 1~5)", "Canonical\nWBS 매핑", "PCM 승인\n버전 등록", "TEAL\nActivity 연결"] - fx = 0.3 - for i, step in enumerate(flow_steps): - add_box(slide, Inches(fx), Inches(3.9), Inches(1.6), Inches(0.8), - step, fill_color=RGBColor(230, 240, 255) if i % 2 == 0 else GREEN_BG, - font_size=8, font_color=DARK) - if i < len(flow_steps) - 1: - add_textbox(slide, Inches(fx + 1.6), Inches(4.05), Inches(0.3), Inches(0.3), - "→", font_size=16, color=ACCENT, bold=True, align=PP_ALIGN.CENTER) - fx += 1.9 - - # 결재 워크플로우 - slide = content_slide(prs, "05-3. 결재 워크플로우") - - # 결재 흐름도 - steps = [ - ("User\n시수 입력", RGBColor(200, 220, 255)), - ("제출\n(결재 요청)", RGBColor(255, 240, 200)), - ("DL\n1차 결재", RGBColor(220, 240, 220)), - ("PM\n최종 결재", RGBColor(220, 240, 220)), - ("승인 완료\n(APPROVED)", RGBColor(200, 255, 200)), - ] - sx = 0.3 - for i, (label, color) in enumerate(steps): - add_box(slide, Inches(sx), Inches(1.3), Inches(1.6), Inches(0.9), - label, fill_color=color, font_color=DARK, font_size=10) - if i < len(steps) - 1: - add_textbox(slide, Inches(sx + 1.6), Inches(1.5), Inches(0.3), Inches(0.3), - "→", font_size=18, color=ACCENT, bold=True, align=PP_ALIGN.CENTER) - sx += 1.9 - - # 반려 흐름 - add_box(slide, Inches(3.5), Inches(2.5), Inches(2.5), Inches(0.5), - "반려 → User 수정 후 재제출", fill_color=RGBColor(255, 230, 230), - font_color=RED_ACCENT, font_size=9) - - # 결재 기능 표 - approval_data = [ - ["기능", "설명", "요구사항"], - ["시수 결재 요청", "User가 주간 시수 작성 후 제출", "No.70"], - ["승인/반려 + 코멘트", "DL/PM이 승인 또는 반려 (사유 필수)", "No.72"], - ["일괄 승인", "여러 시수를 한번에 승인", "No.73"], - ["결재 이력 조회", "과거 결재 내역 전체 조회", "No.74"], - ["초과 하이라이트", "기준 초과 시 결재자에게 강조 표시", "No.75 (PH1-2)"], - ["미완료 알림", "미입력/미제출 시수 자동 리마인더", "No.70"], - ] - add_table(slide, Inches(0.3), Inches(3.3), Inches(9.4), - approval_data, col_widths=[Inches(2), Inches(5), Inches(1.5)]) - - # 리포트 - slide = content_slide(prs, "05-4. 리포트") - report_data = [ - ["리포트", "설명", "Phase", "필터"], - ["프로젝트별 시수 분석", "프로젝트별 실제 투입 Manhour", "PH1-1", "기간, 프로젝트, Discipline"], - ["WBS Level별 시수 분석", "Canonical WBS Level별 Manhour", "PH1-1", "기간, 프로젝트, WBS Level"], - ["Phase별 시수 비율", "Engineering/Procurement 등 비율", "PH1-2", "기간, 프로젝트"], - ["Non-Project 비율", "Overhead Manhour 투입 비율", "PH1-2", "기간, 부서"], - ["WBS 버전 이력", "WBS 변경 이력 조회", "PH1-2", "프로젝트, 버전"], - ["Discipline 생산성", "Discipline별 생산성 분석", "PH2", "기간, Discipline"], - ] - add_table(slide, Inches(0.3), Inches(1.0), Inches(9.4), - report_data, col_widths=[Inches(2.2), Inches(3.5), Inches(1), Inches(2)]) - - # ============================================================ - # 06. 데이터베이스 설계 - # ============================================================ - section_slide(prs, 6, "데이터베이스 설계", "ERD, 주요 테이블 14개, Flyway 마이그레이션") - - slide = content_slide(prs, "06-1. ERD 개요 (wtm_db)") - - # ERD 도식 - entities = [ - ("users", Inches(0.3), Inches(1.0), ["id, employee_number", "email, full_name", "department, discipline", "is_active, mfa_enabled"]), - ("projects", Inches(3.3), Inches(1.0), ["id, project_code", "name, project_type", "status, pm_user_id"]), - ("canonical_wbs", Inches(6.3), Inches(1.0), ["id, project_id", "wbs_code, level", "name, discipline"]), - ("timesheets", Inches(0.3), Inches(3.2), ["id, user_id", "week_start_date", "status, total_hours"]), - ("timesheet_entries", Inches(3.3), Inches(3.2), ["id, timesheet_id", "entry_type, entry_date", "hours, epc_project_id", "canonical_wbs_id"]), - ("tt_approvals", Inches(6.3), Inches(3.2), ["id, timesheet_id", "requester_id, status", "submitted_at"]), - ("tt_approval_lines", Inches(6.3), Inches(5.0), ["id, approval_id", "approver_id, order", "role_code, status"]), - ("wbs_versions", Inches(3.3), Inches(5.0), ["id, project_id", "version_number", "effective_date"]), - ] - - for name, x, y, fields in entities: - h = Inches(0.2 + len(fields) * 0.2) - add_multiline_box(slide, x, y, Inches(2.7), h, name, fields, fill_color=LIGHT_BG) - - # DB 테이블 목록 - slide = content_slide(prs, "06-2. 주요 테이블 목록") - db_data = [ - ["테이블", "용도", "주요 컬럼"], - ["users", "사용자 (HR 필드 포함)", "employee_number, business_unit~part (5레벨)"], - ["projects", "프로젝트 (EPC/Other/Non)", "project_code, type, status, pm_user_id"], - ["wbs_versions", "P6 WBS 스냅샷", "version_number, effective_date, source_filename"], - ["wbs_nodes", "WBS 트리 (L1~L5)", "wbs_code, level, parent_id, planned_hours"], - ["canonical_wbs", "정규 WBS", "wbs_code, mapped_p6_code, discipline"], - ["teal_entries", "TEAL Activity", "canonical_wbs_id, activity_code, activity_name"], - ["timesheets", "주간 시수 헤더", "user_id, week_start_date, status, total_hours"], - ["timesheet_entries", "일별 시수 상세", "entry_type, entry_date, hours, remark"], - ["tt_approvals", "결재 요청", "timesheet_id, requester_id, status"], - ["tt_approval_lines", "결재 라인 (DL/PM)", "approver_id, approval_order, role_code"], - ["work_rules", "근무 규칙", "location_code, min_daily, max_weekly"], - ["overhead_types", "Overhead 유형", "code, name (SA 관리)"], - ["project_assignments", "인력 배정", "project_id, user_id, discipline"], - ] - add_table(slide, Inches(0.2), Inches(1.0), Inches(9.6), - db_data, col_widths=[Inches(2), Inches(2.5), Inches(4.5)]) - - # ============================================================ - # 07. API 설계 - # ============================================================ - section_slide(prs, 7, "API 설계", "REST API 79개 — /api/wtm/ prefix") - - slide = content_slide(prs, "07. REST API 스펙 (79개, /api/wtm/)") - api_data = [ - ["모듈", "PH1-1", "PH1-2", "PH2", "합계", "주요 Endpoint"], - ["Auth", "8", "0", "0", "8", "/auth/login, /auth/sso, /auth/mfa/*"], - ["Users", "7", "1", "0", "8", "/users, /users/upload/internal"], - ["Projects", "7", "0", "0", "7", "/projects, /projects/my, /projects/{id}/members"], - ["WBS", "6", "1", "0", "7", "/projects/{id}/wbs/upload, /canonical-wbs"], - ["TEAL", "4", "0", "0", "4", "/projects/{id}/teal/active"], - ["Timesheets", "8", "0", "0", "8", "/timesheets/week, /entries/batch, /upload"], - ["Approvals", "7", "1", "0", "8", "/approvals/unified/action/{type}/{id}/*"], - ["Reports", "4", "2", "3", "9", "/reports/project-hours, /wbs-hours"], - ["Resource", "8", "0", "0", "8", "/projects/{id}/assignments"], - ["Config", "4", "0", "0", "4", "/overhead-types, /work-rules"], - ["Integration", "1", "1", "1", "3", "/integration/hr/sync, /cognite/export"], - ["Notification", "3", "0", "0", "3", "/notifications/stream (SSE)"], - ["합계", "67", "6", "6", "79", ""], - ] - add_table(slide, Inches(0.2), Inches(1.0), Inches(9.6), - api_data, col_widths=[Inches(1.2), Inches(0.7), Inches(0.7), Inches(0.7), Inches(0.7), Inches(5)]) - - # ============================================================ - # 08. 화면 구성 - # ============================================================ - section_slide(prs, 8, "화면 구성", "전체 49개 화면 — PH1-1차 26 / PH1-2차 11 / PH2 12") - - slide = content_slide(prs, "08. 전체 화면 목록 (49개)") - screen_data = [ - ["그룹", "PH1-1차 (26개)", "PH1-2차 (11개)", "PH2 (12개)"], - ["로그인/인증", "로그인, SSO, PW찾기, PW만료 (4)", "", ""], - ["홈/권한", "역할별 홈 5종 (5)", "권한라우팅, SA로그 (2)", ""], - ["사용자/인력", "내부/외주 업로드, 관리 (3)", "", "외주 개별입력 (1)"], - ["프로젝트/WBS", "등록, P6, WBS, TEAL 등 (6)", "WBS비교, 시수조회 (3)", ""], - ["시수 입력", "Non/Other/EPC 입력, Excel (4)", "EPC Revision (1)", "벤치마킹, Rate (2)"], - ["결재", "결재요청, 목록, 일괄승인 (3)", "초과알림, MFA (2)", ""], - ["리포트", "프로젝트별, WBS별 (2)", "Phase비율, NP비율 (2)", "RCP 3종, Discipline 등 (5)"], - ["기타", "", "HR배치 (1)", "외주포털, Favorite 등 (4)"], - ] - add_table(slide, Inches(0.2), Inches(1.0), Inches(9.6), - screen_data, col_widths=[Inches(1.5), Inches(3), Inches(2.5), Inches(2.5)]) - - # ============================================================ - # 09. 인터페이스 설계 - # ============================================================ - section_slide(prs, 9, "인터페이스 설계", "SAP BTP (HR), P6 (WBS 파일), Cognite (Export)") - - slide = content_slide(prs, "09. 외부 시스템 인터페이스") - - # SAP BTP - add_multiline_box(slide, Inches(0.3), Inches(1.0), Inches(2.5), Inches(2), - "SAP SuccessFactors", [ - "HR Master Data", - "Employee Central", - "OData API" - ], fill_color=RGBColor(255, 245, 220)) - - add_textbox(slide, Inches(2.8), Inches(1.7), Inches(0.8), Inches(0.3), - "→ BTP →", font_size=10, color=ACCENT, bold=True, align=PP_ALIGN.CENTER) - - add_multiline_box(slide, Inches(3.6), Inches(1.0), Inches(2.5), Inches(2), - "SAP BTP (CPI)", [ - "OData → REST 변환", - "필드 매핑", - "일 1회 배치 (PH1-2)", - "실시간 이벤트 (PH2)" - ], fill_color=RGBColor(240, 235, 255)) - - add_textbox(slide, Inches(6.1), Inches(1.7), Inches(0.5), Inches(0.3), - "→", font_size=14, color=ACCENT, bold=True, align=PP_ALIGN.CENTER) - - add_multiline_box(slide, Inches(6.6), Inches(1.0), Inches(3), Inches(2), - "WTM Spring Boot", [ - "POST /api/wtm/integration/hr/sync", - "HrSyncService", - "사용자 자동 동기화", - "PH1-1: Excel 수동 업로드" - ], fill_color=RGBColor(230, 240, 255)) - - # P6 - add_box(slide, Inches(0.3), Inches(3.5), Inches(2.5), Inches(0.7), - "P6 (WBS Export)\n파일 기반 (No I/F)", fill_color=RGBColor(255, 245, 220), - font_color=DARK, font_size=9) - - add_textbox(slide, Inches(2.8), Inches(3.65), Inches(1), Inches(0.3), - "→ 파일 →", font_size=9, color=ACCENT, bold=True, align=PP_ALIGN.CENTER) - - add_box(slide, Inches(3.8), Inches(3.5), Inches(3), Inches(0.7), - "WTM: P6 WBS 파서\nPM 업로드 → PCM 승인", fill_color=RGBColor(230, 240, 255), - font_color=DARK, font_size=9) - - # Cognite - add_box(slide, Inches(0.3), Inches(4.5), Inches(2.5), Inches(0.7), - "Cognite (PH2)\nExtractor 서버", fill_color=RGBColor(255, 245, 220), - font_color=DARK, font_size=9) - - add_textbox(slide, Inches(2.8), Inches(4.65), Inches(1), Inches(0.3), - "← Export", font_size=9, color=ACCENT, bold=True, align=PP_ALIGN.CENTER) - - add_box(slide, Inches(3.8), Inches(4.5), Inches(5.5), Inches(0.7), - "Export: Employee + Project + WBS + Time Fact + Mapping Version Metadata", - fill_color=RGBColor(230, 240, 255), font_color=DARK, font_size=8) - - # ============================================================ - # 10. 보안 설계 - # ============================================================ - section_slide(prs, 10, "보안 설계", "한화오션 표준 보안 SW 12종, Azure Entra ID SSO + MFA") - - slide = content_slide(prs, "10. 한화오션 표준 보안 SW") - sec_data = [ - ["분류", "SW", "용도", "구성"], - ["서버 보안", "HIWARE", "서버 접근 제어", "Agent 설치"], - ["서버 보안", "V3 (AhnLab)", "서버 백신", "Agent 설치"], - ["서버 보안", "Secuver TOS", "파일 무결성", "Agent 설치"], - ["DB 보안", "Cubeone", "DB 암호화 (컬럼)", "연동"], - ["DB 보안", "Dbsafer", "DB 접근 제어/감사", "Proxy"], - ["클라우드", "Azure Defender", "위협 탐지", "Native"], - ["모니터링", "onTune", "SMS (서버)", "Agent"], - ["모니터링", "Maxguage", "DB 모니터링", "Proxy"], - ["모니터링", "Jennifer", "WAS APM", "-javaagent"], - ["인증", "Azure Entra ID", "SSO + Conditional Access", "OAuth2 OIDC"], - ["인증", "TOTP (MFA)", "외부사용자 2-Way 인증", "Google/MS Auth"], - ] - add_table(slide, Inches(0.3), Inches(1.0), Inches(9.4), - sec_data, col_widths=[Inches(1.3), Inches(2), Inches(3), Inches(2.5)]) - - # ============================================================ - # 11. 단계별 추진 일정 - # ============================================================ - section_slide(prs, 11, "단계별 추진 일정", "PH1-1차(9주) + PH1-2차(4주) = 15 M/M") - - slide = content_slide(prs, "11-1. 전체 일정 (Gantt)") - - # Gantt-like 도식 - months = ["4월", "5월", "6월", "7월~"] - mx = 2.5 - for m in months: - add_box(slide, Inches(mx), Inches(1.0), Inches(1.8), Inches(0.35), - m, fill_color=PRIMARY, font_color=WHITE, font_size=10) - mx += 1.8 - - phases = [ - ("분석·설계", 2.5, 2.5, RGBColor(100, 160, 230)), - ("BE 개발", 3.0, 5.5, RGBColor(70, 140, 200)), - ("FE 개발", 3.5, 5.0, RGBColor(90, 170, 220)), - ("QA·UAT", 6.5, 2.0, RGBColor(230, 160, 60)), - ("PH1-2차", 6.1, 3.6, RGBColor(140, 200, 140)), - ] - gy = 1.6 - for name, start, width, color in phases: - add_box(slide, Inches(start), Inches(gy), Inches(width), Inches(0.35), - name, fill_color=color, font_color=WHITE, font_size=9) - gy += 0.45 - - # 마일스톤 - milestones = [ - ("4/10", "설계 확정"), - ("5/7", "BE API 완료"), - ("5/20", "FE 완료"), - ("5/31", "★ PH1-1 오픈"), - ("6/30", "★ PH1-2 오픈"), - ] - add_textbox(slide, Inches(0.5), Inches(4.0), Inches(9), Inches(0.3), - "주요 마일스톤", font_size=12, color=PRIMARY, bold=True) - my = 4.4 - for date, desc in milestones: - add_textbox(slide, Inches(0.5), Inches(my), Inches(1.5), Inches(0.25), - date, font_size=10, color=ACCENT, bold=True) - add_textbox(slide, Inches(2.0), Inches(my), Inches(7), Inches(0.25), - desc, font_size=10, color=DARK) - my += 0.3 - - # 인력 투입 - slide = content_slide(prs, "11-2. 인력 투입 계획") - manpower = [ - ["역할", "PH1-1차 (9주)", "PH1-2차 (4주)", "담당"], - ["BE 시니어 / 기술리드", "2.0 M/M", "1.0 M/M", "아키텍처, SSO, 결재, 코드리뷰"], - ["풀스택 엔지니어 ①", "2.0 M/M", "1.0 M/M", "WBS, TEAL, 프로젝트"], - ["풀스택 엔지니어 ②", "2.0 M/M", "1.0 M/M", "시수 입력 3종, 규칙 엔진"], - ["풀스택 엔지니어 ③", "2.0 M/M", "1.0 M/M", "리포트, 로그인, 사용자"], - ["DevOps (파트타임)", "1.0 M/M", "0.5 M/M", "Azure 인프라, CI/CD"], - ["QA 겸임", "1.0 M/M", "0.5 M/M", "통합테스트, UAT 지원"], - ["합계", "~10.0 M/M", "~5.0 M/M", "총 PH1: ~15 M/M"], - ] - add_table(slide, Inches(0.3), Inches(1.0), Inches(9.4), - manpower, col_widths=[Inches(2.2), Inches(1.5), Inches(1.5), Inches(4)]) - - # ============================================================ - # 마지막 - # ============================================================ - slide = prs.slides.add_slide(prs.slide_layouts[6]) - bg = slide.background.fill - bg.solid() - bg.fore_color.rgb = PRIMARY - add_textbox(slide, Inches(1), Inches(2.5), Inches(8), Inches(1), - "감사합니다", font_size=36, color=WHITE, bold=True, align=PP_ALIGN.CENTER) - add_textbox(slide, Inches(1), Inches(3.8), Inches(8), Inches(0.5), - "한화오션 EPU Time Tracking 시스템을\n함께 성공적으로 완수하겠습니다.", - font_size=14, color=RGBColor(180, 200, 230), align=PP_ALIGN.CENTER) - add_textbox(slide, Inches(1), Inches(5), Inches(8), Inches(0.5), - "아큐라시스템 | accura@accurasoft.co.kr", - font_size=12, color=RGBColor(150, 170, 200), align=PP_ALIGN.CENTER) - - prs.save(OUTPUT) - size_kb = os.path.getsize(OUTPUT) // 1024 - try: - print(f"Generated: {OUTPUT} ({size_kb} KB)") - except UnicodeEncodeError: - print(f"Generated: PPT ({size_kb} KB)") - - -if __name__ == "__main__": - build() diff --git a/wbx-spring-core/docs/regenerate_pdfs.py b/wbx-spring-core/docs/regenerate_pdfs.py deleted file mode 100644 index 9650080..0000000 --- a/wbx-spring-core/docs/regenerate_pdfs.py +++ /dev/null @@ -1,372 +0,0 @@ -""" -WBX Spring Framework PDF 가이드 재생성 스크립트. -Docker/Redis → Embedded Redis 변경 사항 반영. - -사용법: python regenerate_pdfs.py -""" -import os -import copy -from PyPDF2 import PdfReader, PdfWriter -from fpdf import FPDF - -DOCS_DIR = os.path.dirname(os.path.abspath(__file__)) -FONT_PATH = r"C:\Windows\Fonts\malgun.ttf" -FONT_BOLD_PATH = r"C:\Windows\Fonts\malgunbd.ttf" - - -class KoreanPDF(FPDF): - """Korean-capable PDF with consistent styling.""" - - def __init__(self): - super().__init__() - self.add_font("malgun", "", FONT_PATH) - self.add_font("malgun", "B", FONT_BOLD_PATH) - self.set_auto_page_break(auto=True, margin=20) - - def header_line(self, title): - self.set_font("malgun", "B", 9) - self.set_text_color(100, 100, 100) - self.cell(0, 6, title, ln=True) - self.set_draw_color(30, 60, 120) - self.set_line_width(0.5) - self.line(10, self.get_y(), 200, self.get_y()) - self.ln(4) - - def section_title(self, text): - self.set_font("malgun", "B", 14) - self.set_text_color(30, 60, 120) - self.cell(0, 10, text, ln=True) - self.ln(2) - - def sub_title(self, text): - self.set_font("malgun", "B", 11) - self.set_text_color(40, 40, 40) - self.cell(0, 8, text, ln=True) - self.ln(1) - - def body(self, text): - self.set_font("malgun", "", 10) - self.set_text_color(60, 60, 60) - self.multi_cell(0, 6, text) - self.ln(2) - - def code_block(self, text): - self.set_fill_color(245, 245, 245) - self.set_font("malgun", "", 9) - self.set_text_color(40, 40, 40) - x = self.get_x() - self.set_x(x + 5) - self.multi_cell(180, 5.5, text, fill=True) - self.ln(3) - - def bullet(self, text): - self.set_font("malgun", "", 10) - self.set_text_color(60, 60, 60) - x = self.get_x() - self.set_x(x + 5) - self.cell(5, 6, "\u2022") - self.multi_cell(170, 6, text) - - def note_box(self, text): - self.set_fill_color(255, 248, 220) - self.set_draw_color(200, 180, 100) - self.set_font("malgun", "B", 9) - self.set_text_color(120, 90, 0) - y = self.get_y() - self.rect(12, y, 186, 20, style="DF") - self.set_xy(15, y + 3) - self.multi_cell(180, 5, text) - self.set_y(y + 23) - - def page_number(self): - self.set_y(-15) - self.set_font("malgun", "", 8) - self.set_text_color(150, 150, 150) - self.cell(0, 10, f"- {self.page_no()} -", align="C") - - -def replace_pages(src_path, replacements, out_path): - """Replace specific pages in a PDF with new fpdf2-generated pages. - - replacements: dict of {page_index: fpdf_generation_function} - """ - reader = PdfReader(src_path) - writer = PdfWriter() - - # Generate replacement pages - replacement_pages = {} - for page_idx, gen_func in replacements.items(): - pdf = gen_func() - tmp = os.path.join(DOCS_DIR, f"_tmp_page_{page_idx}.pdf") - pdf.output(tmp) - tmp_reader = PdfReader(tmp) - replacement_pages[page_idx] = tmp_reader.pages[0] - - # Build output - for i, page in enumerate(reader.pages): - if i in replacement_pages: - writer.add_page(replacement_pages[i]) - else: - writer.add_page(page) - - with open(out_path, "wb") as f: - writer.write(f) - - # Cleanup temp files - for page_idx in replacements: - tmp = os.path.join(DOCS_DIR, f"_tmp_page_{page_idx}.pdf") - if os.path.exists(tmp): - os.remove(tmp) - - print(f" [OK] {os.path.basename(out_path)}") - - -# ============================================================ -# 1. 설치가이드_OnPremise.pdf — Page 3 (requirements), Page 9 (Redis) -# ============================================================ - -def onprem_page3(): - """Page 3: 사전 요구사항 - Redis를 선택으로 변경.""" - pdf = KoreanPDF() - pdf.add_page() - pdf.header_line("WBX Spring Framework | On-Premise 설치 가이드") - pdf.section_title("1. 사전 요구사항 \u00b7 서버 사양") - - pdf.sub_title("1-1. 최소 서버 사양") - pdf.body("항목 최소 사양 권장 사양\n" - "OS RHEL 8+ / Ubuntu 22.04+ RHEL 9 / Rocky Linux 9\n" - "CPU 4 vCPU 8 vCPU\n" - "RAM 8 GB 16 GB\n" - "Disk 50 GB SSD 100 GB SSD (RAID)\n" - "Network 1 Gbps 10 Gbps") - - pdf.sub_title("1-2. 필수 소프트웨어") - pdf.body("소프트웨어 버전 용도\n" - "JDK 21 (Temurin LTS) Spring Boot 런타임\n" - "DB Oracle 19c+ 등 애플리케이션 데이터\n" - "Nginx 1.24+ 리버스 프록시, SSL") - - pdf.sub_title("1-2b. 선택 소프트웨어") - pdf.body("소프트웨어 버전 용도\n" - "Redis 7.x 캐시 (미설치 시 Embedded Redis 자동 구동)") - pdf.note_box("NOTE: Redis를 별도 설치하지 않아도 WBX Spring에 내장된 Embedded Redis가\n" - "자동으로 시작됩니다. 운영 환경에서는 성능을 위해 외부 Redis 설치를 권장합니다.") - - pdf.sub_title("1-3. 네트워크 포트") - pdf.body("포트 서비스 접근 범위 비고\n" - "443 HTTPS 외부 Nginx SSL\n" - "80 HTTP 외부->443 리다이렉트\n" - "8080 Spring Boot 내부 Nginx에서만 접근\n" - "8081 wtm-api 내부 WTM 프로젝트\n" - "3306 MySQL 내부 DB 선택에 따라\n" - "5432 PostgreSQL 내부 \n" - "1521 Oracle 내부 \n" - "1433 MSSQL 내부 \n" - "6379 Redis 내부 선택 (Embedded Redis 자동 대체)") - - pdf.page_number() - return pdf - - -def onprem_page9(): - """Page 9: Redis 설치 섹션 재작성.""" - pdf = KoreanPDF() - pdf.add_page() - pdf.header_line("WBX Spring Framework | On-Premise 설치 가이드") - pdf.section_title("5. Redis 설치 (선택)") - - pdf.note_box("WBX Spring Framework에는 Embedded Redis가 내장되어 있어 별도 설치 없이도\n" - "앱이 정상 구동됩니다. 운영 환경에서 높은 성능이 필요한 경우에만 설치하세요.") - - pdf.sub_title("5-1. Embedded Redis (기본 — 설치 불필요)") - pdf.body("앱 시작 시 다음 순서로 자동 동작합니다:") - pdf.bullet("외부 Redis 감지 시 -> 외부 Redis 사용 (운영 환경)") - pdf.bullet("외부 Redis 없음 -> Embedded Redis 자동 시작 (개발/소규모 운영)") - pdf.bullet("Embedded Redis 실패 -> 인메모리 캐시 전환 (최후 안전장치)") - pdf.ln(3) - - pdf.sub_title("5-2. 외부 Redis 설치 (선택 — 대규모 운영 환경 권장)") - pdf.code_block( - "sudo dnf install -y redis\n" - "sudo systemctl enable --now redis\n\n" - "# 보안: bind + password\n" - "sudo sed -i 's/^bind .*/bind 127.0.0.1/' /etc/redis/redis.conf\n" - "echo 'requirepass RedisP@ss123' | sudo tee -a /etc/redis/redis.conf\n" - "sudo systemctl restart redis\n\n" - "# 확인\n" - "redis-cli -a RedisP@ss123 ping # PONG" - ) - - pdf.sub_title("5-3. .env 설정 (외부 Redis 사용 시)") - pdf.code_block( - "SPRING_DATA_REDIS_HOST=127.0.0.1\n" - "# 또는 원격 Redis 서버 주소\n" - "# SPRING_DATA_REDIS_HOST=redis.company.com" - ) - - pdf.page_number() - return pdf - - -# ============================================================ -# 2. 개발자가이드.pdf — Page 3 (사전 준비), Page 4 (Docker Compose) -# ============================================================ - -def dev_page3(): - """Page 3: 개발환경 설정 - Docker/Redis 부분 수정.""" - pdf = KoreanPDF() - pdf.add_page() - pdf.header_line("WBX Spring Framework | 개발자 가이드") - pdf.section_title("Chapter 0. 개발환경 설정 - IDE \u00b7 프로젝트 생성") - - pdf.sub_title("0-1. 사전 준비") - pdf.bullet("JDK 21 설치 (Eclipse Temurin 권장)") - pdf.bullet("Git 설치 (git config user.name / user.email)") - pdf.bullet("Docker Desktop 설치 (선택 - 로컬 DB 컨테이너 사용 시에만)") - pdf.bullet("IDE 설치 (아래 택 1)") - pdf.ln(2) - - pdf.note_box("NOTE: Redis는 Embedded Redis가 앱과 함께 자동 시작되므로 별도 설치가 필요\n" - "없습니다. Docker Desktop도 DB를 직접 설치하면 불필요합니다.") - - pdf.sub_title("온보딩 플로우") - pdf.body("1) JDK 설치 -> 2) IDE 설정 -> 3) DB 준비 -> 4) 프로젝트 생성 -> 5) bootRun -> 6) Swagger 확인") - - pdf.sub_title("0-2. IDE 선택 가이드") - pdf.body("IDE 권장 대상 핵심 장점\n" - "IntelliJ IDEA 메인 개발 Spring Boot 최적, 리팩터링, DB 브라우저\n" - "VS Code 경량/FE 병행 Extension Pack, DevContainer\n" - "Eclipse/STS 무료/레거시 Spring Tool Suite 플러그인") - - pdf.sub_title("0-3. IntelliJ IDEA 필수 설정") - pdf.bullet("플러그인: Spring Boot, Lombok, JPA Buddy, GitToolBox, .env, SonarLint") - pdf.bullet("Annotation Processor 활성화 (Settings > Build > Compiler)") - pdf.bullet("Hot Reload: Build project automatically + Allow auto-make") - pdf.ln(1) - pdf.code_block( - "Run Configuration:\n" - " Main class: kr.co.accura.wbx.spring.WbxSpringCoreApplication\n" - " Env: JWT_SECRET=dev-secret-key" - ) - - pdf.sub_title("0-4. VS Code 필수 설정") - pdf.bullet("Extension: Java Pack, Spring Boot Pack, Lombok, Gradle, REST Client, GitLens") - pdf.bullet(".vscode/settings.json - Lombok, Gradle Wrapper, 포맷터 설정") - pdf.bullet(".vscode/launch.json - Spring Boot 디버깅 프로필 (local, test)") - - pdf.page_number() - return pdf - - -def dev_page4(): - """Page 4: Docker Compose 및 프로젝트 생성 - Redis 부분 수정.""" - pdf = KoreanPDF() - pdf.add_page() - pdf.header_line("WBX Spring Framework | 개발자 가이드") - - pdf.code_block( - '// .vscode/launch.json\n' - '{\n' - ' "type": "java",\n' - ' "name": "App (Local)",\n' - ' "mainClass": "kr.co.accura.wbx.spring.WbxSpringCoreApplication",\n' - ' "env": {"JWT_SECRET": "dev-secret-key"}\n' - '}' - ) - - pdf.sub_title("0-5. Eclipse / STS 설정") - pdf.bullet("Spring Tools 4 플러그인 설치 (Eclipse Marketplace)") - pdf.bullet("Lombok 설치: java -jar lombok.jar -> Eclipse 경로 선택") - pdf.bullet("Gradle Import: File > Import > Existing Gradle Project") - pdf.bullet("Annotation Processor: Project Properties > Java Compiler 에서 활성화") - pdf.ln(2) - - pdf.sub_title("0-6. 프로젝트 생성 (3가지 방법)") - pdf.body("방법 A: Spring Initializr (start.spring.io)") - pdf.code_block("Project: Gradle-Kotlin | Java: 21 | Boot: 3.5.0\n" - "Group: kr.co.accura | Artifact: {앱}-api\n" - "-> Generate -> 압축 해제 -> wbx-spring-starter 의존성 추가") - pdf.body("방법 B: Git Template Repository") - pdf.code_block("git clone https://git.wbx.kr/accura/wbx-spring-template.git my-app\n" - "cd my-app && ./init.sh --name my-app --group kr.co.accura") - - pdf.sub_title("0-7. 설치 스크립트 (권장)") - pdf.body("프로젝트에 포함된 설치 스크립트가 JDK 자동 설치, Git 사전 검사, 빌드, .env 템플릿 생성을 자동 처리합니다.") - pdf.code_block("# Windows\nscripts\\install.bat\n\n# Linux/macOS\nchmod +x scripts/install.sh && ./scripts/install.sh") - pdf.body("TIP: JDK 미설치 시 스크립트가 자동으로 설치합니다.") - - pdf.sub_title("0-8. 로컬 개발 인프라") - pdf.body("Redis는 Embedded Redis가 앱 시작 시 자동 구동되므로 별도 설치가 필요 없습니다.\n" - "DB만 Docker Compose 또는 직접 설치하면 됩니다.") - pdf.code_block("# Docker로 DB만 시작 (Redis 불필요)\n" - "docker compose -f docker-compose-dev.yml up -d mysql\n\n" - "# 또는 DB를 직접 설치한 경우 바로 앱 실행\n" - "gradlew.bat bootRun") - pdf.note_box("Embedded Redis 동작: 앱 시작 시 외부 Redis 감지 -> 없으면 자동 시작 -> 실패 시 인메모리 캐시") - - pdf.page_number() - return pdf - - -def dev_page5(): - """Page 5: DevContainer + 코드 품질 도구 - Redis 부분 수정.""" - pdf = KoreanPDF() - pdf.add_page() - pdf.header_line("WBX Spring Framework | 개발자 가이드") - - pdf.sub_title("0-9. DevContainer (VS Code)") - pdf.body("devcontainer.json 으로 JDK 21 + DB가 포함된 완전한 개발 환경을 컨테이너로 제공합니다.\n" - "Redis는 Embedded Redis가 자동 구동되므로 DevContainer에 별도 포함하지 않아도 됩니다.\n" - "팀원 전체 동일 환경 보장.") - - pdf.sub_title("0-10. 코드 품질 도구") - pdf.bullet("Spotless - 코드 포맷 자동화 (./gradlew spotlessApply)") - pdf.bullet("CheckStyle - 코드 규칙 검사") - pdf.bullet("JaCoCo - 테스트 커버리지 (최소 70%)") - pdf.bullet("SonarLint - IDE 실시간 코드 분석") - pdf.bullet(".editorconfig - IDE 공통 코드 스타일 (UTF-8, LF, 4 spaces)") - - pdf.page_number() - return pdf - - -# ============================================================ -# Main -# ============================================================ - -def main(): - print("WBX Spring Framework PDF 가이드 재생성") - print("=" * 50) - - # 1. 설치가이드_OnPremise.pdf - print("\n[1] 설치가이드_OnPremise.pdf") - src = os.path.join(DOCS_DIR, "WBX_Spring_Framework_설치가이드_OnPremise.pdf") - out = os.path.join(DOCS_DIR, "WBX_Spring_Framework_설치가이드_OnPremise.pdf") - replace_pages(src, { - 2: onprem_page3, # Page 3: 사전 요구사항 (Redis 선택으로) - 8: onprem_page9, # Page 9: Redis 설치 (Embedded Redis 안내) - }, out) - - # 2. 설치가이드_Cloud.pdf — 변경 없음 (클라우드 관리형 Redis 사용) - print("\n[2] 설치가이드_Cloud.pdf") - print(" [SKIP] 클라우드 환경은 관리형 Redis(Azure Cache/ElastiCache) 사용 - 변경 불필요") - - # 3. 개발자가이드.pdf - print("\n[3] 개발자가이드.pdf") - src = os.path.join(DOCS_DIR, "WBX_Spring_Framework_개발자가이드.pdf") - out = os.path.join(DOCS_DIR, "WBX_Spring_Framework_개발자가이드.pdf") - replace_pages(src, { - 2: dev_page3, # Page 3: 사전 준비 (Docker/Redis 선택) - 3: dev_page4, # Page 4: Docker Compose (Redis 불필요) - 4: dev_page5, # Page 5: DevContainer (Redis 제외) - }, out) - - print("\n" + "=" * 50) - print("완료! 변경된 PDF:") - print(" - WBX_Spring_Framework_설치가이드_OnPremise.pdf (Page 3, 9)") - print(" - WBX_Spring_Framework_개발자가이드.pdf (Page 3, 4, 5)") - print(" - WBX_Spring_Framework_설치가이드_Cloud.pdf (변경 없음)") - - -if __name__ == "__main__": - main() diff --git a/wbx-spring-core/docs/개발환경_사전설치_가이드.txt b/wbx-spring-core/docs/개발환경_사전설치_가이드.txt index 158660f..8a8f198 100644 --- a/wbx-spring-core/docs/개발환경_사전설치_가이드.txt +++ b/wbx-spring-core/docs/개발환경_사전설치_가이드.txt @@ -120,7 +120,46 @@ GRANT ALL ON mos.* TO 'jsh'@'%'; - [2-3] Redis (설치 불필요) + [2-3] Node.js (프론트엔드 개발 시 필요) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 용도: WTM 프론트엔드 개발 서버 실행 (Vue 3 또는 React 18) + + * Windows + winget install --id OpenJS.NodeJS.LTS + + * macOS + brew install node@22 + + * Linux + curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash - + sudo apt install -y nodejs + + 설치 확인: + node -v → v22.x.x + npm -v → 10.x.x + + 프론트엔드 선택: + +----------------------+------------------+----------+---------------------+ + | 프로젝트 | 프레임워크 | 포트 | UI 라이브러리 | + +----------------------+------------------+----------+---------------------+ + | wtm-frontend-vue | Vue 3 + Vite | 5173 | PrimeVue 4 | + | wtm-frontend-react | React 18 + Vite | 5174 | PrimeReact 10 | + +----------------------+------------------+----------+---------------------+ + + 두 프론트엔드는 동일한 백엔드 API(wtm-api :8081)에 연결됩니다. + 프로젝트 상황에 맞는 프레임워크를 선택하세요. + + 빠른 시작: + # Vue 3 버전 + cd wtm-frontend-vue + npm install && npm run dev → http://localhost:5173 + + # React 18 버전 + cd wtm-frontend-react + npm install && npm run dev → http://localhost:5174 + + + [2-4] Redis (설치 불필요) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 용도: 캐시, 세션 저장소 @@ -178,6 +217,17 @@ http://localhost:8081/swagger-ui → WTM API 문서 http://localhost:8081/admin/login → WTM 관리 콘솔 + [WTM 프론트엔드 실행 — Vue 3 또는 React 18 중 택 1] + # Vue 3 버전 + cd wtm-frontend-vue + npm install && npm run dev + http://localhost:5173 → WTM 프론트엔드 (Vue 3) + + # React 18 버전 + cd wtm-frontend-react + npm install && npm run dev + http://localhost:5174 → WTM 프론트엔드 (React 18) + [방법 B] DB 직접 설치 (Docker 없이) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -228,7 +278,7 @@ [환경별 수정] SPRING_PROFILES_ACTIVE 프로필 조합 (아래 참고) DB_HOST / DB_PORT DB 서버 주소 - CORS_ORIGINS 프론트엔드 URL + CORS_ORIGINS 프론트엔드 URL (Vue: 5173, React: 5174) [프로필 조합 예시] 로컬 개발 (MySQL) : local,mysql @@ -250,7 +300,8 @@ | 3306 | MySQL | 기본 DB (mysql 프로필) | | 5432 | PostgreSQL | 대안 DB (postgresql 프로필) | | 6379 | Redis | Embedded Redis 자동 구동 (별도 설치 불필요)| - | 5173 | wtm-frontend | Vue 3 개발 서버 | + | 5173 | wtm-frontend-vue | Vue 3 개발 서버 | + | 5174 | wtm-frontend-react| React 18 개발 서버 | | 8001 | WBX FastAPI | 선택, 그룹웨어 동시 운영 시 | +--------+------------------+------------------------------------------+ @@ -285,6 +336,19 @@ A: netstat -ano | findstr :8080 으로 프로세스 확인 후 종료 또는 application.yml에서 server.port 변경 + Q: 프론트엔드(Vue/React) npm install 실패 + A: Node.js 22 LTS가 설치되어 있는지 확인: node -v + node_modules 삭제 후 재설치: rm -rf node_modules && npm install + + Q: 프론트엔드에서 API 호출 시 CORS 에러 + A: wtm-api의 application.yml에서 CORS 설정 확인: + cors.allowed-origins에 http://localhost:5173, http://localhost:5174 포함 필요 + 또는 .env에서 CORS_ORIGINS 설정 + + Q: Vue(5173)와 React(5174) 동시 실행 가능한가? + A: 네, 포트가 다르므로 동시 실행 가능합니다. 둘 다 동일한 wtm-api(:8081)에 + 연결되며 API 프록시가 각각 설정되어 있습니다. + -------------------------------------------------------------------------------- 8. 참고 문서 diff --git a/wtm-frontend/.env b/wtm-frontend-react/.env similarity index 100% rename from wtm-frontend/.env rename to wtm-frontend-react/.env diff --git a/wtm-frontend/.env.development b/wtm-frontend-react/.env.development similarity index 100% rename from wtm-frontend/.env.development rename to wtm-frontend-react/.env.development diff --git a/wtm-frontend/.env.production b/wtm-frontend-react/.env.production similarity index 100% rename from wtm-frontend/.env.production rename to wtm-frontend-react/.env.production diff --git a/wtm-frontend-react/index.html b/wtm-frontend-react/index.html new file mode 100644 index 0000000..158e5e5 --- /dev/null +++ b/wtm-frontend-react/index.html @@ -0,0 +1,13 @@ + + + + + + + WTM - Work Time Manager + + +

+ + + diff --git a/wtm-frontend-react/package.json b/wtm-frontend-react/package.json new file mode 100644 index 0000000..4feeffb --- /dev/null +++ b/wtm-frontend-react/package.json @@ -0,0 +1,38 @@ +{ + "name": "wtm-frontend-react", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview", + "lint": "eslint ." + }, + "dependencies": { + "axios": "^1.7.9", + "chart.js": "^4.4.7", + "primeicons": "^7.0.0", + "primereact": "^10.8.5", + "react": "^18.3.1", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.3.1", + "react-router-dom": "^6.28.0", + "zustand": "^5.0.2" + }, + "devDependencies": { + "@eslint/js": "^9.16.0", + "@types/node": "^25.5.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.16.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "sass": "^1.82.0", + "typescript": "~5.6.3", + "typescript-eslint": "^8.18.0", + "vite": "^6.0.5" + } +} diff --git a/wtm-frontend-react/src/app/App.tsx b/wtm-frontend-react/src/app/App.tsx new file mode 100644 index 0000000..55c71af --- /dev/null +++ b/wtm-frontend-react/src/app/App.tsx @@ -0,0 +1,6 @@ +import { RouterProvider } from 'react-router-dom'; +import { router } from './router'; + +export default function App() { + return ; +} diff --git a/wtm-frontend-react/src/app/main.tsx b/wtm-frontend-react/src/app/main.tsx new file mode 100644 index 0000000..8715d2d --- /dev/null +++ b/wtm-frontend-react/src/app/main.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { PrimeReactProvider } from 'primereact/api'; +import App from './App'; + +import 'primereact/resources/themes/lara-light-blue/theme.css'; +import 'primereact/resources/primereact.min.css'; +import 'primeicons/primeicons.css'; +import '@/assets/styles/main.scss'; + +const primeReactConfig = { + ripple: true, +}; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + , +); diff --git a/wtm-frontend-react/src/app/router.tsx b/wtm-frontend-react/src/app/router.tsx new file mode 100644 index 0000000..d91fd0e --- /dev/null +++ b/wtm-frontend-react/src/app/router.tsx @@ -0,0 +1,68 @@ +import { lazy, Suspense } from 'react'; +import { createBrowserRouter, Navigate } from 'react-router-dom'; +import { ProgressSpinner } from 'primereact/progressspinner'; +import AppLayout from '@/core/components/AppLayout'; +import AuthGuard from '@/core/components/AuthGuard'; +import NotFoundView from '@/core/components/NotFoundView'; + +// Lazy-loaded views +const LoginView = lazy(() => import('@/modules/auth/views/LoginView')); +const ForgotPasswordView = lazy(() => import('@/modules/auth/views/ForgotPasswordView')); +const ChangePasswordView = lazy(() => import('@/modules/auth/views/ChangePasswordView')); +const DashboardView = lazy(() => import('@/modules/dashboard/views/DashboardView')); +const TimesheetWeekView = lazy(() => import('@/modules/timesheet/views/TimesheetWeekView')); +const TimesheetHistoryView = lazy(() => import('@/modules/timesheet/views/TimesheetHistoryView')); +const TimesheetUploadView = lazy(() => import('@/modules/timesheet/views/TimesheetUploadView')); +const ApprovalPendingView = lazy(() => import('@/modules/approval/views/ApprovalPendingView')); +const ApprovalHistoryView = lazy(() => import('@/modules/approval/views/ApprovalHistoryView')); +const ProjectListView = lazy(() => import('@/modules/project/views/ProjectListView')); +const ProjectDetailView = lazy(() => import('@/modules/project/views/ProjectDetailView')); +const WbsTreeView = lazy(() => import('@/modules/wbs/views/WbsTreeView')); +const TealListView = lazy(() => import('@/modules/teal/views/TealListView')); +const ReportView = lazy(() => import('@/modules/report/views/ReportView')); +const UserListView = lazy(() => import('@/modules/user/views/UserListView')); +const UserDetailView = lazy(() => import('@/modules/user/views/UserDetailView')); +const SettingsView = lazy(() => import('@/modules/settings/views/SettingsView')); + +function SuspenseWrapper({ children }: { children: React.ReactNode }) { + return ( + }> + {children} + + ); +} + +export const router = createBrowserRouter([ + // Auth routes (no layout) + { path: '/login', element: }, + { path: '/forgot-password', element: }, + + // Protected routes (with layout) + { + path: '/', + element: ( + + + + ), + children: [ + { index: true, element: }, + { path: 'dashboard', element: }, + { path: 'change-password', element: }, + { path: 'timesheets', element: }, + { path: 'timesheets/history', element: }, + { path: 'timesheets/upload', element: }, + { path: 'approvals', element: }, + { path: 'approvals/history', element: }, + { path: 'projects', element: }, + { path: 'projects/:id', element: }, + { path: 'wbs', element: }, + { path: 'teal', element: }, + { path: 'reports', element: }, + { path: 'users', element: }, + { path: 'users/:id', element: }, + { path: 'settings', element: }, + { path: '*', element: }, + ], + }, +]); diff --git a/wtm-frontend/src/assets/images/logo.svg b/wtm-frontend-react/src/assets/images/logo.svg similarity index 100% rename from wtm-frontend/src/assets/images/logo.svg rename to wtm-frontend-react/src/assets/images/logo.svg diff --git a/wtm-frontend/src/assets/styles/_form-grid.scss b/wtm-frontend-react/src/assets/styles/_form-grid.scss similarity index 100% rename from wtm-frontend/src/assets/styles/_form-grid.scss rename to wtm-frontend-react/src/assets/styles/_form-grid.scss diff --git a/wtm-frontend-react/src/assets/styles/_overrides.scss b/wtm-frontend-react/src/assets/styles/_overrides.scss new file mode 100644 index 0000000..f9d1ab8 --- /dev/null +++ b/wtm-frontend-react/src/assets/styles/_overrides.scss @@ -0,0 +1 @@ +// PrimeReact theme overrides diff --git a/wtm-frontend-react/src/assets/styles/_variables.scss b/wtm-frontend-react/src/assets/styles/_variables.scss new file mode 100644 index 0000000..b34df23 --- /dev/null +++ b/wtm-frontend-react/src/assets/styles/_variables.scss @@ -0,0 +1,53 @@ +// Breakpoints +$bp-mobile: 576px; +$bp-tablet: 768px; +$bp-desktop: 992px; +$bp-wide: 1200px; +$bp-ultra: 1400px; + +// Layout +$sidebar-width: 260px; +$sidebar-collapsed-width: 64px; +$topbar-height: 56px; +$page-padding-x: 1.5rem; +$page-padding-y: 1.25rem; + +// Spacing (8px base) +$space-xs: 0.25rem; +$space-sm: 0.5rem; +$space-md: 1rem; +$space-lg: 1.5rem; +$space-xl: 2rem; +$space-2xl: 3rem; + +// Typography +$font-size-xs: 0.75rem; +$font-size-sm: 0.875rem; +$font-size-base: 1rem; +$font-size-lg: 1.125rem; +$font-size-xl: 1.25rem; +$font-size-2xl: 1.5rem; + +// Border Radius +$radius-sm: 6px; +$radius-md: 8px; +$radius-lg: 12px; + +// Z-Index +$z-sidebar: 100; +$z-topbar: 110; +$z-overlay: 200; +$z-dialog: 300; +$z-toast: 400; + +// Semantic Colors (PrimeReact tokens) +$color-surface: var(--p-surface-0); +$color-surface-card: var(--p-surface-0); +$color-surface-hover: var(--p-surface-100); +$color-border: var(--p-surface-200); +$color-text: var(--p-text-color); +$color-text-muted: var(--p-text-muted-color); +$color-primary: var(--p-primary-color); +$color-danger: var(--p-red-500); +$color-success: var(--p-green-500); +$color-warning: var(--p-yellow-500); diff --git a/wtm-frontend/src/assets/styles/main.scss b/wtm-frontend-react/src/assets/styles/main.scss similarity index 100% rename from wtm-frontend/src/assets/styles/main.scss rename to wtm-frontend-react/src/assets/styles/main.scss diff --git a/wtm-frontend/src/core/api/api.types.ts b/wtm-frontend-react/src/core/api/api.types.ts similarity index 100% rename from wtm-frontend/src/core/api/api.types.ts rename to wtm-frontend-react/src/core/api/api.types.ts diff --git a/wtm-frontend-react/src/core/api/axios.ts b/wtm-frontend-react/src/core/api/axios.ts new file mode 100644 index 0000000..2a9cf5e --- /dev/null +++ b/wtm-frontend-react/src/core/api/axios.ts @@ -0,0 +1,63 @@ +import axios from 'axios'; +import type { InternalAxiosRequestConfig, AxiosError } from 'axios'; +import { authService } from '@/core/auth/auth.service'; + +const api = axios.create({ + baseURL: import.meta.env.VITE_API_BASE_URL, + timeout: 30000, + headers: { 'Content-Type': 'application/json' }, +}); + +// Request: attach JWT +api.interceptors.request.use((config: InternalAxiosRequestConfig) => { + const token = authService.getAccessToken(); + if (token) config.headers.Authorization = `Bearer ${token}`; + return config; +}); + +// Response: 401 token refresh + retry +let isRefreshing = false; +let failedQueue: Array<{ resolve: (token: string) => void; reject: (error: unknown) => void }> = + []; + +api.interceptors.response.use( + (response) => response, + async (error: AxiosError) => { + const original = error.config as InternalAxiosRequestConfig & { _retry?: boolean }; + + if (error.response?.status === 401 && !original._retry) { + if (isRefreshing) { + return new Promise((resolve, reject) => { + failedQueue.push({ + resolve: (token: string) => { + original.headers.Authorization = `Bearer ${token}`; + resolve(api(original)); + }, + reject, + }); + }); + } + + original._retry = true; + isRefreshing = true; + try { + const newToken = await authService.refreshToken(); + failedQueue.forEach((q) => q.resolve(newToken)); + failedQueue = []; + original.headers.Authorization = `Bearer ${newToken}`; + return api(original); + } catch { + failedQueue.forEach((q) => q.reject(error)); + failedQueue = []; + authService.clearTokens(); + window.location.href = '/login'; + return Promise.reject(error); + } finally { + isRefreshing = false; + } + } + return Promise.reject(error); + }, +); + +export default api; diff --git a/wtm-frontend/src/core/auth/auth.service.ts b/wtm-frontend-react/src/core/auth/auth.service.ts similarity index 100% rename from wtm-frontend/src/core/auth/auth.service.ts rename to wtm-frontend-react/src/core/auth/auth.service.ts diff --git a/wtm-frontend/src/core/auth/auth.types.ts b/wtm-frontend-react/src/core/auth/auth.types.ts similarity index 100% rename from wtm-frontend/src/core/auth/auth.types.ts rename to wtm-frontend-react/src/core/auth/auth.types.ts diff --git a/wtm-frontend-react/src/core/components/AppLayout.scss b/wtm-frontend-react/src/core/components/AppLayout.scss new file mode 100644 index 0000000..1826589 --- /dev/null +++ b/wtm-frontend-react/src/core/components/AppLayout.scss @@ -0,0 +1,31 @@ +@use '@/assets/styles/variables' as *; + +.app-layout { + min-height: 100vh; + background: $color-surface; + + &__overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.4); + z-index: calc(#{$z-sidebar} - 1); + } + + &__main { + transition: margin-left 0.2s ease; + min-height: 100vh; + display: flex; + flex-direction: column; + } + + &__content { + flex: 1; + padding: $page-padding-y $page-padding-x; + padding-top: calc(#{$topbar-height} + #{$page-padding-y}); + + @media (max-width: $bp-mobile) { + padding: $space-sm; + padding-top: calc(#{$topbar-height} + #{$space-sm}); + } + } +} diff --git a/wtm-frontend-react/src/core/components/AppLayout.tsx b/wtm-frontend-react/src/core/components/AppLayout.tsx new file mode 100644 index 0000000..44975fb --- /dev/null +++ b/wtm-frontend-react/src/core/components/AppLayout.tsx @@ -0,0 +1,73 @@ +import { useState, useEffect, useCallback } from 'react'; +import { Outlet, useLocation } from 'react-router-dom'; +import AppSidebar from './AppSidebar'; +import AppTopbar from './AppTopbar'; +import { BREAKPOINTS, LAYOUT } from '@/core/constants/app.constants'; +import './AppLayout.scss'; + +function useWindowWidth() { + const [width, setWidth] = useState(window.innerWidth); + useEffect(() => { + const handler = () => setWidth(window.innerWidth); + window.addEventListener('resize', handler); + return () => window.removeEventListener('resize', handler); + }, []); + return width; +} + +export default function AppLayout() { + const width = useWindowWidth(); + const location = useLocation(); + + const isMobile = width < BREAKPOINTS.tablet; + const isTablet = width >= BREAKPOINTS.tablet && width < BREAKPOINTS.desktop; + + const [sidebarVisible, setSidebarVisible] = useState(!isMobile); + const [sidebarCollapsed, setSidebarCollapsed] = useState(isTablet); + + useEffect(() => { + if (isMobile) { + setSidebarVisible(false); + setSidebarCollapsed(false); + } else { + setSidebarVisible(true); + setSidebarCollapsed(isTablet); + } + }, [isMobile, isTablet]); + + // Close sidebar on route change (mobile) + useEffect(() => { + if (isMobile) setSidebarVisible(false); + }, [location.pathname, isMobile]); + + const toggleSidebar = useCallback(() => { + if (isMobile) { + setSidebarVisible((v) => !v); + } else { + setSidebarCollapsed((c) => !c); + } + }, [isMobile]); + + const contentMarginLeft = isMobile + ? '0' + : sidebarCollapsed + ? `${LAYOUT.sidebarCollapsedWidth}px` + : `${LAYOUT.sidebarWidth}px`; + + return ( +
+ {isMobile && sidebarVisible && ( +
setSidebarVisible(false)} /> + )} + + + +
+ +
+ +
+
+
+ ); +} diff --git a/wtm-frontend-react/src/core/components/AppSidebar.scss b/wtm-frontend-react/src/core/components/AppSidebar.scss new file mode 100644 index 0000000..1810f72 --- /dev/null +++ b/wtm-frontend-react/src/core/components/AppSidebar.scss @@ -0,0 +1,62 @@ +@use '@/assets/styles/variables' as *; + +.app-sidebar { + position: fixed; + top: 0; + left: 0; + height: 100vh; + background: $color-surface-card; + border-right: 1px solid $color-border; + z-index: $z-sidebar; + overflow-y: auto; + overflow-x: hidden; + transition: width 0.2s ease, transform 0.2s ease; + + &--mobile { + transform: translateX(-100%); + width: $sidebar-width !important; + + &.app-sidebar--visible { + transform: translateX(0); + } + } + + &--collapsed { + .app-sidebar__title, + .app-sidebar__nav .p-panelmenu-header-content span, + .app-sidebar__nav .p-menuitem-text { + display: none; + } + } + + &__header { + display: flex; + align-items: center; + gap: $space-sm; + height: $topbar-height; + padding: 0 $space-md; + border-bottom: 1px solid $color-border; + } + + &__logo { + width: 32px; + height: 32px; + flex-shrink: 0; + } + + &__title { + font-size: $font-size-lg; + font-weight: 700; + color: $color-primary; + white-space: nowrap; + } + + &__nav { + padding: $space-sm 0; + } + + &__menu .p-panelmenu { + border: none; + background: transparent; + } +} diff --git a/wtm-frontend-react/src/core/components/AppSidebar.tsx b/wtm-frontend-react/src/core/components/AppSidebar.tsx new file mode 100644 index 0000000..e14a375 --- /dev/null +++ b/wtm-frontend-react/src/core/components/AppSidebar.tsx @@ -0,0 +1,60 @@ +import { useMemo } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { PanelMenu } from 'primereact/panelmenu'; +import { MENU_ITEMS, LAYOUT } from '@/core/constants/app.constants'; +import { useCurrentUser } from '@/core/hooks/useCurrentUser'; +import logo from '@/assets/images/logo.svg'; +import './AppSidebar.scss'; + +interface Props { + visible: boolean; + collapsed: boolean; + mobile: boolean; +} + +export default function AppSidebar({ visible, collapsed, mobile }: Props) { + const { currentUser } = useCurrentUser(); + const navigate = useNavigate(); + + const filteredMenu = useMemo(() => { + const userRoles = currentUser?.roles ?? []; + return MENU_ITEMS + .filter((item) => item.roles.some((r) => userRoles.includes(r))) + .map((item) => ({ + ...item, + command: item.to ? () => navigate(item.to!) : undefined, + items: item.items + ? item.items + .filter((sub) => sub.roles.some((r) => userRoles.includes(r))) + .map((sub) => ({ + ...sub, + command: () => navigate(sub.to), + })) + : undefined, + })); + }, [currentUser, navigate]); + + const sidebarWidth = collapsed ? `${LAYOUT.sidebarCollapsedWidth}px` : `${LAYOUT.sidebarWidth}px`; + + const classNames = [ + 'app-sidebar', + visible && 'app-sidebar--visible', + collapsed && 'app-sidebar--collapsed', + mobile && 'app-sidebar--mobile', + ] + .filter(Boolean) + .join(' '); + + return ( + + ); +} diff --git a/wtm-frontend-react/src/core/components/AppTopbar.scss b/wtm-frontend-react/src/core/components/AppTopbar.scss new file mode 100644 index 0000000..1300ccf --- /dev/null +++ b/wtm-frontend-react/src/core/components/AppTopbar.scss @@ -0,0 +1,39 @@ +@use '@/assets/styles/variables' as *; + +.app-topbar { + position: fixed; + top: 0; + right: 0; + left: 0; + height: $topbar-height; + background: $color-surface-card; + border-bottom: 1px solid $color-border; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 $space-md; + z-index: $z-topbar; + + &__right { + display: flex; + align-items: center; + gap: $space-xs; + } + + &__notify-btn { + position: relative; + } + + &__user-btn { + display: flex; + align-items: center; + gap: $space-sm; + } + + &__username { + font-size: $font-size-sm; + @media (max-width: $bp-tablet) { + display: none; + } + } +} diff --git a/wtm-frontend-react/src/core/components/AppTopbar.tsx b/wtm-frontend-react/src/core/components/AppTopbar.tsx new file mode 100644 index 0000000..bebff5d --- /dev/null +++ b/wtm-frontend-react/src/core/components/AppTopbar.tsx @@ -0,0 +1,47 @@ +import { useRef } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Button } from 'primereact/button'; +import { Avatar } from 'primereact/avatar'; +import { Menu } from 'primereact/menu'; +import { useCurrentUser } from '@/core/hooks/useCurrentUser'; +import './AppTopbar.scss'; + +interface Props { + onToggleSidebar: () => void; +} + +export default function AppTopbar({ onToggleSidebar }: Props) { + const { currentUser } = useCurrentUser(); + const navigate = useNavigate(); + const userMenu = useRef(null); + + const userMenuItems = [ + { label: '내 정보', icon: 'pi pi-user', command: () => navigate('/profile') }, + { label: '비밀번호 변경', icon: 'pi pi-key', command: () => navigate('/change-password') }, + { separator: true }, + { label: '로그아웃', icon: 'pi pi-sign-out', command: () => navigate('/login') }, + ]; + + return ( +
+
+
+ +
+ + +
+
+ ); +} diff --git a/wtm-frontend-react/src/core/components/AuthGuard.tsx b/wtm-frontend-react/src/core/components/AuthGuard.tsx new file mode 100644 index 0000000..8a177ce --- /dev/null +++ b/wtm-frontend-react/src/core/components/AuthGuard.tsx @@ -0,0 +1,37 @@ +import { useEffect, useState } from 'react'; +import { Navigate } from 'react-router-dom'; +import { ProgressSpinner } from 'primereact/progressspinner'; +import { authService } from '@/core/auth/auth.service'; +import { useAuthStore } from '@/modules/auth/auth.store'; + +export default function AuthGuard({ children }: { children: React.ReactNode }) { + const currentUser = useAuthStore((s) => s.currentUser); + const fetchMe = useAuthStore((s) => s.fetchMe); + const [checking, setChecking] = useState(true); + + useEffect(() => { + if (!authService.isAuthenticated()) { + setChecking(false); + return; + } + if (!currentUser) { + fetchMe().finally(() => setChecking(false)); + } else { + setChecking(false); + } + }, [currentUser, fetchMe]); + + if (checking) { + return ( +
+ +
+ ); + } + + if (!authService.isAuthenticated()) { + return ; + } + + return <>{children}; +} diff --git a/wtm-frontend-react/src/core/components/BaseCrudTable.scss b/wtm-frontend-react/src/core/components/BaseCrudTable.scss new file mode 100644 index 0000000..cb64f97 --- /dev/null +++ b/wtm-frontend-react/src/core/components/BaseCrudTable.scss @@ -0,0 +1,36 @@ +@use '@/assets/styles/variables' as *; + +.crud-table { + &__toolbar { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: $space-sm; + margin-bottom: $space-md; + } + + &__toolbar-left, + &__toolbar-right { + display: flex; + gap: $space-sm; + align-items: center; + flex-wrap: wrap; + } + + &__empty { + display: flex; + flex-direction: column; + align-items: center; + gap: $space-sm; + padding: $space-2xl; + color: $color-text-muted; + } + + @media (max-width: $bp-mobile) { + &__toolbar { + flex-direction: column; + align-items: stretch; + } + } +} diff --git a/wtm-frontend-react/src/core/components/BaseCrudTable.tsx b/wtm-frontend-react/src/core/components/BaseCrudTable.tsx new file mode 100644 index 0000000..808907c --- /dev/null +++ b/wtm-frontend-react/src/core/components/BaseCrudTable.tsx @@ -0,0 +1,91 @@ +import { useState, type ReactNode } from 'react'; +import { DataTable, type DataTablePageEvent } from 'primereact/datatable'; +import { InputText } from 'primereact/inputtext'; +import { PAGINATION } from '@/core/constants/app.constants'; +import './BaseCrudTable.scss'; + +interface Props { + value: T[]; + loading?: boolean; + totalRecords?: number; + dataKey?: string; + globalFilterFields?: string[]; + paginator?: boolean; + rowsPerPage?: number; + emptyMessage?: string; + selectionMode?: 'single' | 'multiple' | 'checkbox' | 'radiobutton'; + exportFilename?: string; + toolbarLeft?: ReactNode; + toolbarRight?: ReactNode; + onRowSelect?: (row: T) => void; + onPage?: (event: DataTablePageEvent) => void; + children: ReactNode; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export default function BaseCrudTable>({ + value, + loading = false, + totalRecords, + dataKey = 'id', + globalFilterFields, + paginator = true, + rowsPerPage = PAGINATION.defaultPageSize, + emptyMessage = '데이터가 없습니다.', + toolbarLeft, + toolbarRight, + onRowSelect, + onPage, + children, +}: Props) { + const [globalFilter, setGlobalFilter] = useState(''); + + return ( +
+
+
{toolbarLeft}
+
+ {toolbarRight} + {globalFilterFields && globalFilterFields.length > 0 && ( + + + setGlobalFilter(e.target.value)} + placeholder="검색..." + size={1} + /> + + )} +
+
+ + onRowSelect?.(e.data as T)} + onPage={onPage} + emptyMessage={ +
+ +

{emptyMessage}

+
+ } + > + {children} +
+
+ ); +} diff --git a/wtm-frontend-react/src/core/components/BaseFormDialog.scss b/wtm-frontend-react/src/core/components/BaseFormDialog.scss new file mode 100644 index 0000000..cc2ef84 --- /dev/null +++ b/wtm-frontend-react/src/core/components/BaseFormDialog.scss @@ -0,0 +1,15 @@ +@use '@/assets/styles/variables' as *; + +.form-dialog { + &__body { + display: flex; + flex-direction: column; + gap: $space-md; + } + + &__footer { + display: flex; + justify-content: flex-end; + gap: $space-sm; + } +} diff --git a/wtm-frontend-react/src/core/components/BaseFormDialog.tsx b/wtm-frontend-react/src/core/components/BaseFormDialog.tsx new file mode 100644 index 0000000..2b0fa27 --- /dev/null +++ b/wtm-frontend-react/src/core/components/BaseFormDialog.tsx @@ -0,0 +1,50 @@ +import type { ReactNode } from 'react'; +import { Dialog } from 'primereact/dialog'; +import { Button } from 'primereact/button'; +import './BaseFormDialog.scss'; + +interface Props { + visible: boolean; + onHide: () => void; + title: string; + width?: string; + loading?: boolean; + submitLabel?: string; + cancelLabel?: string; + onSubmit: () => void; + children: ReactNode; +} + +export default function BaseFormDialog({ + visible, + onHide, + title, + width = '540px', + loading = false, + submitLabel = '저장', + cancelLabel = '취소', + onSubmit, + children, +}: Props) { + const footer = ( +
+
+ ); + + return ( + +
{children}
+
+ ); +} diff --git a/wtm-frontend-react/src/core/components/BasePageHeader.scss b/wtm-frontend-react/src/core/components/BasePageHeader.scss new file mode 100644 index 0000000..4fcbd13 --- /dev/null +++ b/wtm-frontend-react/src/core/components/BasePageHeader.scss @@ -0,0 +1,37 @@ +@use '@/assets/styles/variables' as *; + +.page-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + flex-wrap: wrap; + gap: $space-md; + margin-bottom: $space-lg; + + &__title { + font-size: $font-size-2xl; + font-weight: 700; + margin: 0; + color: $color-text; + } + + &__subtitle { + font-size: $font-size-sm; + color: $color-text-muted; + margin: $space-xs 0 0; + } + + &__actions { + display: flex; + gap: $space-sm; + flex-wrap: wrap; + } + + @media (max-width: $bp-mobile) { + flex-direction: column; + &__actions { + width: 100%; + justify-content: flex-end; + } + } +} diff --git a/wtm-frontend-react/src/core/components/BasePageHeader.tsx b/wtm-frontend-react/src/core/components/BasePageHeader.tsx new file mode 100644 index 0000000..5f5e8dc --- /dev/null +++ b/wtm-frontend-react/src/core/components/BasePageHeader.tsx @@ -0,0 +1,20 @@ +import type { ReactNode } from 'react'; +import './BasePageHeader.scss'; + +interface Props { + title: string; + subtitle?: string; + actions?: ReactNode; +} + +export default function BasePageHeader({ title, subtitle, actions }: Props) { + return ( +
+
+

{title}

+ {subtitle &&

{subtitle}

} +
+ {actions &&
{actions}
} +
+ ); +} diff --git a/wtm-frontend-react/src/core/components/NotFoundView.tsx b/wtm-frontend-react/src/core/components/NotFoundView.tsx new file mode 100644 index 0000000..96533c8 --- /dev/null +++ b/wtm-frontend-react/src/core/components/NotFoundView.tsx @@ -0,0 +1,11 @@ +import { Link } from 'react-router-dom'; + +export default function NotFoundView() { + return ( +
+

404

+

페이지를 찾을 수 없습니다.

+ 홈으로 이동 +
+ ); +} diff --git a/wtm-frontend-react/src/core/constants/app.constants.ts b/wtm-frontend-react/src/core/constants/app.constants.ts new file mode 100644 index 0000000..a0a914a --- /dev/null +++ b/wtm-frontend-react/src/core/constants/app.constants.ts @@ -0,0 +1,151 @@ +// Breakpoints +export const BREAKPOINTS = { + mobile: 576, + tablet: 768, + desktop: 992, + wide: 1200, + ultra: 1400, +} as const; + +// Layout +export const LAYOUT = { + sidebarWidth: 260, + sidebarCollapsedWidth: 64, + topbarHeight: 56, +} as const; + +// Pagination +export const PAGINATION = { + defaultPageSize: 20, + pageSizeOptions: [10, 20, 50, 100], +} as const; + +// Toast +export const TOAST = { + defaultLife: 3000, + errorLife: 5000, +} as const; + +// Date formats +export const DATE_FORMAT = { + display: 'YYYY-MM-DD', + api: 'YYYY-MM-DD', + datetime: 'YYYY-MM-DD HH:mm', + weekStart: 1, +} as const; + +// Timesheet rules +export const TIMESHEET_RULES = { + maxDailyHours: 24, + warnDailyHours: 10, + defaultDailyHours: 8, + maxWeeklyHours: 52, +} as const; + +// Roles +export const ROLES = { + SA: 'SA', + PM: 'PM', + PCM: 'PCM', + PTK: 'PTK', + DL: 'DL', + USER: 'USER', +} as const; + +// Timesheet status +export const TIMESHEET_STATUS: Record = { + DRAFT: { label: '작성중', severity: 'secondary' }, + SUBMITTED: { label: '제출됨', severity: 'info' }, + DL_APPROVED: { label: 'DL승인', severity: 'warning' }, + APPROVED: { label: '승인', severity: 'success' }, + REJECTED: { label: '반려', severity: 'danger' }, +}; + +// Project status +export const PROJECT_STATUS: Record = { + ACTIVE: { label: '진행중', severity: 'success' }, + CLOSED: { label: '종료', severity: 'secondary' }, + HOLD: { label: '보류', severity: 'warning' }, +}; + +// Entry types +export const ENTRY_TYPES: Record = { + NON_PROJECT: { label: 'Non-Project', icon: 'pi pi-calendar' }, + OTHER_PROJECT: { label: 'Other Project', icon: 'pi pi-briefcase' }, + EPC: { label: 'EPC Project', icon: 'pi pi-building' }, +}; + +// Non-Project categories +export const NP_CATEGORIES = [ + { value: 'ANNUAL_LEAVE', label: '연차' }, + { value: 'SICK_LEAVE', label: '병가' }, + { value: 'TRAINING', label: '교육' }, + { value: 'ADMIN', label: '행정' }, + { value: 'PUBLIC_HOLIDAY', label: '공휴일' }, + { value: 'OTHER', label: '기타' }, +] as const; + +// Sidebar menu +export interface MenuItem { + label: string; + icon: string; + to?: string; + roles: string[]; + items?: { label: string; to: string; roles: string[] }[]; +} + +export const MENU_ITEMS: MenuItem[] = [ + { + label: '대시보드', + icon: 'pi pi-home', + to: '/dashboard', + roles: ['SA', 'PM', 'PCM', 'PTK', 'DL', 'USER'], + }, + { + label: '시수 관리', + icon: 'pi pi-clock', + roles: ['SA', 'PM', 'DL', 'USER'], + items: [ + { label: '시수 입력', to: '/timesheets', roles: ['USER', 'DL', 'PM', 'SA'] }, + { label: '시수 이력', to: '/timesheets/history', roles: ['USER', 'DL', 'PM', 'SA'] }, + { label: 'Excel 업로드', to: '/timesheets/upload', roles: ['USER'] }, + ], + }, + { + label: '결재', + icon: 'pi pi-check-square', + roles: ['DL', 'PM', 'SA'], + items: [ + { label: '결재 대기', to: '/approvals', roles: ['DL', 'PM', 'SA'] }, + { label: '결재 이력', to: '/approvals/history', roles: ['DL', 'PM', 'SA'] }, + ], + }, + { + label: '프로젝트', + icon: 'pi pi-briefcase', + roles: ['SA', 'PM', 'PCM'], + items: [ + { label: '프로젝트 목록', to: '/projects', roles: ['SA', 'PM', 'PCM'] }, + { label: 'WBS 관리', to: '/wbs', roles: ['SA', 'PM', 'PCM'] }, + { label: 'TEAL 관리', to: '/teal', roles: ['SA', 'PM', 'PCM'] }, + ], + }, + { + label: '리포트', + icon: 'pi pi-chart-bar', + to: '/reports', + roles: ['SA', 'PM', 'PCM', 'DL'], + }, + { + label: '사용자 관리', + icon: 'pi pi-users', + to: '/users', + roles: ['SA', 'PTK'], + }, + { + label: '시스템 설정', + icon: 'pi pi-cog', + to: '/settings', + roles: ['SA'], + }, +]; diff --git a/wtm-frontend-react/src/core/hooks/useCurrentUser.ts b/wtm-frontend-react/src/core/hooks/useCurrentUser.ts new file mode 100644 index 0000000..310afd9 --- /dev/null +++ b/wtm-frontend-react/src/core/hooks/useCurrentUser.ts @@ -0,0 +1,16 @@ +import { useMemo } from 'react'; +import { useAuthStore } from '@/modules/auth/auth.store'; + +export function useCurrentUser() { + const currentUser = useAuthStore((s) => s.currentUser); + + const roles = useMemo(() => currentUser?.roles ?? [], [currentUser]); + + const isAuthenticated = !!currentUser; + + const hasRole = (role: string) => roles.includes(role); + + const hasAnyRole = (...checkRoles: string[]) => checkRoles.some((r) => roles.includes(r)); + + return { currentUser, isAuthenticated, roles, hasRole, hasAnyRole }; +} diff --git a/wtm-frontend-react/src/modules/approval/approval.service.ts b/wtm-frontend-react/src/modules/approval/approval.service.ts new file mode 100644 index 0000000..e97857c --- /dev/null +++ b/wtm-frontend-react/src/modules/approval/approval.service.ts @@ -0,0 +1,14 @@ +import api from '@/core/api/axios'; + +const BASE = '/api/wtm/approvals'; + +export const approvalService = { + getPending: () => api.get(`${BASE}/pending`), + approve: (id: number, comment?: string) => api.post(`${BASE}/${id}/approve`, { comment }), + reject: (id: number, comment?: string) => api.post(`${BASE}/${id}/reject`, { comment }), + batchApprove: (ids: number[]) => api.post(`${BASE}/batch-approve`, { ids }), + addComment: (id: number, comment: string) => api.post(`${BASE}/${id}/comments`, { comment }), + getById: (id: number) => api.get(`${BASE}/${id}`), + getHistory: (params?: Record) => api.get(`${BASE}/history`, { params }), + getOverdue: () => api.get(`${BASE}/overdue`), +}; diff --git a/wtm-frontend-react/src/modules/approval/approval.types.ts b/wtm-frontend-react/src/modules/approval/approval.types.ts new file mode 100644 index 0000000..418595c --- /dev/null +++ b/wtm-frontend-react/src/modules/approval/approval.types.ts @@ -0,0 +1,25 @@ +export interface Approval { + id: number; + timesheetId: number; + requesterId: number; + requesterName: string; + projectName?: string; + weekStartDate: string; + weekEndDate: string; + totalHours: number; + status: string; + submittedAt?: string; + approvedAt?: string; + comment?: string; +} + +export interface ApprovalLine { + id: number; + approvalId: number; + approverId: number; + approverName: string; + sequence: number; + status: string; + comment?: string; + actedAt?: string; +} diff --git a/wtm-frontend-react/src/modules/approval/views/ApprovalHistoryView.tsx b/wtm-frontend-react/src/modules/approval/views/ApprovalHistoryView.tsx new file mode 100644 index 0000000..4f822bf --- /dev/null +++ b/wtm-frontend-react/src/modules/approval/views/ApprovalHistoryView.tsx @@ -0,0 +1,54 @@ +import { useState, useEffect } from 'react'; +import { Column } from 'primereact/column'; +import { Tag } from 'primereact/tag'; +import { Calendar } from 'primereact/calendar'; +import { Dropdown } from 'primereact/dropdown'; +import BaseCrudTable from '@/core/components/BaseCrudTable'; +import BasePageHeader from '@/core/components/BasePageHeader'; +import { approvalService } from '../approval.service'; +import { TIMESHEET_STATUS } from '@/core/constants/app.constants'; + +export default function ApprovalHistoryView() { + const [loading, setLoading] = useState(false); + const [history, setHistory] = useState[]>([]); + const [statusFilter, setStatusFilter] = useState(null); + const [dateFrom, setDateFrom] = useState(null); + const [dateTo, setDateTo] = useState(null); + + useEffect(() => { + setLoading(true); + const params: Record = {}; + if (statusFilter) params.status = statusFilter; + if (dateFrom) params.from = dateFrom.toISOString().slice(0, 10); + if (dateTo) params.to = dateTo.toISOString().slice(0, 10); + + approvalService.getHistory(params) + .then(({ data }) => setHistory((data as { items?: unknown[] }).items as Record[] ?? data as Record[])) + .catch(() => setHistory([])) + .finally(() => setLoading(false)); + }, [statusFilter, dateFrom, dateTo]); + + const statusOptions = Object.entries(TIMESHEET_STATUS).map(([key, val]) => ({ label: val.label, value: key })); + + return ( +
+ +
+ setDateFrom(e.value as Date)} placeholder="시작일" dateFormat="yy-mm-dd" /> + setDateTo(e.value as Date)} placeholder="종료일" dateFormat="yy-mm-dd" /> + setStatusFilter(e.value)} placeholder="상태" showClear /> +
+ + + + + `${row.totalHours}h`} /> + { + const s = TIMESHEET_STATUS[row.status as string]; + return ; + }} /> + + +
+ ); +} diff --git a/wtm-frontend-react/src/modules/approval/views/ApprovalPendingView.tsx b/wtm-frontend-react/src/modules/approval/views/ApprovalPendingView.tsx new file mode 100644 index 0000000..446e26b --- /dev/null +++ b/wtm-frontend-react/src/modules/approval/views/ApprovalPendingView.tsx @@ -0,0 +1,72 @@ +import { useState, useEffect } from 'react'; +import { Column } from 'primereact/column'; +import { Button } from 'primereact/button'; +import { Tag } from 'primereact/tag'; +import BaseCrudTable from '@/core/components/BaseCrudTable'; +import BasePageHeader from '@/core/components/BasePageHeader'; +import { approvalService } from '../approval.service'; +import { TIMESHEET_STATUS } from '@/core/constants/app.constants'; +import type { Approval } from '../approval.types'; + +export default function ApprovalPendingView() { + const [loading, setLoading] = useState(false); + const [approvals, setApprovals] = useState([]); + const [selected, setSelected] = useState([]); + + function load() { + setLoading(true); + approvalService.getPending() + .then(({ data }) => setApprovals((data as { items?: Approval[] }).items ?? data as Approval[])) + .catch(() => setApprovals([])) + .finally(() => setLoading(false)); + } + + useEffect(() => { load(); }, []); + + async function handleApprove(id: number) { + await approvalService.approve(id); + load(); + } + + async function handleReject(id: number) { + await approvalService.reject(id); + load(); + } + + async function batchApprove() { + if (selected.length === 0) return; + await approvalService.batchApprove(selected.map((s) => s.id)); + setSelected([]); + load(); + } + + return ( +
+ + + } + > + + + + + `${row.totalHours}h`} sortable /> + { + const s = TIMESHEET_STATUS[row.status]; + return ; + }} /> + ( +
+
+ )} /> +
+
+ ); +} diff --git a/wtm-frontend/src/modules/auth/auth.service.ts b/wtm-frontend-react/src/modules/auth/auth.service.ts similarity index 100% rename from wtm-frontend/src/modules/auth/auth.service.ts rename to wtm-frontend-react/src/modules/auth/auth.service.ts diff --git a/wtm-frontend-react/src/modules/auth/auth.store.ts b/wtm-frontend-react/src/modules/auth/auth.store.ts new file mode 100644 index 0000000..2d6eed3 --- /dev/null +++ b/wtm-frontend-react/src/modules/auth/auth.store.ts @@ -0,0 +1,64 @@ +import { create } from 'zustand'; +import { authService as tokenService } from '@/core/auth/auth.service'; +import { authApi } from './auth.service'; +import type { AuthUser } from '@/core/auth/auth.types'; + +interface AuthState { + currentUser: AuthUser | null; + loading: boolean; + unreadCount: number; + login: (email: string, password: string) => Promise; + fetchMe: () => Promise; + logout: () => void; + reset: () => void; +} + +function mapUser(u: Record): AuthUser { + return { + id: u.id as number, + email: u.email as string, + fullName: (u.full_name ?? u.fullName ?? '') as string, + roles: Array.isArray(u.roles) && u.roles.length ? u.roles : (u.is_admin ? ['SA'] : ['USER']), + departmentId: (u.department_id ?? u.departmentId) as number | undefined, + }; +} + +export const useAuthStore = create((set) => ({ + currentUser: null, + loading: false, + unreadCount: 0, + + login: async (email, password) => { + set({ loading: true }); + try { + const { data } = await authApi.login({ email, password }); + const accessToken = (data.access_token ?? data.accessToken) as string; + const refreshToken = (data.refresh_token ?? data.refreshToken) as string; + tokenService.setTokens(accessToken, refreshToken); + set({ currentUser: mapUser(data.user as unknown as Record) }); + } finally { + set({ loading: false }); + } + }, + + fetchMe: async () => { + try { + const { data } = await authApi.me(); + set({ currentUser: mapUser(data as unknown as Record) }); + } catch { + tokenService.clearTokens(); + set({ currentUser: null }); + window.location.href = '/login'; + } + }, + + logout: () => { + tokenService.clearTokens(); + set({ currentUser: null }); + window.location.href = '/login'; + }, + + reset: () => { + set({ currentUser: null, loading: false, unreadCount: 0 }); + }, +})); diff --git a/wtm-frontend/src/modules/auth/auth.types.ts b/wtm-frontend-react/src/modules/auth/auth.types.ts similarity index 100% rename from wtm-frontend/src/modules/auth/auth.types.ts rename to wtm-frontend-react/src/modules/auth/auth.types.ts diff --git a/wtm-frontend-react/src/modules/auth/views/ChangePasswordView.tsx b/wtm-frontend-react/src/modules/auth/views/ChangePasswordView.tsx new file mode 100644 index 0000000..6830d2d --- /dev/null +++ b/wtm-frontend-react/src/modules/auth/views/ChangePasswordView.tsx @@ -0,0 +1,66 @@ +import { useState, type FormEvent } from 'react'; +import { Password } from 'primereact/password'; +import { Button } from 'primereact/button'; +import { Card } from 'primereact/card'; +import { Message } from 'primereact/message'; +import BasePageHeader from '@/core/components/BasePageHeader'; +import { authApi } from '../auth.service'; + +export default function ChangePasswordView() { + const [currentPassword, setCurrentPassword] = useState(''); + const [newPassword, setNewPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [loading, setLoading] = useState(false); + const [message, setMessage] = useState<{ severity: 'success' | 'error'; text: string } | null>(null); + + async function onSubmit(e: FormEvent) { + e.preventDefault(); + setMessage(null); + + if (newPassword.length < 8) { + setMessage({ severity: 'error', text: '비밀번호는 8자 이상이어야 합니다.' }); + return; + } + if (newPassword !== confirmPassword) { + setMessage({ severity: 'error', text: '새 비밀번호가 일치하지 않습니다.' }); + return; + } + + setLoading(true); + try { + await authApi.changePassword({ currentPassword, newPassword }); + setMessage({ severity: 'success', text: '비밀번호가 변경되었습니다.' }); + setCurrentPassword(''); + setNewPassword(''); + setConfirmPassword(''); + } catch { + setMessage({ severity: 'error', text: '비밀번호 변경에 실패했습니다.' }); + } finally { + setLoading(false); + } + } + + return ( +
+ + + {message && } +
+
+ + setCurrentPassword(e.target.value)} feedback={false} toggleMask inputStyle={{ width: '100%' }} /> +
+
+ + setNewPassword(e.target.value)} feedback={false} toggleMask inputStyle={{ width: '100%' }} /> +
+
+ + setConfirmPassword(e.target.value)} feedback={false} toggleMask inputStyle={{ width: '100%' }} /> +
+
+ ); +} diff --git a/wtm-frontend-react/src/modules/auth/views/ForgotPasswordView.tsx b/wtm-frontend-react/src/modules/auth/views/ForgotPasswordView.tsx new file mode 100644 index 0000000..83d9b4e --- /dev/null +++ b/wtm-frontend-react/src/modules/auth/views/ForgotPasswordView.tsx @@ -0,0 +1,11 @@ +import { Card } from 'primereact/card'; + +export default function ForgotPasswordView() { + return ( +
+ +

비밀번호 찾기 기능은 준비 중입니다.

+
+
+ ); +} diff --git a/wtm-frontend-react/src/modules/auth/views/LoginView.scss b/wtm-frontend-react/src/modules/auth/views/LoginView.scss new file mode 100644 index 0000000..39e4f29 --- /dev/null +++ b/wtm-frontend-react/src/modules/auth/views/LoginView.scss @@ -0,0 +1,64 @@ +@use '@/assets/styles/variables' as *; + +.login-page { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + background: var(--p-surface-50); + padding: $space-md; + + &__card { + width: 100%; + max-width: 420px; + } + + &__content { + display: flex; + flex-direction: column; + align-items: center; + gap: $space-lg; + } + + &__logo { + text-align: center; + } + + &__title { + font-size: $font-size-2xl; + font-weight: 700; + margin: $space-sm 0 0; + color: $color-text; + } + + &__subtitle { + font-size: $font-size-sm; + color: $color-text-muted; + margin: $space-xs 0 0; + } + + &__form { + width: 100%; + display: flex; + flex-direction: column; + gap: $space-md; + } + + &__submit { + margin-top: $space-sm; + } + + &__links { + text-align: center; + } + + &__link { + font-size: $font-size-sm; + color: $color-primary; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } +} diff --git a/wtm-frontend-react/src/modules/auth/views/LoginView.tsx b/wtm-frontend-react/src/modules/auth/views/LoginView.tsx new file mode 100644 index 0000000..e5f2af3 --- /dev/null +++ b/wtm-frontend-react/src/modules/auth/views/LoginView.tsx @@ -0,0 +1,86 @@ +import { useState, type FormEvent } from 'react'; +import { useNavigate, Link } from 'react-router-dom'; +import { InputText } from 'primereact/inputtext'; +import { Password } from 'primereact/password'; +import { Button } from 'primereact/button'; +import { Card } from 'primereact/card'; +import { Message } from 'primereact/message'; +import { useAuthStore } from '../auth.store'; +import './LoginView.scss'; + +export default function LoginView() { + const login = useAuthStore((s) => s.login); + const loading = useAuthStore((s) => s.loading); + const navigate = useNavigate(); + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + + async function onLogin(e: FormEvent) { + e.preventDefault(); + setError(''); + try { + await login(email, password); + navigate('/dashboard'); + } catch (err: unknown) { + const axiosErr = err as { response?: { data?: { detail?: string } } }; + setError(axiosErr?.response?.data?.detail ?? '로그인에 실패했습니다. 이메일과 비밀번호를 확인하세요.'); + } + } + + return ( +
+ +
+
+ +

WTM

+

Work Time Manager

+
+ + {error && } + +
+
+ + setEmail(e.target.value)} + type="email" + placeholder="user@hanwha.com" + required + /> +
+ +
+ + setPassword(e.target.value)} + placeholder="비밀번호 입력" + feedback={false} + toggleMask + inputStyle={{ width: '100%' }} + /> +
+ +
+
+
+ ); +} diff --git a/wtm-frontend-react/src/modules/dashboard/dashboard.service.ts b/wtm-frontend-react/src/modules/dashboard/dashboard.service.ts new file mode 100644 index 0000000..2ca94f5 --- /dev/null +++ b/wtm-frontend-react/src/modules/dashboard/dashboard.service.ts @@ -0,0 +1,8 @@ +import api from '@/core/api/axios'; + +const BASE = '/api/wtm/home'; + +export const dashboardService = { + getDashboard: () => api.get(`${BASE}/dashboard`), + getNotifications: () => api.get(`${BASE}/notifications`), +}; diff --git a/wtm-frontend-react/src/modules/dashboard/dashboard.types.ts b/wtm-frontend-react/src/modules/dashboard/dashboard.types.ts new file mode 100644 index 0000000..6c5f2cd --- /dev/null +++ b/wtm-frontend-react/src/modules/dashboard/dashboard.types.ts @@ -0,0 +1,6 @@ +export interface DashboardStat { + label: string; + value: number; + icon: string; + trend?: number; +} diff --git a/wtm-frontend-react/src/modules/dashboard/views/DashboardView.scss b/wtm-frontend-react/src/modules/dashboard/views/DashboardView.scss new file mode 100644 index 0000000..7c425e3 --- /dev/null +++ b/wtm-frontend-react/src/modules/dashboard/views/DashboardView.scss @@ -0,0 +1,83 @@ +@use '@/assets/styles/variables' as *; + +.dashboard-view { + &__loading { + display: flex; + justify-content: center; + padding: $space-2xl; + } + + &__stats { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: $space-md; + margin-bottom: $space-lg; + + @media (max-width: $bp-tablet) { + grid-template-columns: repeat(2, 1fr); + } + @media (max-width: $bp-mobile) { + grid-template-columns: 1fr; + } + } + + &__grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $space-md; + + @media (max-width: $bp-tablet) { + grid-template-columns: 1fr; + } + } + + &__chart-wrapper { + height: 280px; + position: relative; + } +} + +.stat-card { + display: flex; + align-items: center; + gap: $space-md; + + &__icon { + width: 48px; + height: 48px; + border-radius: $radius-lg; + background: var(--p-primary-100); + color: var(--p-primary-color); + display: flex; + align-items: center; + justify-content: center; + font-size: $font-size-xl; + flex-shrink: 0; + } + + &__info { + display: flex; + flex-direction: column; + min-width: 0; + } + + &__value { + font-size: $font-size-2xl; + font-weight: 700; + color: $color-text; + line-height: 1.2; + } + + &__label { + font-size: $font-size-sm; + color: $color-text-muted; + } + + &__trend { + margin-left: auto; + font-size: $font-size-sm; + font-weight: 600; + &--up { color: $color-success; } + &--down { color: $color-danger; } + } +} diff --git a/wtm-frontend-react/src/modules/dashboard/views/DashboardView.tsx b/wtm-frontend-react/src/modules/dashboard/views/DashboardView.tsx new file mode 100644 index 0000000..95506bd --- /dev/null +++ b/wtm-frontend-react/src/modules/dashboard/views/DashboardView.tsx @@ -0,0 +1,123 @@ +import { useState, useEffect, useMemo } from 'react'; +import { Card } from 'primereact/card'; +import { Tag } from 'primereact/tag'; +import { DataTable } from 'primereact/datatable'; +import { Column } from 'primereact/column'; +import { ProgressSpinner } from 'primereact/progressspinner'; +import { Chart } from 'primereact/chart'; +import BasePageHeader from '@/core/components/BasePageHeader'; +import { dashboardService } from '../dashboard.service'; +import { TIMESHEET_STATUS } from '@/core/constants/app.constants'; +import type { DashboardStat } from '../dashboard.types'; +import './DashboardView.scss'; + +const defaultStats: DashboardStat[] = [ + { label: '금주 시수', value: 0, icon: 'pi pi-clock' }, + { label: '미제출 건수', value: 0, icon: 'pi pi-exclamation-triangle' }, + { label: '결재 대기', value: 0, icon: 'pi pi-check-square' }, + { label: '프로젝트 수', value: 0, icon: 'pi pi-briefcase' }, +]; + +export default function DashboardView() { + const [loading, setLoading] = useState(false); + const [stats, setStats] = useState(defaultStats); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const [weeklyHoursData, setWeeklyHoursData] = useState(null); + const [pendingApprovals, setPendingApprovals] = useState[]>([]); + + const chartOptions = useMemo(() => ({ + responsive: true, + maintainAspectRatio: false, + plugins: { legend: { display: false } }, + scales: { + y: { beginAtZero: true, title: { display: true, text: '시간 (h)' } }, + x: { title: { display: true, text: '요일' } }, + }, + }), []); + + useEffect(() => { + setLoading(true); + dashboardService.getDashboard() + .then(({ data }) => { + setStats(data.stats ?? defaultStats); + setPendingApprovals(data.pendingApprovals ?? []); + setWeeklyHoursData({ + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + datasets: [{ + label: '시수', + backgroundColor: 'var(--p-primary-color)', + data: data.weeklyHours ?? [0, 0, 0, 0, 0, 0], + }], + }); + }) + .catch(() => { + setStats(defaultStats); + setWeeklyHoursData({ + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + datasets: [{ label: '시수', backgroundColor: 'var(--p-primary-color)', data: [0, 0, 0, 0, 0, 0] }], + }); + }) + .finally(() => setLoading(false)); + }, []); + + function statusSeverity(status: string) { + return (TIMESHEET_STATUS[status]?.severity ?? 'secondary') as 'success' | 'info' | 'warning' | 'danger' | 'secondary'; + } + function statusLabel(status: string) { + return TIMESHEET_STATUS[status]?.label ?? status; + } + + if (loading) { + return ( +
+ +
+
+ ); + } + + return ( +
+ + +
+ {stats.map((stat, idx) => ( + +
+
+
+ {stat.value} + {stat.label} +
+ {stat.trend != null && ( +
0 ? 'stat-card__trend--up' : stat.trend < 0 ? 'stat-card__trend--down' : ''}`}> + 0 ? 'pi pi-arrow-up' : stat.trend < 0 ? 'pi pi-arrow-down' : 'pi pi-minus'} /> + {Math.abs(stat.trend)}% +
+ )} +
+
+ ))} +
+ +
+ +
+ {weeklyHoursData && } +
+
+ + + 5} size="small" stripedRows + emptyMessage={
결재 대기 건이 없습니다.
} + > + + + `${row.totalHours}h`} /> + } /> +
+
+
+
+ ); +} diff --git a/wtm-frontend-react/src/modules/project/components/ProjectFormDialog.tsx b/wtm-frontend-react/src/modules/project/components/ProjectFormDialog.tsx new file mode 100644 index 0000000..8049195 --- /dev/null +++ b/wtm-frontend-react/src/modules/project/components/ProjectFormDialog.tsx @@ -0,0 +1,81 @@ +import { useState, useEffect } from 'react'; +import { InputText } from 'primereact/inputtext'; +import { InputTextarea } from 'primereact/inputtextarea'; +import { Dropdown } from 'primereact/dropdown'; +import BaseFormDialog from '@/core/components/BaseFormDialog'; +import type { Project } from '../project.types'; + +interface Props { + visible: boolean; + onHide: () => void; + project: Project | null; + onSave: (data: Partial) => Promise; +} + +export default function ProjectFormDialog({ visible, onHide, project, onSave }: Props) { + const [code, setCode] = useState(''); + const [name, setName] = useState(''); + const [description, setDescription] = useState(''); + const [type, setType] = useState(''); + const [status, setStatus] = useState('ACTIVE'); + const [loading, setLoading] = useState(false); + + useEffect(() => { + if (project) { + setCode(project.code); + setName(project.name); + setDescription(project.description ?? ''); + setType(project.type ?? ''); + setStatus(project.status); + } else { + setCode(''); setName(''); setDescription(''); setType(''); setStatus('ACTIVE'); + } + }, [project, visible]); + + async function handleSubmit() { + setLoading(true); + try { + await onSave({ code, name, description, type, status }); + } finally { + setLoading(false); + } + } + + const typeOptions = [ + { label: 'EPC', value: 'EPC' }, + { label: 'Other', value: 'OTHER' }, + { label: 'Internal', value: 'INTERNAL' }, + ]; + const statusOptions = [ + { label: '진행중', value: 'ACTIVE' }, + { label: '종료', value: 'CLOSED' }, + { label: '보류', value: 'HOLD' }, + ]; + + return ( + +
+
+ + setCode(e.target.value)} disabled={!!project} /> +
+
+ + setName(e.target.value)} /> +
+
+ + setType(e.value)} placeholder="선택" /> +
+
+ + setStatus(e.value)} /> +
+
+ + setDescription(e.target.value)} rows={3} /> +
+
+
+ ); +} diff --git a/wtm-frontend-react/src/modules/project/project.service.ts b/wtm-frontend-react/src/modules/project/project.service.ts new file mode 100644 index 0000000..65666f8 --- /dev/null +++ b/wtm-frontend-react/src/modules/project/project.service.ts @@ -0,0 +1,13 @@ +import api from '@/core/api/axios'; + +const BASE = '/api/wtm/projects'; + +export const projectService = { + getAll: (params?: Record) => api.get(BASE, { params }), + getById: (id: number) => api.get(`${BASE}/${id}`), + create: (data: unknown) => api.post(BASE, data), + update: (id: number, data: unknown) => api.put(`${BASE}/${id}`, data), + getMy: () => api.get(`${BASE}/my`), + getMembers: (id: number) => api.get(`${BASE}/${id}/members`), + getAssignments: (id: number) => api.get(`${BASE}/${id}/assignments`), +}; diff --git a/wtm-frontend-react/src/modules/project/project.types.ts b/wtm-frontend-react/src/modules/project/project.types.ts new file mode 100644 index 0000000..a91b4a0 --- /dev/null +++ b/wtm-frontend-react/src/modules/project/project.types.ts @@ -0,0 +1,12 @@ +export interface Project { + id: number; + code: string; + name: string; + description?: string; + type?: string; + status: string; + startDate?: string; + endDate?: string; + managerId?: number; + managerName?: string; +} diff --git a/wtm-frontend-react/src/modules/project/views/ProjectDetailView.tsx b/wtm-frontend-react/src/modules/project/views/ProjectDetailView.tsx new file mode 100644 index 0000000..6e934b3 --- /dev/null +++ b/wtm-frontend-react/src/modules/project/views/ProjectDetailView.tsx @@ -0,0 +1,13 @@ +import { Card } from 'primereact/card'; +import BasePageHeader from '@/core/components/BasePageHeader'; + +export default function ProjectDetailView() { + return ( +
+ + +

프로젝트 상세 페이지는 준비 중입니다.

+
+
+ ); +} diff --git a/wtm-frontend-react/src/modules/project/views/ProjectListView.tsx b/wtm-frontend-react/src/modules/project/views/ProjectListView.tsx new file mode 100644 index 0000000..a1da72d --- /dev/null +++ b/wtm-frontend-react/src/modules/project/views/ProjectListView.tsx @@ -0,0 +1,69 @@ +import { useState, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Column } from 'primereact/column'; +import { Button } from 'primereact/button'; +import { Tag } from 'primereact/tag'; +import BaseCrudTable from '@/core/components/BaseCrudTable'; +import BasePageHeader from '@/core/components/BasePageHeader'; +import ProjectFormDialog from '../components/ProjectFormDialog'; +import { projectService } from '../project.service'; +import { PROJECT_STATUS } from '@/core/constants/app.constants'; +import type { Project } from '../project.types'; + +export default function ProjectListView() { + const [loading, setLoading] = useState(false); + const [projects, setProjects] = useState([]); + const [dialogVisible, setDialogVisible] = useState(false); + const [editProject, setEditProject] = useState(null); + const navigate = useNavigate(); + + function load() { + setLoading(true); + projectService.getAll() + .then(({ data }) => setProjects((data as { items?: Project[] }).items ?? data as Project[])) + .catch(() => setProjects([])) + .finally(() => setLoading(false)); + } + + useEffect(() => { load(); }, []); + + function openCreate() { + setEditProject(null); + setDialogVisible(true); + } + + function openEdit(p: Project) { + setEditProject(p); + setDialogVisible(true); + } + + async function onSave(data: Partial) { + if (editProject) { + await projectService.update(editProject.id, data); + } else { + await projectService.create(data); + } + setDialogVisible(false); + load(); + } + + return ( +
+ } /> + navigate(`/projects/${row.id}`)}> + + + + { + const s = PROJECT_STATUS[row.status]; + return ; + }} sortable /> + +
+ ); +} diff --git a/wtm-frontend-react/src/modules/report/report.service.ts b/wtm-frontend-react/src/modules/report/report.service.ts new file mode 100644 index 0000000..2d9c576 --- /dev/null +++ b/wtm-frontend-react/src/modules/report/report.service.ts @@ -0,0 +1,12 @@ +import api from '@/core/api/axios'; + +const BASE = '/api/wtm/reports'; + +export const reportService = { + getProjectHours: (params: Record) => api.get(`${BASE}/project-hours`, { params }), + exportProjectHours: (params: Record) => api.get(`${BASE}/project-hours/export`, { params, responseType: 'blob' }), + getWbsHours: (params: Record) => api.get(`${BASE}/wbs-hours`, { params }), + exportWbsHours: (params: Record) => api.get(`${BASE}/wbs-hours/export`, { params, responseType: 'blob' }), + getPhaseRatio: (params: Record) => api.get(`${BASE}/phase-ratio`, { params }), + getNpRatio: (params: Record) => api.get(`${BASE}/np-ratio`, { params }), +}; diff --git a/wtm-frontend-react/src/modules/report/report.types.ts b/wtm-frontend-react/src/modules/report/report.types.ts new file mode 100644 index 0000000..04b79fe --- /dev/null +++ b/wtm-frontend-react/src/modules/report/report.types.ts @@ -0,0 +1,7 @@ +export interface ReportFilter { + projectId?: number; + from?: string; + to?: string; + groupBy?: string; + wbsLevel?: number; +} diff --git a/wtm-frontend-react/src/modules/report/views/ReportView.tsx b/wtm-frontend-react/src/modules/report/views/ReportView.tsx new file mode 100644 index 0000000..9e74d49 --- /dev/null +++ b/wtm-frontend-react/src/modules/report/views/ReportView.tsx @@ -0,0 +1,124 @@ +import { useState, useEffect, useMemo } from 'react'; +import { Dropdown } from 'primereact/dropdown'; +import { Calendar } from 'primereact/calendar'; +import { Button } from 'primereact/button'; +import { Card } from 'primereact/card'; +import { DataTable } from 'primereact/datatable'; +import { Column } from 'primereact/column'; +import { Chart } from 'primereact/chart'; +import BasePageHeader from '@/core/components/BasePageHeader'; +import { reportService } from '../report.service'; +import { projectService } from '@/modules/project/project.service'; + +export default function ReportView() { + const [projects, setProjects] = useState<{ id: number; name: string }[]>([]); + const [projectId, setProjectId] = useState(null); + const [dateFrom, setDateFrom] = useState(null); + const [dateTo, setDateTo] = useState(null); + const [groupBy, setGroupBy] = useState('project'); + const [loading, setLoading] = useState(false); + const [data, setData] = useState[]>([]); + + const groupByOptions = [ + { label: '프로젝트', value: 'project' }, + { label: 'WBS', value: 'wbs' }, + { label: '사용자', value: 'user' }, + { label: '월별', value: 'month' }, + ]; + + useEffect(() => { + projectService.getAll() + .then(({ data }) => setProjects((data as { items?: unknown[] }).items as { id: number; name: string }[] ?? data as { id: number; name: string }[])) + .catch(() => setProjects([])); + }, []); + + function search() { + setLoading(true); + const params: Record = { groupBy }; + if (projectId) params.projectId = projectId; + if (dateFrom) params.from = dateFrom.toISOString().slice(0, 10); + if (dateTo) params.to = dateTo.toISOString().slice(0, 10); + + reportService.getProjectHours(params) + .then(({ data }) => setData(Array.isArray(data) ? data : (data as { items?: unknown[] }).items as Record[] ?? [])) + .catch(() => setData([])) + .finally(() => setLoading(false)); + } + + function exportExcel() { + const params: Record = { groupBy }; + if (projectId) params.projectId = projectId; + if (dateFrom) params.from = dateFrom.toISOString().slice(0, 10); + if (dateTo) params.to = dateTo.toISOString().slice(0, 10); + + reportService.exportProjectHours(params).then(({ data: blob }) => { + const url = URL.createObjectURL(blob as Blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'report.xlsx'; + a.click(); + URL.revokeObjectURL(url); + }); + } + + const chartData = useMemo(() => ({ + labels: data.map((d) => (d.label ?? d.name ?? '') as string), + datasets: [{ + label: '시수', + backgroundColor: 'var(--p-primary-color)', + data: data.map((d) => (d.totalHours ?? d.hours ?? 0) as number), + }], + }), [data]); + + const chartOptions = useMemo(() => ({ + responsive: true, + maintainAspectRatio: false, + plugins: { legend: { display: false } }, + scales: { y: { beginAtZero: true } }, + }), []); + + return ( +
+ + + +
+
+ + ({ label: p.name, value: p.id }))} onChange={(e) => setProjectId(e.value)} placeholder="전체" showClear /> +
+
+ + setDateFrom(e.value as Date)} dateFormat="yy-mm-dd" /> +
+
+ + setDateTo(e.value as Date)} dateFormat="yy-mm-dd" /> +
+
+ + setGroupBy(e.value)} /> +
+
+
+ + {data.length > 0 && ( + <> + +
+ +
+
+ + + row.label ?? row.name ?? '-'} /> + `${row.totalHours ?? row.hours ?? 0}h`} /> + + + + )} +
+ ); +} diff --git a/wtm-frontend-react/src/modules/settings/components/OverheadTypeDialog.tsx b/wtm-frontend-react/src/modules/settings/components/OverheadTypeDialog.tsx new file mode 100644 index 0000000..67db0cc --- /dev/null +++ b/wtm-frontend-react/src/modules/settings/components/OverheadTypeDialog.tsx @@ -0,0 +1,57 @@ +import { useState, useEffect } from 'react'; +import { InputText } from 'primereact/inputtext'; +import { InputSwitch } from 'primereact/inputswitch'; +import BaseFormDialog from '@/core/components/BaseFormDialog'; +import type { OverheadType } from '../settings.types'; + +interface Props { + visible: boolean; + onHide: () => void; + overheadType: OverheadType | null; + onSave: (data: Partial) => Promise; +} + +export default function OverheadTypeDialog({ visible, onHide, overheadType, onSave }: Props) { + const [code, setCode] = useState(''); + const [name, setName] = useState(''); + const [isActive, setIsActive] = useState(true); + const [loading, setLoading] = useState(false); + + useEffect(() => { + if (overheadType) { + setCode(overheadType.code); + setName(overheadType.name); + setIsActive(overheadType.isActive); + } else { + setCode(''); setName(''); setIsActive(true); + } + }, [overheadType, visible]); + + async function handleSubmit() { + setLoading(true); + try { + await onSave({ code, name, isActive }); + } finally { + setLoading(false); + } + } + + return ( + +
+ + setCode(e.target.value)} disabled={!!overheadType} /> +
+
+ + setName(e.target.value)} /> +
+ {overheadType && ( +
+ + setIsActive(e.value ?? false)} /> +
+ )} +
+ ); +} diff --git a/wtm-frontend-react/src/modules/settings/settings.service.ts b/wtm-frontend-react/src/modules/settings/settings.service.ts new file mode 100644 index 0000000..6d7adb3 --- /dev/null +++ b/wtm-frontend-react/src/modules/settings/settings.service.ts @@ -0,0 +1,11 @@ +import api from '@/core/api/axios'; + +const BASE = '/api/wtm'; + +export const settingsService = { + getOverheadTypes: () => api.get(`${BASE}/overhead-types`), + createOverheadType: (data: unknown) => api.post(`${BASE}/overhead-types`, data), + updateOverheadType: (id: number, data: unknown) => api.put(`${BASE}/overhead-types/${id}`, data), + getWorkRules: () => api.get(`${BASE}/work-rules`), + updateWorkRules: (data: unknown) => api.put(`${BASE}/work-rules`, data), +}; diff --git a/wtm-frontend-react/src/modules/settings/settings.types.ts b/wtm-frontend-react/src/modules/settings/settings.types.ts new file mode 100644 index 0000000..9b44a24 --- /dev/null +++ b/wtm-frontend-react/src/modules/settings/settings.types.ts @@ -0,0 +1,13 @@ +export interface OverheadType { + id: number; + code: string; + name: string; + isActive: boolean; +} + +export interface WorkRule { + id: number; + minDailyHours: number; + maxWeeklyHours: number; + location?: string; +} diff --git a/wtm-frontend-react/src/modules/settings/views/SettingsView.tsx b/wtm-frontend-react/src/modules/settings/views/SettingsView.tsx new file mode 100644 index 0000000..e072e87 --- /dev/null +++ b/wtm-frontend-react/src/modules/settings/views/SettingsView.tsx @@ -0,0 +1,104 @@ +import { useState, useEffect } from 'react'; +import { TabView, TabPanel } from 'primereact/tabview'; +import { Button } from 'primereact/button'; +import { Column } from 'primereact/column'; +import { Tag } from 'primereact/tag'; +import { Card } from 'primereact/card'; +import { InputNumber } from 'primereact/inputnumber'; +import BaseCrudTable from '@/core/components/BaseCrudTable'; +import BasePageHeader from '@/core/components/BasePageHeader'; +import OverheadTypeDialog from '../components/OverheadTypeDialog'; +import { settingsService } from '../settings.service'; +import type { OverheadType, WorkRule } from '../settings.types'; + +export default function SettingsView() { + const [overheadTypes, setOverheadTypes] = useState([]); + const [workRule, setWorkRule] = useState({ id: 0, minDailyHours: 8, maxWeeklyHours: 52 }); + const [loading, setLoading] = useState(false); + const [dialogVisible, setDialogVisible] = useState(false); + const [editOt, setEditOt] = useState(null); + const [savingRule, setSavingRule] = useState(false); + + function loadOverheadTypes() { + settingsService.getOverheadTypes() + .then(({ data }) => setOverheadTypes(Array.isArray(data) ? data : (data as { items?: OverheadType[] }).items ?? [])) + .catch(() => setOverheadTypes([])); + } + + function loadWorkRules() { + settingsService.getWorkRules() + .then(({ data }) => { + const rules = Array.isArray(data) ? data : [data]; + if (rules.length > 0) setWorkRule(rules[0] as WorkRule); + }) + .catch(() => {}); + } + + useEffect(() => { + setLoading(true); + Promise.all([loadOverheadTypes(), loadWorkRules()]).finally(() => setLoading(false)); + }, []); + + function openCreate() { setEditOt(null); setDialogVisible(true); } + function openEdit(ot: OverheadType) { setEditOt(ot); setDialogVisible(true); } + + async function onSaveOt(data: Partial) { + if (editOt) { + await settingsService.updateOverheadType(editOt.id, data); + } else { + await settingsService.createOverheadType(data); + } + setDialogVisible(false); + loadOverheadTypes(); + } + + async function saveWorkRule() { + setSavingRule(true); + try { + await settingsService.updateWorkRules(workRule); + } finally { + setSavingRule(false); + } + } + + return ( +
+ + + + }> + + + } /> +
+
+ + + + + setDialogVisible(false)} overheadType={editOt} onSave={onSaveOt} /> + + ); +} diff --git a/wtm-frontend-react/src/modules/teal/components/TealUploadDialog.tsx b/wtm-frontend-react/src/modules/teal/components/TealUploadDialog.tsx new file mode 100644 index 0000000..06ec335 --- /dev/null +++ b/wtm-frontend-react/src/modules/teal/components/TealUploadDialog.tsx @@ -0,0 +1,43 @@ +import { useState } from 'react'; +import { FileUpload, type FileUploadSelectEvent } from 'primereact/fileupload'; +import { Calendar } from 'primereact/calendar'; +import BaseFormDialog from '@/core/components/BaseFormDialog'; + +interface Props { + visible: boolean; + onHide: () => void; + onUpload: (file: File, effectiveDate: string) => Promise; +} + +export default function TealUploadDialog({ visible, onHide, onUpload }: Props) { + const [file, setFile] = useState(null); + const [effectiveDate, setEffectiveDate] = useState(null); + const [loading, setLoading] = useState(false); + + function onSelect(e: FileUploadSelectEvent) { + setFile(e.files[0] ?? null); + } + + async function handleSubmit() { + if (!file || !effectiveDate) return; + setLoading(true); + try { + await onUpload(file, effectiveDate.toISOString().slice(0, 10)); + } finally { + setLoading(false); + } + } + + return ( + +
+ + +
+
+ + setEffectiveDate(e.value as Date)} dateFormat="yy-mm-dd" /> +
+
+ ); +} diff --git a/wtm-frontend-react/src/modules/teal/teal.service.ts b/wtm-frontend-react/src/modules/teal/teal.service.ts new file mode 100644 index 0000000..c808a31 --- /dev/null +++ b/wtm-frontend-react/src/modules/teal/teal.service.ts @@ -0,0 +1,13 @@ +import api from '@/core/api/axios'; + +export const tealService = { + upload: (projectId: number, file: File, effectiveDate: string) => { + const formData = new FormData(); + formData.append('file', file); + formData.append('effectiveDate', effectiveDate); + return api.post(`/api/wtm/projects/${projectId}/teal/upload`, formData, { headers: { 'Content-Type': 'multipart/form-data' } }); + }, + getVersions: (projectId: number) => api.get(`/api/wtm/projects/${projectId}/teal/versions`), + getActive: (projectId: number) => api.get(`/api/wtm/projects/${projectId}/teal/active`), + getByWbs: (projectId: number, wbsId: number) => api.get(`/api/wtm/projects/${projectId}/teal/by-wbs/${wbsId}`), +}; diff --git a/wtm-frontend-react/src/modules/teal/teal.types.ts b/wtm-frontend-react/src/modules/teal/teal.types.ts new file mode 100644 index 0000000..174dda5 --- /dev/null +++ b/wtm-frontend-react/src/modules/teal/teal.types.ts @@ -0,0 +1,16 @@ +export interface TealEntry { + id: number; + activityCode: string; + activityName: string; + discipline?: string; + canonicalWbsId?: number; +} + +export interface TealVersion { + id: number; + projectId: number; + versionNumber: number; + effectiveDate: string; + status: string; + entryCount?: number; +} diff --git a/wtm-frontend-react/src/modules/teal/views/TealListView.tsx b/wtm-frontend-react/src/modules/teal/views/TealListView.tsx new file mode 100644 index 0000000..4b01f6e --- /dev/null +++ b/wtm-frontend-react/src/modules/teal/views/TealListView.tsx @@ -0,0 +1,73 @@ +import { useState, useEffect } from 'react'; +import { Dropdown } from 'primereact/dropdown'; +import { Button } from 'primereact/button'; +import { Column } from 'primereact/column'; +import { Tag } from 'primereact/tag'; +import BaseCrudTable from '@/core/components/BaseCrudTable'; +import BasePageHeader from '@/core/components/BasePageHeader'; +import TealUploadDialog from '../components/TealUploadDialog'; +import { tealService } from '../teal.service'; +import { projectService } from '@/modules/project/project.service'; +import type { TealEntry, TealVersion } from '../teal.types'; + +export default function TealListView() { + const [projects, setProjects] = useState<{ id: number; name: string; code: string }[]>([]); + const [selectedProjectId, setSelectedProjectId] = useState(null); + const [versions, setVersions] = useState([]); + const [selectedVersionId, setSelectedVersionId] = useState(null); + const [entries, setEntries] = useState([]); + const [loading, setLoading] = useState(false); + const [uploadVisible, setUploadVisible] = useState(false); + + useEffect(() => { + projectService.getAll() + .then(({ data }) => setProjects((data as { items?: unknown[] }).items as { id: number; name: string; code: string }[] ?? data as { id: number; name: string; code: string }[])) + .catch(() => setProjects([])); + }, []); + + useEffect(() => { + if (!selectedProjectId) { setVersions([]); setEntries([]); return; } + tealService.getVersions(selectedProjectId) + .then(({ data }) => setVersions(data as TealVersion[])) + .catch(() => setVersions([])); + }, [selectedProjectId]); + + useEffect(() => { + if (!selectedProjectId || !selectedVersionId) { setEntries([]); return; } + setLoading(true); + tealService.getActive(selectedProjectId) + .then(({ data }) => setEntries(data as TealEntry[])) + .catch(() => setEntries([])) + .finally(() => setLoading(false)); + }, [selectedProjectId, selectedVersionId]); + + async function handleUpload(file: File, effectiveDate: string) { + if (!selectedProjectId) return; + await tealService.upload(selectedProjectId, file, effectiveDate); + setUploadVisible(false); + const { data } = await tealService.getVersions(selectedProjectId); + setVersions(data as TealVersion[]); + } + + return ( +
+ setUploadVisible(true)} />} /> + +
+ ({ label: `${p.code} - ${p.name}`, value: p.id }))} onChange={(e) => { setSelectedProjectId(e.value); setSelectedVersionId(null); }} placeholder="프로젝트 선택" style={{ minWidth: '250px' }} /> + ({ label: `v${v.versionNumber} (${v.effectiveDate})`, value: v.id }))} onChange={(e) => setSelectedVersionId(e.value)} placeholder="버전 선택" disabled={!selectedProjectId} /> + {versions.find((v) => v.id === selectedVersionId) && ( + v.id === selectedVersionId)?.status ?? ''} severity={versions.find((v) => v.id === selectedVersionId)?.status === 'ACTIVE' ? 'success' : 'secondary'} /> + )} +
+ + + + + + + + setUploadVisible(false)} onUpload={handleUpload} /> +
+ ); +} diff --git a/wtm-frontend-react/src/modules/timesheet/components/TimesheetEntryRow.tsx b/wtm-frontend-react/src/modules/timesheet/components/TimesheetEntryRow.tsx new file mode 100644 index 0000000..f986259 --- /dev/null +++ b/wtm-frontend-react/src/modules/timesheet/components/TimesheetEntryRow.tsx @@ -0,0 +1,91 @@ +import { InputNumber } from 'primereact/inputnumber'; +import { Dropdown } from 'primereact/dropdown'; +import { Button } from 'primereact/button'; +import { NP_CATEGORIES } from '@/core/constants/app.constants'; +import type { EntryType } from '../timesheet.types'; + +interface EntryRow { + _uid: number; + entryType: EntryType; + npCategory?: string; + otherProjectId?: number; + epcProjectId?: number; + canonicalWbsId?: number; + tealEntryId?: number; + hours: Record; + remark?: string; +} + +interface Props { + entry: EntryRow; + projects: { id: number; name: string }[]; + days: string[]; + dayLabels: string[]; + disabled?: boolean; + onUpdate: (updated: Partial) => void; + onRemove: () => void; +} + +export default function TimesheetEntryRow({ entry, projects, days, dayLabels, disabled, onUpdate, onRemove }: Props) { + const rowTotal = Object.values(entry.hours).reduce((a, b) => a + b, 0); + + function setHour(day: string, val: number | null) { + onUpdate({ hours: { ...entry.hours, [day]: val ?? 0 } }); + } + + return ( + + + {entry.entryType === 'NON_PROJECT' && ( + ({ label: c.label, value: c.value }))} + onChange={(e) => onUpdate({ npCategory: e.value })} + placeholder="카테고리 선택" + disabled={disabled} + style={{ width: '100%' }} + /> + )} + {entry.entryType === 'OTHER_PROJECT' && ( + ({ label: p.name, value: p.id }))} + onChange={(e) => onUpdate({ otherProjectId: e.value })} + placeholder="프로젝트 선택" + disabled={disabled} + style={{ width: '100%' }} + /> + )} + {entry.entryType === 'EPC' && ( + ({ label: p.name, value: p.id }))} + onChange={(e) => onUpdate({ epcProjectId: e.value })} + placeholder="프로젝트 선택" + disabled={disabled} + style={{ width: '100%' }} + /> + )} + + {days.map((day, i) => ( + + setHour(day, e.value ?? 0)} + min={0} + max={16} + step={0.5} + disabled={disabled} + inputStyle={{ width: '60px', textAlign: 'center' }} + minFractionDigits={1} + maxFractionDigits={1} + /> + + ))} + {rowTotal.toFixed(1)} + +