fix: 캘린더 모달 중복 카드 문제 및 삭제 권한 개선

- monthly_worker_status 조회 시 GROUP BY로 중복 데이터 합산
- 작업보고서 삭제 권한을 그룹장 이상으로 제한 (admin, system, group_leader)
- 중복 데이터 정리를 위한 마이그레이션 SQL 추가 (009_fix_duplicate_monthly_status.sql)
- synology_deployment 버전에도 동일 수정 적용
This commit is contained in:
Hyungi Ahn
2025-12-02 13:08:44 +09:00
parent beaffcad49
commit a9bce9d20b
419 changed files with 275129 additions and 394 deletions

View File

@@ -203,7 +203,7 @@ class WorkAnalysis {
dwr.created_at
FROM daily_work_reports dwr
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
LEFT JOIN Projects p ON dwr.project_id = p.project_id
LEFT JOIN projects p ON dwr.project_id = p.project_id
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
LEFT JOIN work_status_types wst ON dwr.work_status_id = wst.id
LEFT JOIN error_types et ON dwr.error_type_id = et.id

View File

@@ -37,7 +37,7 @@ const getAnalysis = async (startDate, endDate) => {
const byProjectSql = `
SELECT p.project_name as name, SUM(${workHoursCalc}) as hours, COUNT(DISTINCT dwr.worker_id) as participants
FROM DailyWorkReports dwr
JOIN Projects p ON dwr.project_id = p.project_id
JOIN projects p ON dwr.project_id = p.project_id
${whereClause}
GROUP BY p.project_name
HAVING hours > 0
@@ -73,7 +73,7 @@ const getAnalysis = async (startDate, endDate) => {
t.category as task_category, dwr.work_details,
(${workHoursCalc}) as work_hours, dwr.memo
FROM DailyWorkReports dwr
JOIN Projects p ON dwr.project_id = p.project_id
JOIN projects p ON dwr.project_id = p.project_id
JOIN workers w ON dwr.worker_id = w.worker_id
JOIN Tasks t ON dwr.task_id = t.task_id
${whereClause}

View File

@@ -47,7 +47,7 @@ const getAllByDate = async (date) => {
t.category, t.subcategory, d.description
FROM DailyIssueReports d
LEFT JOIN workers w ON d.worker_id = w.worker_id
LEFT JOIN Projects p ON d.project_id = p.project_id
LEFT JOIN projects p ON d.project_id = p.project_id
LEFT JOIN IssueTypes t ON d.issue_type_id = t.issue_type_id
WHERE d.date = ?
ORDER BY d.start_time ASC`,

View File

@@ -45,14 +45,30 @@ class MonthlyStatusModel {
const db = await getDb();
try {
// 중복 방지: worker_id와 date로 그룹화하고 최신 데이터만 조회
const [rows] = await db.execute(`
SELECT
mws.*,
mws.worker_id,
w.worker_name,
w.job_type
w.job_type,
MAX(mws.year) as year,
MAX(mws.month) as month,
mws.date,
SUM(mws.total_work_hours) as total_work_hours,
SUM(mws.actual_work_hours) as actual_work_hours,
SUM(mws.vacation_hours) as vacation_hours,
SUM(mws.total_work_count) as total_work_count,
SUM(mws.regular_work_count) as regular_work_count,
SUM(mws.error_work_count) as error_work_count,
MAX(mws.work_status) as work_status,
MAX(mws.has_vacation) as has_vacation,
MAX(mws.has_error) as has_error,
MAX(mws.has_issues) as has_issues,
MAX(mws.last_updated) as last_updated
FROM monthly_worker_status mws
JOIN workers w ON mws.worker_id = w.worker_id
WHERE mws.date = ?
GROUP BY mws.worker_id, mws.date, w.worker_name, w.job_type
ORDER BY w.worker_name ASC
`, [date]);

View File

@@ -91,7 +91,7 @@ const create = async (report, callback) => {
wr.memo
FROM WorkReports wr
LEFT JOIN workers w ON wr.worker_id = w.worker_id
LEFT JOIN Projects p ON wr.project_id = p.project_id
LEFT JOIN projects p ON wr.project_id = p.project_id
LEFT JOIN Tasks t ON wr.task_id = t.task_id
WHERE wr.\`date\` = ?
ORDER BY w.worker_name ASC