const fs = require('node-fs') const sourceFilePath = 'source/tasks.json'; const stats = { countAllTasks: 0, tasksByDay: {} } // const enableFilterByTag = true; const enableFilterByTag = false; const filterByTag = "work"; // const outputFileName = "work_report"; const outputFileName = "all_tasks_report"; let countExcluded = 0; let countIncluded = 0; // prendre le json source représentant les tâches DONE console.log(' ### lecture de source/emacs_json.json'); fs.stat(sourceFilePath, function (err, stat) { if (err == null) { console.log(`File ${sourceFilePath} exists`); sortTasksFromJson(stat) } else if (err.code === 'ENOENT') { // file does not exist console.error(`le fichier ${sourceFilePath} est introuvable. Impossible d en extraire des infos.`) } else { console.log('Some other error: ', err.code); } }); // parcourir les tâches function sortTasksFromJson(statObject) { console.log('sortTasksFromJson') fs.readFile(sourceFilePath, 'utf8', function (err, data) { if (err) { return console.log(err); } let dataTransformed = JSON.parse(data); // console.log('data keys ', Object.keys(dataTransformed)) if (dataTransformed["contents"]) { countTasks = dataTransformed["contents"].length stats.countAllTasks = countTasks; console.log('yes data ! tasks:', countTasks) dataTransformed["contents"].forEach((elem, index) => { // console.log('tâche ', index) // évacuer les sous tâches // if (elem['contents']) { // console.log('content ception, on évacue') // countExcluded++; // return; // } // filtrer par tag les tâches if (enableFilterByTag) { console.log('filtre activé', filterByTag) if (!elem['drawer'] || !elem['properties']['tags']) { console.log('on vire cette tâche n\'ayant pas de drawer :', elem) countExcluded++; return; } else if ( elem['properties'] && typeof elem['properties']['tags'] !== "undefined" && elem['properties']['tags'].indexOf(filterByTag) === -1 ) { console.log('on vire cette tâche ayant les itags :', elem['drawer']['ARCHIVE_ITAGS']) countExcluded++; return; } } else { console.log(' - filtre désactivé') } // après le filtre, on range les tâches if (elem['properties']) { console.log(' - ref ', elem['ref']) let title = elem['properties']['raw-value']; let tags = elem['tags'] ? elem['tags'] : []; let closeDate = 'Indéfini'; let todoKeyword = 'DONE'; if (elem['properties']['closed']) { closeDate = elem['properties']['closed']['end']; } else if (elem['drawer'] && elem['drawer']['ARCHIVE_TIME']) { closeDate = elem['drawer']['ARCHIVE_TIME']; } if (elem['drawer'] && elem['drawer']['ARCHIVE_TODO']) { todoKeyword = elem['drawer']['ARCHIVE_TODO']; } // jour, 11 premiers caractères let day = closeDate.substring(0, 10); if (!stats.tasksByDay[day]) { stats.tasksByDay[day] = [] } stats.tasksByDay[day].push({ todoKeyword, title, day, closeDate, tags, }) // console.log(' ' + title) countIncluded++; } else { console.log('no', elem['properties']['raw-value']) } }) } else { console.log('no content') } // console.log(data); console.log('tâches inclues:', countIncluded) writeHtmlOutput() }); // les répartir dans des tableaux selon les périodes de temps } // sortir un html présentant les périodes de temps et les tâches réalisées function writeHtmlOutput() { console.log('writeHtmlOutput', stats.countAllTasks) let daysListRef = Object.keys(stats.tasksByDay).sort() let filterInfo = `` if (enableFilterByTag) { filterInfo = `

Contenu filtré sur le tag: ${filterByTag}. ${countExcluded} tâches exclues, ${countIncluded} tâches inclues sur le total de ${countExcluded + countIncluded}

` } let htmlOut = ` Rapport d'activité

Feuille de rapport d'activité

par Tykayn

${filterInfo} ` daysListRef.reverse().forEach((dayRefString) => { let tasksOfTheDay = ''; stats.tasksByDay[dayRefString].forEach((dayObj) => { let graphicKeyword = '✅' if ('DONE' !== dayObj.todoKeyword) { graphicKeyword = dayObj.todoKeyword; } let tagDisplay = ''; if (dayObj.tags.length) { tagDisplay = `

${dayObj.tags.join(' ')}

` } tasksOfTheDay += `
  • ${graphicKeyword} ${dayObj.title}

    ${tagDisplay}
  • ` }) htmlOut += `

    ${dayRefString} ${stats.tasksByDay[dayRefString].length}

      ${tasksOfTheDay}
    ` }) htmlOut += `

    Tadam, c'est tout!

    Source: org-report-stats
    Contactez-moi: par un de ces moyens

    ` fs.writeFile('output/output.json', JSON.stringify(stats), function (err, data) { if (err) { return console.log(err); } console.log('wrote output json', data) }) fs.writeFile('output/output_' + outputFileName + '.html', htmlOut, function (err, data) { if (err) { return console.log(err); } console.log('wrote output html ' + outputFileName, data) }) if (enableFilterByTag) { console.log('excluded tasks by tag filter ', countExcluded) } } function sortObj(obj) { return Object.keys(obj).sort().reduce(function (result, key) { result[key] = obj[key]; return result; }, {}); }