xlsx-reports.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. const _ = require('lodash')
  2. const { init, Retailer, Service, Workday } = require('../database')
  3. const { title } = require('change-case')
  4. const terminals = require('./terminals')
  5. const XLSX = require('xlsx')
  6. const $import = async (locKey, filename) => {
  7. await init()
  8. const locs = await terminals()
  9. const terminal = locs[locKey]
  10. const book = XLSX.readFile(filename)
  11. const sheets = []
  12. for (let sheetName of book.SheetNames) {
  13. let sheet = book.Sheets[sheetName]
  14. const data = XLSX.utils.sheet_to_json(sheet, {
  15. header: 1,
  16. blankrows: false
  17. })
  18. sheets.push(data)
  19. }
  20. const workdays = []
  21. for (let sheet of sheets) {
  22. if (!sheet[0] || !sheet[0][0]) continue
  23. const date = sheet[0][0]
  24. const regularHours = +sheet[5][1]
  25. const overtimeHours = +sheet[5][2]
  26. let foundRetailer = 0
  27. const services = sheet
  28. .filter(row => (row[0] && foundRetailer) || (row[0] === 'Retailer' && foundRetailer++))
  29. .map(([retailer, totalDel, nonDlv, early, late, onTime, pctOnTime, delivered, scanned, notScanned, pctScanned]) => ({
  30. date,
  31. retailer,
  32. delivered: +delivered,
  33. scanned: +scanned
  34. }))
  35. //.filter(row => row.delivered || row.scanned)
  36. workdays.push({
  37. date,
  38. services,
  39. regularHours,
  40. overtimeHours
  41. })
  42. }
  43. const retailerKeys = _.chain(workdays)
  44. .map(x => x.services)
  45. .flatten()
  46. .map(x => x.retailer)
  47. .uniq()
  48. .value()
  49. for (let key of retailerKeys) {
  50. console.log(key)
  51. await Retailer.upsert({
  52. key,
  53. name: title(key)
  54. })
  55. }
  56. const retailerIds = _.chain(await Retailer.findAll())
  57. .map(({key, id}) => [key, id])
  58. .fromPairs()
  59. .value()
  60. console.log(retailerIds)
  61. for (let workday of workdays) {
  62. await Workday.upsert({
  63. terminalId: terminal.id,
  64. date: workday.date,
  65. regularHours: workday.regularHours,
  66. overtimeHours: workday.overtimeHours
  67. })
  68. const wd = await Workday.find({where: {
  69. terminalId: terminal.id,
  70. date: workday.date
  71. }})
  72. for (let service of workday.services) {
  73. if (service.delivered || service.scanned) {
  74. console.log(service)
  75. await Service.upsert({
  76. workdayId: wd.id,
  77. retailerId: retailerIds[service.retailer],
  78. date: workday.date,
  79. delivered: service.delivered,
  80. scanned: service.scanned
  81. })
  82. }
  83. }
  84. }
  85. }
  86. module.exports = {
  87. import: $import
  88. }