diff --git a/backend/migrations/019_add_completion_request_fields.sql b/backend/migrations/019_add_completion_request_fields.sql new file mode 100644 index 0000000..7b9d144 --- /dev/null +++ b/backend/migrations/019_add_completion_request_fields.sql @@ -0,0 +1,37 @@ +-- 완료 신청 관련 필드 추가 +-- 마이그레이션: 019_add_completion_request_fields.sql + +DO $$ +BEGIN + -- 완료 신청 관련 필드들 추가 + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issues' AND column_name = 'completion_requested_at') THEN + ALTER TABLE issues ADD COLUMN completion_requested_at TIMESTAMP WITH TIME ZONE; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issues' AND column_name = 'completion_requested_by_id') THEN + ALTER TABLE issues ADD COLUMN completion_requested_by_id INTEGER REFERENCES users(id); + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issues' AND column_name = 'completion_photo_path') THEN + ALTER TABLE issues ADD COLUMN completion_photo_path VARCHAR(500); + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issues' AND column_name = 'completion_comment') THEN + ALTER TABLE issues ADD COLUMN completion_comment TEXT; + END IF; + + -- 마이그레이션 로그 기록 + INSERT INTO migration_log (migration_file, executed_at, status, notes) + VALUES ('019_add_completion_request_fields.sql', NOW(), 'SUCCESS', 'Added completion request fields: completion_requested_at, completion_requested_by_id, completion_photo_path, completion_comment'); + + RAISE NOTICE '✅ 완료 신청 관련 필드 추가 완료'; + RAISE NOTICE '📝 완료 신청 필드 마이그레이션 완료 - 019_add_completion_request_fields.sql'; + +EXCEPTION + WHEN OTHERS THEN + -- 오류 발생 시 로그 기록 + INSERT INTO migration_log (migration_file, executed_at, status, notes) + VALUES ('019_add_completion_request_fields.sql', NOW(), 'FAILED', 'Error: ' || SQLERRM); + + RAISE EXCEPTION '❌ 마이그레이션 실패: %', SQLERRM; +END $$; diff --git a/frontend/issues-dashboard.html b/frontend/issues-dashboard.html index 7e3ef7e..0765a20 100644 --- a/frontend/issues-dashboard.html +++ b/frontend/issues-dashboard.html @@ -517,15 +517,63 @@ }); }; - // 긴급도 체크 (예상완료일 기준) - const isUrgent = () => { - if (!issue.expected_completion_date) return false; - const expectedDate = new Date(issue.expected_completion_date); - const now = new Date(); - const diffDays = (expectedDate - now) / (1000 * 60 * 60 * 24); - return diffDays <= 3; // 3일 이내 또는 지연 + // 상태 체크 함수들 + const getIssueStatus = () => { + if (issue.review_status === 'completed') return 'completed'; + if (issue.completion_requested_at) return 'pending_completion'; // 완료 대기 + + if (issue.expected_completion_date) { + const expectedDate = new Date(issue.expected_completion_date); + const now = new Date(); + const diffDays = (expectedDate - now) / (1000 * 60 * 60 * 24); + + if (diffDays < 0) return 'overdue'; // 지연됨 + if (diffDays <= 3) return 'urgent'; // 긴급 + } + + return 'in_progress'; // 진행 중 }; + const getStatusConfig = (status) => { + const configs = { + 'in_progress': { + text: '진행 중', + bgColor: 'bg-gradient-to-r from-blue-500 to-blue-600', + icon: 'fas fa-cog fa-spin', + dotColor: 'bg-white' + }, + 'urgent': { + text: '긴급', + bgColor: 'bg-gradient-to-r from-orange-500 to-orange-600', + icon: 'fas fa-exclamation-triangle', + dotColor: 'bg-white' + }, + 'overdue': { + text: '지연됨', + bgColor: 'bg-gradient-to-r from-red-500 to-red-600', + icon: 'fas fa-clock', + dotColor: 'bg-white' + }, + 'pending_completion': { + text: '완료 대기', + bgColor: 'bg-gradient-to-r from-purple-500 to-purple-600', + icon: 'fas fa-hourglass-half', + dotColor: 'bg-white' + }, + 'completed': { + text: '완료됨', + bgColor: 'bg-gradient-to-r from-green-500 to-green-600', + icon: 'fas fa-check-circle', + dotColor: 'bg-white' + } + }; + return configs[status] || configs['in_progress']; + }; + + const currentStatus = getIssueStatus(); + const statusConfig = getStatusConfig(currentStatus); + const isUrgent = () => currentStatus === 'urgent'; + return `