diff --git a/package.json b/package.json index ca212946..6bde2b73 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "debug": "~2.6.9", "express": "~4.16.0", "http-errors": "~1.6.2", + "moment": "^2.23.0", "morgan": "~1.9.0", "multer": "^1.4.1", "pg": "^7.7.1", diff --git a/server/controllers/workday.js b/server/controllers/workday.js new file mode 100644 index 00000000..0c037c93 --- /dev/null +++ b/server/controllers/workday.js @@ -0,0 +1,81 @@ +import * as XLSX from 'xlsx'; +import moment from 'moment'; +import model from '../models'; + +const {WorkDay} = model; +const {Avatar} = model; +class Workdays { + /** + * + * @param req + * @param res + */ + static importTimelyFile(req, res) { + // get the user id from the url + const user_id = req.params.avatarId; + Avatar.findById(user_id) + .then(avatar => { + if (avatar) { + const userName = avatar.first_name + ' ' + avatar.last_name; + // parse the excel file from the request + if (req.file) { + const workbook = XLSX.read(req.file.buffer, {type: 'buffer'}); + const sheetNameList = workbook.SheetNames; + const sheetInJson = XLSX.utils.sheet_to_json(workbook.Sheets[sheetNameList[1]]); + // remove the first row from the array. because it contains only the total hours logged + sheetInJson.shift(); + const length = sheetInJson.length; + for (let element of sheetInJson) { + const nameInFile = element['Name']; + if (nameInFile === userName) { + WorkDay.create({ + user_id, + date: moment.utc(element['Date'], 'DD/MM/YYYY').toDate(), + from: element['From'], + to: element['To'], + logged_hours: element['Logged'], + tags: element['Tags'], + notes: element['Note'] + }) + .then(() => { + if (sheetInJson.indexOf(element) === length - 1) { + return res.status(200).send({ + status: true, + msg: 'Entries saved to database successfully' + }); + } + }) + .catch(error => { + console.error(error); + return res.status(400).send(error); + }); + } + } + } else { + return res.status(400).send({ + status: false, + errors: [ + { + name: 'File not found error', + detail: 'File was not found in the request.' + } + ] + }); + } + } else { + return res.status(400).send({ + status: false, + errors: [ + { + name: 'User not found error', + details: 'User with id ' + user_id + ' was not found in the database' + } + ] + }); + } + }) + .catch(error => res.status(400).send(error)); + } +} + +export default Workdays; diff --git a/server/routes/workday.js b/server/routes/workday.js index 5fe28559..104cbd31 100644 --- a/server/routes/workday.js +++ b/server/routes/workday.js @@ -1,20 +1,10 @@ import express from 'express'; import multer from 'multer'; -import * as XLSX from 'xlsx'; +import Workday from '../controllers/workday'; const routes = express.Router(); const upload = multer({storage: multer.memoryStorage()}); -routes.post('/upload', upload.single('reportFile'), (req, res, next) => { - const workbook = XLSX.read(req.file.buffer, {type: 'buffer'}); - const sheet_name_list = workbook.SheetNames; - const sheet_in_json = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[1]]); - for (let element of sheet_in_json) { - console.log(element); - } - return res.status(200).send({ - status: true - }); -}); +routes.post('/:avatarId/upload', upload.single('reportFile'), Workday.importTimelyFile); export default routes; diff --git a/yarn.lock b/yarn.lock index bf82ab71..6d19fe67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1286,7 +1286,7 @@ d@1: dependencies: es5-ext "^0.10.9" -date-fns@^1.27.2: +date-fns@^1.27.2, date-fns@^1.30.1: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== @@ -2865,7 +2865,7 @@ moment-timezone@^0.5.14: dependencies: moment ">= 2.9.0" -"moment@>= 2.9.0", moment@^2.20.0: +"moment@>= 2.9.0", moment@^2.20.0, moment@^2.23.0: version "2.23.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA==