feat: 안전 코드 tksafety 이관 + 사용자 관리 정리 + UI Tailwind 전환
Phase 1: tksafety에 출입신청/체크리스트 API·웹 추가, tkfb 안전 코드 삭제
Phase 2: 사용자 관리 페이지 삭제, API 축소, 알림 수신자 tkuser 이관
Phase 3: tkuser 권한 페이지 정의 업데이트
Phase 4: 전체 34개 페이지 Tailwind CSS + tkfb-core.js 전환,
미사용 CSS 20개·인프라 JS 10개·템플릿·컴포넌트 삭제
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,12 +3,14 @@ const { getPool } = require('./partnerModel');
|
||||
async function findAll({ company_id, date_from, date_to, schedule_id, confirmed, page = 1, limit = 50 } = {}) {
|
||||
const db = getPool();
|
||||
let sql = `SELECT wr.*, pc.company_name, ps.work_description AS schedule_description,
|
||||
su_reporter.name AS reporter_name, su_confirmer.name AS confirmed_by_name
|
||||
su_reporter.name AS reporter_name, su_confirmer.name AS confirmed_by_name,
|
||||
su_rejector.name AS rejected_by_name
|
||||
FROM partner_work_reports wr
|
||||
LEFT JOIN partner_companies pc ON wr.company_id = pc.id
|
||||
LEFT JOIN partner_schedules ps ON wr.schedule_id = ps.id
|
||||
LEFT JOIN sso_users su_reporter ON wr.reporter_id = su_reporter.user_id
|
||||
LEFT JOIN sso_users su_confirmer ON wr.confirmed_by = su_confirmer.user_id
|
||||
LEFT JOIN sso_users su_rejector ON wr.rejected_by = su_rejector.user_id
|
||||
WHERE 1=1`;
|
||||
const params = [];
|
||||
if (company_id) { sql += ' AND wr.company_id = ?'; params.push(company_id); }
|
||||
@@ -29,12 +31,14 @@ async function findById(id) {
|
||||
const db = getPool();
|
||||
const [rows] = await db.query(
|
||||
`SELECT wr.*, pc.company_name, ps.work_description AS schedule_description,
|
||||
su_reporter.name AS reporter_name, su_confirmer.name AS confirmed_by_name
|
||||
su_reporter.name AS reporter_name, su_confirmer.name AS confirmed_by_name,
|
||||
su_rejector.name AS rejected_by_name
|
||||
FROM partner_work_reports wr
|
||||
LEFT JOIN partner_companies pc ON wr.company_id = pc.id
|
||||
LEFT JOIN partner_schedules ps ON wr.schedule_id = ps.id
|
||||
LEFT JOIN sso_users su_reporter ON wr.reporter_id = su_reporter.user_id
|
||||
LEFT JOIN sso_users su_confirmer ON wr.confirmed_by = su_confirmer.user_id
|
||||
LEFT JOIN sso_users su_rejector ON wr.rejected_by = su_rejector.user_id
|
||||
WHERE wr.id = ?`, [id]);
|
||||
const report = rows[0] || null;
|
||||
if (report) {
|
||||
@@ -133,10 +137,11 @@ async function update(id, data) {
|
||||
if (data.issues !== undefined) { fields.push('issues = ?'); values.push(data.issues || null); }
|
||||
if (data.next_plan !== undefined) { fields.push('next_plan = ?'); values.push(data.next_plan || null); }
|
||||
|
||||
if (fields.length > 0) {
|
||||
values.push(id);
|
||||
await conn.query(`UPDATE partner_work_reports SET ${fields.join(', ')} WHERE id = ?`, values);
|
||||
}
|
||||
// 수정(재제출) 시 반려 상태 자동 해제
|
||||
fields.push('rejected_by = NULL', 'rejected_at = NULL', 'rejection_reason = NULL');
|
||||
|
||||
values.push(id);
|
||||
await conn.query(`UPDATE partner_work_reports SET ${fields.join(', ')} WHERE id = ?`, values);
|
||||
|
||||
// workers 교체 (있으면)
|
||||
if (data.workers !== undefined) {
|
||||
@@ -164,11 +169,19 @@ async function update(id, data) {
|
||||
async function confirm(id, confirmedBy) {
|
||||
const db = getPool();
|
||||
await db.query(
|
||||
'UPDATE partner_work_reports SET confirmed_by = ?, confirmed_at = NOW() WHERE id = ? AND confirmed_by IS NULL',
|
||||
'UPDATE partner_work_reports SET confirmed_by = ?, confirmed_at = NOW() WHERE id = ? AND confirmed_by IS NULL AND rejected_by IS NULL',
|
||||
[confirmedBy, id]);
|
||||
return findById(id);
|
||||
}
|
||||
|
||||
async function reject(id, rejectedBy, reason) {
|
||||
const db = getPool();
|
||||
await db.query(
|
||||
'UPDATE partner_work_reports SET rejected_by = ?, rejected_at = NOW(), rejection_reason = ? WHERE id = ? AND confirmed_by IS NULL',
|
||||
[rejectedBy, reason, id]);
|
||||
return findById(id);
|
||||
}
|
||||
|
||||
async function findAllAggregated({ company_id, schedule_id, date_from, date_to } = {}) {
|
||||
const db = getPool();
|
||||
let sql = `SELECT
|
||||
@@ -234,4 +247,16 @@ async function exportData({ company_id, schedule_id, date_from, date_to } = {})
|
||||
return rows;
|
||||
}
|
||||
|
||||
module.exports = { findAll, findById, findByCheckin, countByCheckin, create, update, confirm, findAllAggregated, exportData };
|
||||
async function deleteReport(id) {
|
||||
const db = getPool();
|
||||
await db.query('DELETE FROM partner_work_reports WHERE id = ?', [id]);
|
||||
}
|
||||
|
||||
async function unconfirm(id) {
|
||||
const db = getPool();
|
||||
await db.query(
|
||||
'UPDATE partner_work_reports SET confirmed_by = NULL, confirmed_at = NULL WHERE id = ?', [id]);
|
||||
return findById(id);
|
||||
}
|
||||
|
||||
module.exports = { findAll, findById, findByCheckin, countByCheckin, create, update, confirm, reject, deleteReport, unconfirm, findAllAggregated, exportData };
|
||||
|
||||
Reference in New Issue
Block a user