attendanz-sync
Version:
Attendanz Synchronization V2
243 lines (230 loc) • 11.4 kB
JavaScript
const ADODB = require('node-adodb')
const request = require('request')
const chokidar = require('chokidar')
const fs = require('fs')
const nconf = require('nconf')
const glob = require("glob")
const line = require('line-api')
var notify = new line.Notify({token: 'UBOfbjsg3fGxXK4PvEkzNtL9madBRk5AuCg0Eri5P72'}) // Attendanz-Sync Notify Line Group
nconf.argv()
var companyname = nconf.get('companyname')
function error_notify (e) {
if (e.message == 'unknown error: call function result missing \'value\'') {
notify.send({message: 'Please install follow https://goo.gl/e5NtCS again with new driver.chrome.version'})
} else {
notify.send({message: e.toString()})
}
}
function line_log () {
// notify.send({message: JSON.stringify(arguments, null, 2)})
}
function set_data_response (error, response, body) {
try {
if (response) {
if (response.statusCode == 200) {
var result = JSON.parse(body)
if (typeof result.affected_rows == 'undefined' || result.affected_rows < 0) {
line_log(companyname, "SQL:", result.sql)
line_log(companyname, "Returned result:", result)
} else if (result.affected_rows == 1) /* mean inserted */ {
line_log(companyname, "Affected Rows:", result.affected_rows, 'in', result.table)
sent_total++
var conclusion = {
table: result.table
, total: row_total
, sent: sent_total
}
line_log(companyname, conclusion)
if (row_total == sent_total) {
notify.send({message: JSON.stringify(conclusion)})
}
} else if (result.affected_rows == 2) /* mean updated */ {
line_log(companyname, "SQL:", result.sql)
line_log(companyname, "Returned result:", result)
}
return result
} else {
line_log(companyname, "statusCode:", response.statusCode)
}
}
} catch (e) { error_notify(e) }
}
if (companyname === true || !companyname) {
line_log(companyname, "CONFIG >", "Please enter company name in argument [Example : node node_modules/attendanz --dbpath \"<XXXXXXXXX>\" --companyname \"<XXXXXXXXX>\"]")
process.exit()
}
var expression = "Program Files*/*/*20*.mdb"
var cwd = "C:"
if (nconf.get('dbpath')) {
expression = "*20*.mdb"
cwd = nconf.get('dbpath')
}
glob(expression, {cwd: cwd, nocase: true}, function (er, files) {
if (files) {
line_log(companyname, "PREPARE >", files.length, "database file(s) was found in", cwd)
for (i in files) {
var database_file_path = cwd + "\\" + files[i]
line_log(companyname, "PREPARE >", "Database file was found:", database_file_path)
var connection = ADODB.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + database_file_path + ';')
process.env.DEBUG = 'ADODB'
if (companyname) {
var watcher = chokidar.watch(database_file_path.replace('(','*').replace(')','*'), {
ignored: /(^|[\/\\])\../,
persistent: true,
interval: 3000,
})
watcher.on('add', function(path) {
var sql = 'SELECT USERID, Name, "' + companyname + '" AS COMPANY_NAME FROM USERINFO'
connection.query(sql).on('done', function(all_users) {
// line_log(companyname, all_users)
if (Object.keys(all_users).length > 0) {
// line_log(companyname, "EMPLOYEE SEND >", Object.keys(all_users).length, "Employee(s) was found send to server:")
for (j in all_users) {
// line_log(companyname, "EMPLOYEE SEND >", all_users[j])
var data = {
table: 'user'
, where: {
User_ID: all_users[j]['USERID']
}
, row: {
User_ID: all_users[j]['USERID']
, Name: all_users[j]['Name']
}
}
request.post({
url: 'https://' + companyname + '.attendanz.co/set-data.php'
, form: data
}, function (error, response, body) {
if (response.statusCode == 200) {
// line_log(companyname, "EMPLOYEE SEND >", "Result:", body)
/* if (nconf.get('test')) {
line_log(companyname, "TEST RECORD >", "You enable test mode. Start to insert test record")
connection.query('SELECT TOP 1 USERID AS FIRST_USERID FROM USERINFO ORDER BY USERID').on('done', function(data) {
line_log(companyname, "TEST RECORD >", data)
if (data[0]['FIRST_USERID']) {
var sql = 'INSERT INTO CHECKINOUT(USERID, CHECKTIME, CHECKTYPE, VERIFYCODE, SENSORID, WorkCode, UserExtFmt) VALUES (' + data[0]['FIRST_USERID'] + ', NOW(), "I", 1, 1, 0, 8);'
line_log(companyname, "TEST RECORD >", sql)
connection.execute(sql).on('done', function(data) {
line_log(companyname, "TEST RECORD >", "Inserted")
}).on('fail', function(error) {
line_log(companyname, "TEST RECORD >", "Cannot insert test data:", error)
})
}
}).on('fail', function(error) {
line_log(companyname, "TEST RECORD >", "ERROR!!! when query FIRST_USERID:", error, "Please try to run as Administrator")
})
}
*/
/* if (nconf.get('reset')) {
line_log(companyname, "RESET RECORD >", "You enable reset mode. Start to reset all records to be unsend")
var sql = 'UPDATE CHECKINOUT SET UserExtFmt = 0 WHERE UserExtFmt <> 0;'
connection.execute(sql).on('done', function(data) {
line_log(companyname, "RESET RECORD >", "All UserExtFmt field has been updated.")
}).on('fail', function(error) {
line_log(companyname, "RESET RECORD >", "Error when update UserExtFmt:", error)
})
}
*/
} else {
line_log(companyname, "EMPLOYEE SEND >", "statusCode:", response.statusCode)
}
})
}
// var sql = 'SELECT COUNT(USERINFO.USERID) AS TOTAL '
// sql += 'FROM CHECKINOUT '
// sql += 'INNER JOIN USERINFO ON CHECKINOUT.USERID = USERINFO.USERID '
// sql += 'WHERE UserExtFmt <> 9;'
// connection.query(sql).on('done', function(data) {
// line_log(companyname, "CHECKINOUT SEND >", data[0])
// line_log(companyname, "CHECKINOUT SEND >", data[0]['TOTAL'] + " need to send to server. If you are testing then something wrong")
// if (data[0]['TOTAL'] > 200) {
// line_log(companyname, "CHECKINOUT SEND >", "More than 200 records need to send to server you can use SQL to update database directly ")
// // should ask yes/no
// // enable this if you don't want to send old records to server (just want to notify new record)
// // var sql = 'UPDATE CHECKINOUT SET UserExtFmt = 9 WHERE UserExtFmt <> 9;'
// // connection.execute(sql).on('done', function(data) {
// // line_log(companyname, "ADD >", "All UserExtFmt field has been updated.")
// // }).on('fail', function(error) {
// // line_log(companyname, "ADD >", "Error when update UserExtFmt:", error)
// // })
// }
// line_log(companyname, "ADD >", "Still watching", path, "for change.")
// }).on('fail', function(error) {
// line_log(companyname, "ADD >", "Error when getting total record record:", error)
// })
} else {
line_log(companyname, "ERROR>", "No employee in databse !!!", data)
}
}).on('fail', function(error) {
line_log(companyname, "ADD >", "Error when getting total record record:", error)
})
line_log(companyname, "ADD >", "Watching", path, "for change...")
}).on('change', (path, stats) => {
line_log(companyname, "CHANGE >", "!!! Change was found.")
var sql = 'SELECT TOP 1 CHECKINOUT.USERID, USERINFO.NAME, "' + companyname + '" AS COMPANY_NAME'
sql += ', CHECKTIME, UserExtFmt'
sql += ', FORMAT(CHECKTIME, "yyyy-mm-dd hh:mm:ss") AS CHECKTIME_FORMAT_ORIGINAL'
sql += ', IIF (FORMAT(CHECKTIME, "yyyy") > 2500, FORMAT(DATESERIAL(YEAR(CHECKTIME)-543, MONTH(CHECKTIME), DAY(CHECKTIME)), "yyyy-mm-dd"), FORMAT(CHECKTIME, "yyyy-mm-dd")) AS CHECKTIME_DATE'
sql += ', FORMAT(CHECKTIME, "hh:mm:ss") AS CHECKTIME_TIME'
sql += ' FROM CHECKINOUT INNER JOIN USERINFO ON CHECKINOUT.USERID = USERINFO.USERID'
sql += ' WHERE (UserExtFmt <> 9) AND (DateDiff ("d", CHECKTIME, NOW()) <= 35)'
sql += ' ORDER BY IIF (DATEVALUE(CHECKTIME) = DATE(), 0, DateDiff ("s", CHECKTIME, NOW())) ASC, CHECKTIME ASC;'
line_log(companyname, "CHANGE >", "Then query first 1 unsend checkinout record")
line_log(companyname, sql)
connection.query(sql).on('done', function(sign_rows) {
if (Object.keys(sign_rows).length >= 1) {
line_log(companyname, "CHANGE >", "New record was found:", sign_rows[0])
var data = {
table: 'sign'
, where: {
Time: sign_rows[0]['CHECKTIME_DATE'] + ' ' + sign_rows[0]['CHECKTIME_TIME']
}
, row: {
User_ID: sign_rows[0]['USERID']
, Time: sign_rows[0]['CHECKTIME_DATE'] + ' ' + sign_rows[0]['CHECKTIME_TIME']
}
}
request.post({
url: 'https://' + companyname + '.attendanz.co/set-data.php'
, form: data
}, function (error, response, body) {
if (response.statusCode == 200) {
try {
body = JSON.parse(body)
} catch (e) {
line_log(companyname, e)
line_log(companyname, "Returned result body:", body)
}
line_log(companyname, "CHANGE >", "Record has been sent. This is response body:", body)
// line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(body))
// line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(response, null, 2))
// line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(response))
// line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(error, null, 2))
// line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(error))
var sql = 'UPDATE CHECKINOUT SET UserExtFmt = 9 WHERE CHECKTIME = CDate("' + body.CHECKTIME + '") OR CHECKTIME = CDate("' + body.CHECKTIME_THAI + '");'
line_log(companyname, "CHANGE >", "Then mark UserExtFmt field to be 9 = sent: {", sql, "}")
connection.execute(sql).on('done', function(data) {
line_log(companyname, "CHANGE >", "Done (but not sure it is updated or not):", data)
}).on('fail', function(error) {
line_log(companyname, "CHANGE >", "Error when update UserExtFmt:", error)
})
}else{
line_log(companyname, "CHANGE >", "statusCode:", response.statusCode)
}
})
}else{
line_log(companyname, "CHANGE >", "No new record. Keep watching...")
}
}).on('fail', function(error) {
line_log(companyname, "CHANGE >", "Error when query unsend record:", error)
})
})
}else{
line_log(companyname, "CONFIG >", "Please enter company name in argument [Example : node node_modules/attendanz --dbpath \"<XXXXXXXXX>\" --companyname \"<XXXXXXXXX>\"]")
}
break
}
} else {
line_log(companyname, "Cannot find any database file")
}
})