Files
minicrm/cron-jobs.js

92 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// cron-jobs.js
const { logActivity } = require('./database');
/**
* Проверяет задачи с типом document_approval, у которых указан номер документа,
* и автоматически переводит всех их исполнителей в статус completed.
* Задача остаётся открытой (closed_at не заполняется).
* @param {Object} db - экземпляр базы данных SQLite
*/
function checkDocumentsForCompletion(db) {
console.log('🔄 [CRON] Проверка задач документов для автоматического завершения исполнителей...');
// Находим активные задачи типа document, у которых есть номер документа
// и которые ещё не закрыты (closed_at IS NULL) можно оставить для страховки
const query = `
SELECT id, title, document_n
FROM tasks
WHERE task_type = 'document'
AND status = 'active'
AND closed_at IS NULL
AND document_n IS NOT NULL
AND document_n != ''
`;
db.all(query, [], (err, tasks) => {
if (err) {
console.error('❌ [CRON] Ошибка при поиске задач документов:', err);
return;
}
if (!tasks || tasks.length === 0) {
console.log(' [CRON] Нет задач документов, требующих завершения исполнителей.');
return;
}
console.log(`🔍 [CRON] Найдено ${tasks.length} задач документов с номером.`);
tasks.forEach(task => {
// Для каждой задачи находим всех исполнителей, у которых статус не 'completed'
const assignmentQuery = `
SELECT id, user_id, status
FROM task_assignments
WHERE task_id = ? AND status != 'completed'
`;
db.all(assignmentQuery, [task.id], (err, assignments) => {
if (err) {
console.error(`❌ [CRON] Ошибка при получении исполнителей задачи ${task.id}:`, err);
return;
}
if (!assignments || assignments.length === 0) {
console.log(` [CRON] Задача ${task.id} (${task.title}) уже имеет всех исполнителей со статусом completed.`);
return;
}
console.log(`📋 [CRON] Задача ${task.id}: нужно завершить ${assignments.length} исполнителей.`);
// Обновляем статус каждого исполнителя на 'completed'
assignments.forEach(assignment => {
db.run(
`UPDATE task_assignments SET status = 'completed', updated_at = CURRENT_TIMESTAMP WHERE id = ?`,
[assignment.id],
function(err) {
if (err) {
console.error(`❌ [CRON] Ошибка обновления назначения ${assignment.id}:`, err);
} else {
console.log(`✅ [CRON] Исполнитель ${assignment.user_id} задачи ${task.id} завершён автоматически.`);
// Логируем действие
try {
logActivity(
task.id,
0, // системное действие, user_id = null
'AUTO_COMPLETED',
`Автоматически завершено после указания номера документа`
);
} catch (logErr) {
console.error('❌ [CRON] Ошибка логирования:', logErr);
}
}
}
);
});
});
});
});
}
module.exports = {
checkDocumentsForCompletion
};