feat(sprint-002): 대리입력 + 일별 현황 대시보드 (Section A+B)

Section A (Backend):
- POST /api/proxy-input: TBM 세션+팀배정+작업보고서 일괄 생성 (트랜잭션)
- GET /api/proxy-input/daily-status: 일별 TBM/보고서 입력 현황
- GET /api/proxy-input/daily-status/detail: 작업자별 상세
- tbm_sessions에 is_proxy_input, proxy_input_by 컬럼 추가
- system1/system2/tkuser requireMinLevel → shared requirePage 전환
- permissionModel에 factory_proxy_input, factory_daily_status 키 등록

Section B (Frontend):
- daily-status.html: 날짜 네비 + 요약 카드 + 필터 탭 + 작업자 리스트 + 바텀시트
- proxy-input.html: 미입력자 카드 + 확장 폼 + 일괄 설정 + 저장
- tkfb-core.js NAV_MENU에 입력 현황/대리입력 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-30 07:40:56 +09:00
parent 66676ac923
commit 6411eab210
28 changed files with 2097 additions and 96 deletions

View File

@@ -29,6 +29,26 @@ const DEFAULT_PAGES = {
's1.admin.equipments': { title: '설비 관리', system: 'system1', group: '시스템 관리', default_access: false },
's1.admin.issue_categories': { title: '신고 카테고리 관리', system: 'system1', group: '시스템 관리', default_access: false },
's1.admin.attendance_report': { title: '출퇴근-보고서 대조', system: 'system1', group: '시스템 관리', default_access: false },
// 관리
'factory_proxy_input': { title: '대리입력', system: 'system1', group: '관리', default_access: false },
'factory_daily_status': { title: '일별 현황', system: 'system1', group: '관리', default_access: false },
'factory_tbm': { title: 'TBM 관리', system: 'system1', group: '관리', default_access: false },
'factory_work_report': { title: '작업보고서', system: 'system1', group: '관리', default_access: false },
'factory_projects': { title: '프로젝트 관리', system: 'system1', group: '관리', default_access: false },
'factory_work_issues': { title: '업무 이슈', system: 'system1', group: '관리', default_access: false },
'factory_purchases': { title: '구매 관리', system: 'system1', group: '관리', default_access: false },
'factory_schedules': { title: '일정 관리', system: 'system1', group: '관리', default_access: false },
'factory_settlements': { title: '정산 관리', system: 'system1', group: '관리', default_access: false },
'factory_meetings': { title: '회의 관리', system: 'system1', group: '관리', default_access: false },
'factory_departments': { title: '부서 관리', system: 'system1', group: '관리', default_access: false },
'factory_tools': { title: '도구 관리', system: 'system1', group: '관리', default_access: false },
'factory_uploads': { title: '업로드 관리', system: 'system1', group: '관리', default_access: false },
'factory_work_analysis': { title: '공수 분석', system: 'system1', group: '관리', default_access: false },
'factory_system': { title: '시스템 관리', system: 'system1', group: '시스템 관리', default_access: false },
// system2 report
'report_work_issues': { title: '업무 이슈', system: 'system2', group: '관리', default_access: false },
// tkpurchase
'purchase_schedules': { title: '작업일정', system: 'tkpurchase', group: '관리', default_access: false },
// ===== System 3 - 부적합관리 =====
// 메인

View File

@@ -2,7 +2,10 @@
const express = require('express');
const router = express.Router();
const notificationController = require('../controllers/notificationController');
const { requireAuth, requireMinLevel } = require('../middleware/auth');
const { requireAuth } = require('../middleware/auth');
const { createRequirePage } = require('../../../shared/middleware/pagePermission');
const { getPool } = require('../../shared/config/database');
const requirePage = createRequirePage(getPool);
// 내부 서비스용 알림 생성 (X-Internal-Service-Key 인증, JWT 불필요)
router.post('/internal', notificationController.createInternal);
@@ -20,7 +23,7 @@ router.get('/unread/count', notificationController.getUnreadCount);
router.get('/', notificationController.getAll);
// 알림 생성 (시스템/관리자용)
router.post('/', requireMinLevel('support_team'), notificationController.create);
router.post('/', requirePage('tkuser.notifications'), notificationController.create);
// 모든 알림 읽음 처리 (본인 알림만)
router.post('/read-all', notificationController.markAllAsRead);

View File

@@ -8,7 +8,10 @@
const express = require('express');
const router = express.Router();
const vc = require('../controllers/vacationController');
const { requireAuth, requireAdminOrPermission, requireMinLevel } = require('../middleware/auth');
const { requireAuth, requireAdminOrPermission } = require('../middleware/auth');
const { createRequirePage } = require('../../../shared/middleware/pagePermission');
const { getPool } = require('../../shared/config/database');
const requirePage = createRequirePage(getPool);
const vacPerm = requireAdminOrPermission('tkuser.vacations');
@@ -29,6 +32,6 @@ router.put('/balances/:id', vacPerm, vc.updateBalance);
router.delete('/balances/:id', vacPerm, vc.deleteBalance);
// 장기근속 제외 설정
router.put('/long-service-exclusion', requireMinLevel('support_team'), vc.setLongServiceExclusion);
router.put('/long-service-exclusion', requirePage('tkuser.vacations'), vc.setLongServiceExclusion);
module.exports = router;