# All files / models dailyIssueReportModel.js

0% Statements 0/61
0% Branches 0/1
0% Functions 0/9
0% Lines 0/59

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154

     const { getDb } = require('../dbPool');

    /**
     * 1. 여러 개의 이슈 보고서를 트랜잭션으로 생성합니다.
     * @param {Array<object>} reports - 생성할 보고서 데이터 배열
     * @returns {Promise<Array<number>>} - 삽입된 ID 배열
     */
    const createMany = async (reports) => {
      const db = await getDb();
      const conn = await db.getConnection();
      try {
        await conn.beginTransaction();

        const insertedIds = [];
        const sql = `
          INSERT INTO DailyIssueReports
          (date, worker_id, project_id, start_time, end_time, issue_type_id)
          VALUES (?, ?, ?, ?, ?, ?)
        `;

        for (const report of reports) {
          const { date, worker_id, project_id, start_time, end_time, issue_type_id } = report;
          const [result] = await conn.query(sql, [date, worker_id, project_id, start_time, end_time, issue_type_id]);
          insertedIds.push(result.insertId);
        }

        await conn.commit();
        return insertedIds;
      } catch (err) {
        await conn.rollback();
        console.error('[Model] 여러 이슈 보고서 생성 중 오류:', err);
        throw new Error('데이터베이스에 이슈 보고서를 생성하는 중 오류가 발생했습니다.');
      } finally {
        conn.release();
      }
    };

    /**
     * 2. 특정 날짜의 전체 이슈 목록 조회 (Promise 기반)
     */
    const getAllByDate = async (date) => {
      try {
        const db = await getDb();
        const [rows] = await db.query(
          `SELECT
            d.id, d.date, w.worker_name, p.project_name, d.start_time, d.end_time,
            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 IssueTypes t ON d.issue_type_id = t.issue_type_id
           WHERE d.date = ?
           ORDER BY d.start_time ASC`,
          [date]
        );
        return rows;
      } catch (err) {
        console.error(`[Model] ${date} 이슈 목록 조회 오류:`, err);
        throw new Error('데이터베이스에서 이슈 목록을 조회하는 중 오류가 발생했습니다.');
      }
    };

    /**
     * 3. 단일 조회 (선택사항: 컨트롤러에서 사용 중)
     */
    const getById = async (id, callback) => {
      try {
        const db = await getDb();
        const [rows] = await db.query(`SELECT * FROM DailyIssueReports WHERE id = ?`, [id]);
        callback(null, rows[0]);
      } catch (err) {
        callback(err);
      }
    };

    /**
     * 4. 수정
     */
    const update = async (id, data, callback) => {
      try {
        const db = await getDb();

        const fields = [];
        const values = [];

        for (const key in data) {
          fields.push(`${key} = ?`);
          values.push(data[key]);
        }

        values.push(id); // 마지막에 id

        const [result] = await db.query(
          `UPDATE DailyIssueReports SET ${fields.join(', ')} WHERE id = ?`,
          values
        );

        callback(null, result.affectedRows);
      } catch (err) {
        callback(err);
      }
    };

    /**
     * 5. 삭제 (Promise 기반)
     */
    const remove = async (id) => {
      try {
        const db = await getDb();
        const [result] = await db.query(`DELETE FROM DailyIssueReports WHERE id = ?`, [id]);
        return result.affectedRows;
      } catch (err) {
        console.error(`[Model] 이슈(id: ${id}) 삭제 오류:`, err);
        throw new Error('데이터베이스에서 이슈를 삭제하는 중 오류가 발생했습니다.');
      }
    };

    // V1 함수들은 점진적으로 제거 예정
    const create = async (report, callback) => {
      try {
        const db = await getDb();
        const {
          date,
          worker_id,
          project_id,
          start_time,
          end_time,
          issue_type_id,
          description = null // 선택값 처리
        } = report;

        const [result] = await db.query(
          `INSERT INTO DailyIssueReports
           (date, worker_id, project_id, start_time, end_time, issue_type_id, description)
           VALUES (?, ?, ?, ?, ?, ?, ?)`,
          [date, worker_id, project_id, start_time, end_time, issue_type_id, description]
        );

        callback(null, result.insertId);
      } catch (err) {
        callback(err);
      }
    };

    module.exports = {
      createMany, // 신규
      getAllByDate,
      remove,
      // 레거시 호환성을 위해 V1 함수들 임시 유지
      create: (report, callback) => createMany([report]).then(ids => callback(null, ids[0])).catch(err => callback(err)),
      getById,
      update,
    };