synergist.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. const request = require('request-promise');
  2. const humanizeDuration = require('humanize-duration');
  3. function getTimesheetSummaryTotalsRequest(config, username, date) {
  4. const options = {
  5. uri: `${config.synergist.apiUrl}jsonapi/timesheets.json`,
  6. qs: {
  7. username,
  8. password: config.synergist.password,
  9. date,
  10. user: config.synergist.superuser,
  11. version: config.synergist.version,
  12. company: config.synergist.company,
  13. action: 'timesheetsummaryresource'
  14. }
  15. };
  16. return request(options);
  17. }
  18. function makeGetTimesheetCompleted(config, logger, date) {
  19. return async shortName => {
  20. try {
  21. const response = await getTimesheetSummaryTotalsRequest(config, shortName, date);
  22. try {
  23. const data = JSON.parse(response);
  24. const hoursChargeable = data.resource[0].variable_timesheetsummaryresourcechargeable;
  25. const hoursNonChargeable = data.resource[0].variable_timesheetsummaryresourcenonchargeable;
  26. const hoursRequired = data.resource[0].variable_timesheethoursrequired;
  27. const complete = hoursChargeable + hoursNonChargeable >= hoursRequired;
  28. return complete;
  29. } catch (err) {
  30. logger.warn('Empty timesheet response for user', { shortName, date });
  31. logger.error(err.stack);
  32. return null;
  33. }
  34. } catch (requestErr) {
  35. logger.warn('Timesheet request failed for user', { shortName, date });
  36. logger.error(requestErr.stack);
  37. return null;
  38. }
  39. };
  40. }
  41. async function getUsersWithMissingTimesheets(config, logger, range, users) {
  42. logger.debug('[SYNERGIST] Getting employee timesheet information...');
  43. const t0 = Date.now();
  44. const startDate = range.start.format('DD/MM/YYYY');
  45. const getTimesheetCompleted = makeGetTimesheetCompleted(config, logger, startDate);
  46. const results = await Promise.all(users.map(user =>
  47. getTimesheetCompleted(user.shortName)
  48. ));
  49. const t1 = Date.now();
  50. logger.debug(`[SYNERGIST] Took ${humanizeDuration(t1 - t0)} to fetch timesheet information`);
  51. return users.filter((user, index) => results[index] !== null && !results[index]);
  52. }
  53. module.exports = {
  54. getUsersWithMissingTimesheets
  55. };