const request = require('request-promise'); const humanizeDuration = require('humanize-duration'); function getTimesheetSummaryTotalsRequest(config, username, date) { const options = { uri: `${config.synergist.apiUrl}jsonapi/timesheets.json`, qs: { username, password: config.synergist.password, date, user: config.synergist.superuser, version: config.synergist.version, company: config.synergist.company, action: 'timesheetsummaryresource' } }; return request(options); } function makeGetTimesheetCompleted(config, logger, date) { return async shortName => { try { const response = await getTimesheetSummaryTotalsRequest(config, shortName, date); try { const data = JSON.parse(response); const hoursChargeable = data.resource[0].variable_timesheetsummaryresourcechargeable; const hoursNonChargeable = data.resource[0].variable_timesheetsummaryresourcenonchargeable; const hoursRequired = data.resource[0].variable_timesheethoursrequired; const complete = hoursChargeable + hoursNonChargeable >= hoursRequired; return complete; } catch (err) { logger.warn('Empty timesheet response for user', { shortName, date }); logger.error(err.stack); return null; } } catch (requestErr) { logger.warn('Timesheet request failed for user', { shortName, date }); logger.error(requestErr.stack); return null; } }; } async function getUsersWithMissingTimesheets(config, logger, range, users) { logger.debug('[SYNERGIST] Getting employee timesheet information...'); const t0 = Date.now(); const startDate = range.start.format('DD/MM/YYYY'); const getTimesheetCompleted = makeGetTimesheetCompleted(config, logger, startDate); const results = await Promise.all(users.map(user => getTimesheetCompleted(user.shortName) )); const t1 = Date.now(); logger.debug(`[SYNERGIST] Took ${humanizeDuration(t1 - t0)} to fetch timesheet information`); return users.filter((user, index) => results[index] !== null && !results[index]); } module.exports = { getUsersWithMissingTimesheets };