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:
@@ -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 - 부적합관리 =====
|
||||
// 메인
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user