First Commit

This commit is contained in:
Yang Li 2025-04-14 16:29:36 -04:00
commit a5190a2448
318 changed files with 63530 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

BIN
app/.DS_Store vendored Normal file

Binary file not shown.

BIN
app/config/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,3 @@
module.exports = {
secret: "worldshine-secret-key"
}

15
app/config/db.config.js Normal file
View File

@ -0,0 +1,15 @@
const devUri = "mongodb://localhost:27017/worldshine";
const localUri = "mongodb+srv://new-user-test:Testing123@cluster0.qkzim.mongodb.net/leapbase?retryWrites=true&w=majority";
module.exports = {
baseUrl: "mongodb://localhost:27017/",
fileUrl: "https://worldshine.mayo.llc/files/",
database: "worldshine",
url: devUri,
// on local enable this
// url: localUri,
// baseUrl: "mongodb+srv://new-user-test:Testing123@cluster0.qkzim.mongodb.net/",
// database: "leapbase",
// fileUrl: "http://localhost:8080/files/",
// imgBucket: "photos",
};

View File

@ -0,0 +1,60 @@
const db = require("../models");
const Employee = db.employee;
const config = require("../config/auth.config");
var jwt = require("jsonwebtoken");
var bcrypt = require("bcryptjs");
const { splitSite } = require("../middlewares");
// Create and Save a new User
exports.login = (req, res) => {
var condition = {};
const emailUsername = req.body.emailUsername;
console.log('emailUsername', emailUsername);
if (emailUsername) {
condition = { $or: [
{ email: emailUsername },
{ username: emailUsername }
]};
condition = splitSite.splitSiteGet(req, condition);
Employee.find(condition)
.then(data => {
if (data && data.length > 0) {
if (data.length === 1 && bcrypt.compareSync(
req.body.password,
data[0].password
) && data[0]?.status === 'active') {
var token = jwt.sign({id: data[0].id}, config.secret, {
expiresIn: 86400 // 24 hours
});
res.send({
accessToken: token,
username: data[0].username,
email: data[0].email,
roles: data[0].roles,
id: data[0].id,
name: data[0].name,
name_cn: data[0].name_cn
} );
} else {
if (data[0].status !== 'active') {
throw(Error('User is not activated'));
} else {
throw(Error('Email or Password Is Invalid'));
}
}
} else {
throw(Error('Email or Password Is Invalid'));
}
})
.catch(err => {
res.status(500).send({
message:
err.message || "Email Or Password Invalid"
});
});
} else {
throw(Error('email or username is required'));
}
}

View File

@ -0,0 +1,119 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const Breakfast = db.breakfast;
// Create a new Breakfast Item
exports.createNewBreakfast = (req, res) => {
// Validate request
if (!req.body.customer_id) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create an Breakfast Item
const breakfast = new Breakfast({
customer_id: req.body.customer_id,
customer_name: req.body.customer_name,
has_breakfast: req.body.has_breakfast,
create_by: req.body.create_by,
create_date: req.body.create_date,
edit_history: req.body.edit_history,
date: req.body.date,
site
});
// Save breakfast Item in the database
breakfast
.save(breakfast)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Breakfast Record."
});
});
};
// Retrive all Breakfast Records from database.
exports.getAllBreakfasts = (req, res) => {
var params = req.query;
var condition = {};
if (params.date) {
condition.date = params.date;
}
condition = splitSite.splitSiteGet(req, condition);
Breakfast.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Breakfasts."
});
});
};
// Get One Event by Id
// exports.getEvent = (req, res) => {
// const id = req.params.id;
// CalendarEvent.findById(id)
// .then(data => {
// if (!data)
// res.status(404).send({ message: "Not found Event with id " + id });
// else res.send(data);
// })
// .catch(err => {
// res
// .status(500)
// .send({ message: "Error retrieving Event with id=" + id });
// });
// };
// Update a Breakfast by the id in the request
exports.updateBreakfast = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
Breakfast.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Breakfast with id=${id}. Maybe Breakfast was not found!`
});
} else res.send({ success: true, message: "Breakfast was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Breakfast with id=" + id
});
});
};
// Delete a Breakfast by id
exports.deleteBreakfast= (req, res) => {
const id = req.params.id;
Breakfast.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Breakfast with id=${id}. Maybe Breakfast was not found!`
});
} else {
res.send({
message: "Breakfast was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Breakfast with id=" + id
});
});
};

View File

@ -0,0 +1,234 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const CalendarEvent = db.calendar_event;
const moment = require("moment-timezone");
// Create a new Event
exports.createCalendarEvent = (req, res) => {
// Validate request
if (!req.body.start_time) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create an Event
const calendarEvent = new CalendarEvent({
title: req.body.title,
type: req.body.type,
description: req.body.description,
department: req.body.department,
notes: req.body.notes,
start_time: req.body.start_time,
stop_time: req.body.stop_time,
source_type: req.body.source_type,
source_uuid: req.body.source_uuid,
source_name: req.body.source_name,
target_type: req.body.target_type,
target_uuid: req.body.target_uuid,
target_name: req.body.target_name,
link_event_uuid: req.body.link_event_uuid,
link_event_name: req.body.link_event_name,
data: req.body.data,
color: req.body.color,
confirmed: req.body.confirmed || false,
files: req.body.files,
status: req.body.status || 'active',
signup_start_date: req.body.signup_start_date,
member_col: req.body.member_col,
new_patient: req.body.new_patient,
tags: req.body.tags,
create_by: req.body.create_by,
create_date: req.body.create_date,
edit_by: req.body.create_by,
edit_date: req.body.create_date,
youtube_video_id: req.body.youtube_video_id,
edit_history: req.body.edit_history,
site
});
// Save event in the database
calendarEvent
.save(calendarEvent)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Calendar Event."
});
});
};
// Retrive all events from database.
exports.getAllEvents = (req, res) => {
var params = req.query;
var condition = {};
if (params.date) {
condition['start_time'] = {
$gte: moment(params.date + ' 00:00:00:000').toDate(),
$lt: moment(params.date + ' 23:59:59.999').toDate()
};
}
if (params.from && params.to) {
condition['start_time'] = {
$gte: moment(params.from + ' 00:00:00.000').toDate(),
$lt: moment(params.to+ ' 23:59:59.999').toDate()
};
}
if (params.start_date && params.end_date) {
// for FullCalendar, if has start_date and end_date, format: YYYY-MM-DD
// FullCalendar gives start_date and end_date, end_date is day+1 of current view
condition['start_time'] = {
$gte: moment(parameter.start_date + 'T00:00:00:00', "America/New_York").toDate()
};
condition['stop_time'] = {
$lt: moment(parameter.end_date + 'T00:00:00:00', "America/New_York").toDate()
};
}
condition = splitSite.splitSiteGet(req, condition);
CalendarEvent.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Events."
});
});
};
exports.getEventsByCustomer = (req, res) => {
var params = req.query;
const name_cn = params.namecn || '';
const name = params.name;
const id = params.id;
if (id && name) {
var ObjectId = require('mongoose').Types.ObjectId;
var objId = new ObjectId(id);
const regex = new RegExp(name_cn, 'i') // i for case insensitive
CalendarEvent.find( { $or:[ { data: {'customer':objId}}, {data: {'customer':id}}, {'target_name': name }, {'target_name': {$regex: regex}} ]}).then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Events for customers."
});
});
} else {
res.send({data: []});
}
};
// Get One Event by Id
exports.getEvent = (req, res) => {
const id = req.params.id;
CalendarEvent.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Event with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Event with id=" + id });
});
};
// Update a Event by the id in the request
exports.updateEvent = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
CalendarEvent.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Event with id=${id}. Maybe Event was not found!`
});
} else res.send({ success: true, message: "Event was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Event with id=" + id
});
});
};
// assign driver to the transportation Event
exports.assignTransportationToEvents = (req, res) => {
var ids = req.body.eventIds || [];
var transportationId = req.body.transportationId;
var transportationName = req.body.transportationName;
// ids.forEach(id => {
// CalendarEvent.findByIdAndUpdate(id, {link_event_uuid: transportationId,
// link_event_name: transportationName}, { useFindAndModify: false })
// .then(data => {
// if (!data) {
// res.status(404).send({
// message: `Cannot update Event with id=${id}. Maybe Event was not found!`
// });
// } else res.send({ success: true, message: "Event was updated successfully." });
// })
// .catch(err => {
// res.status(500).send({
// success: false,
// message: "Error updating Event with id=" + id
// });
// });
// })
Promise.all(ids.map((id) => CalendarEvent.findByIdAndUpdate(id, {link_event_uuid: transportationId,
link_event_name: transportationName}, { useFindAndModify: false }))).then((data) => {
if (data) {
res.send({ success: true, message: "Event was updated successfully." });
}
});
}
// Disable an Event by the id in the request
exports.disableEvent = (req, res) => {
const id = req.params.id;
CalendarEvent.findByIdAndUpdate(id, { ...req.body, status: 'inactive'}, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Event with id=${id}. Maybe Event was not found!`
});
} else res.send({ success: true, message: "Event was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Event with id=" + id
});
});
};
// Delete a Event by id
exports.deleteEvent= (req, res) => {
const id = req.params.id;
CalendarEvent.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Event with id=${id}. Maybe Event was not found!`
});
} else {
res.send({
message: "Event was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Event with id=" + id
});
});
};

View File

@ -0,0 +1,87 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const CenterPhone = db.center_phone;
// Create and Save a new Center Phone
exports.createCenterPhone = (req, res) => {
// Create a Center Phone
const site = splitSite.findSiteNumber(req);
const centerPhone = new CenterPhone({
activated: true,
phone_title: req.body.phone_title || '',
phone_number: req.body.phone_number || '',
site
});
// Save centerPhone in the database
centerPhone
.save(centerPhone)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Center phone."
});
});
};
// Retrieve all Phones from the database.
exports.getAllCenterPhones = (req, res) => {
var params = req.query;
var condition = {};
if (params) {
condition = splitSite.splitSiteGet(req, params);
if (params.activated) {
condition.activated = params.activated;
}
}
CenterPhone.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving phones."
});
});
};
// Get One Phone by Id
exports.getCenterPhone = (req, res) => {
const id = req.params.id;
CenterPhone.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Center Phone with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Center Phone with id=" + id });
});
};
// Update a CenterPhone by the id in the request
exports.updateCenterPhone = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
CenterPhone.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Center Phone with id=${id}. Maybe Center Phone was not found!`
});
} else res.send({ success: true, message: "Center Phone was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error" + (err.message || "") + "updating Center Phone with id=" + id
});
});
};

View File

@ -0,0 +1,132 @@
const db = require("../models");
const Client = db.client;
var bcrypt = require("bcryptjs");
// Create and Save a new Client
exports.createClient = (req, res) => {
// Validate request
if (!req.body.name) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
// Create a Client
const client = new Client({
username: req.body.username || req.body.email || '',
name: req.body.name || '',
name_cn: req.body.name_cn || '',
email: req.body.email || '',
password: req.body.password ? bcrypt.hashSync(req.body.password, 8) : '',
mobile_phone: req.body.mobile_phone || '',
home_phone: req.body.home_phone || '',
phone: req.body.phone || '',
language: req.body.language || '',
status: 'active',
address: req.body.address1 || '',
address1: req.body.address2 || '',
firstname: req.body.firstname || '',
lastname: req.body.lastname || '',
birth_date: req.body.birth_date || null,
create_by: req.body.create_by || '',
create_date: new Date(),
edit_by: req.body.edit_by || '',
edit_date: new Date(),
note: req.body.note || '',
care_provider: req.body.care_provider || '',
emergency_contact: req.body.emergency_contact || '',
medicare_number: req.body.medicare_number || '',
medicaid_number: req.body.medicaid_number || '',
pharmacy: req.body.pharmacy || '',
type: req.body.type || '',
pharmacy_id: req.body.pharmacy_id || '',
pin: req.body.pin || '',
admission_date: req.body.admission_date || null,
seating: req.body.seating || '',
vehicle_no: req.body.vehicle_no || '',
caller: req.body.caller || '',
discharge_date: req.body.discharge_date || null,
placement: req.body.placement || '',
nickname: req.body.nickname || '',
groups: req.body.groups || null,
tags: req.body.tags || null,
roles: req.body.roles || null,
private_note: req.body.private_note || '',
parent_id: '5eee3552b02fac3d4acfd5ea'
});
// Save Client in the database
client
.save(client)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Client."
});
});
};
exports.getClient = (req, res) => {
const id = req.params.id;
Client.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found client with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving client with id=" + id });
});
}
// Update a Client by the id in the request
exports.updateClient = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
if (req.body.password) {
req.body.password = bcrypt.hashSync(req.body.password, 8);
}
Client.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update client with id=${id}. Maybe Client was not found!`
});
} else res.send({ success: true, message: "Client was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Client with id=" + id
});
});
};
// Get Client with username or email
exports.getClientsWithNameOrEmail = (req, res) => {
var params = req.query;
var condition = {};
const nameOrEmail = params?.nameOrEmail;
if (nameOrEmail) {
condition = { $or: [
{ email: nameOrEmail },
{ name: nameOrEmail }
]};
}
Client.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving clients."
});
});
};

View File

@ -0,0 +1,184 @@
const db = require("../models");
const Customer = db.customer;
var bcrypt = require("bcryptjs");
const { splitSite } = require("../middlewares");
// Create and Save a new Customer
exports.createCustomer = (req, res) => {
// Validate request
if (!req.body.name) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create a Customer
const customer = new Customer({
username: req.body.username || req.body.email || '',
name: req.body.name || '',
name_cn: req.body.name_cn || '',
email: req.body.email || '',
password: req.body.password ? bcrypt.hashSync(req.body.password, 8) : '',
mobile_phone: req.body.mobile_phone || '',
home_phone: req.body.home_phone || '',
phone: req.body.phone || '',
language: req.body.language || '',
status: 'active',
address1: req.body.address1 || '',
address2: req.body.address2 || '',
address3: req.body.address3 || '',
address4: req.body.address4 || '',
address5: req.body.address5 || '',
firstname: req.body.firstname || '',
lastname: req.body.lastname || '',
birth_date: req.body.birth_date || null,
create_by: req.body.create_by || '',
create_date: new Date(),
edit_by: req.body.edit_by || '',
edit_date: new Date(),
note: req.body.note || '',
care_provider: req.body.care_provider || '',
emergency_contact: req.body.emergency_contact || '',
medicare_number: req.body.medicare_number || '',
medicaid_number: req.body.medicaid_number || '',
pharmacy: req.body.pharmacy || '',
type: req.body.type || '',
avatar: req.body.avatar || '',
special_needs: req.body.special_needs || '',
pickup_status: req.body.pickup_status || '',
pharmacy_id: req.body.pharmacy_id || '',
pin: req.body.pin || '',
admission_date: req.body.admission_date || null,
seating: req.body.seating || '',
vehicle_no: req.body.vehicle_no || '',
caller: req.body.caller || '',
discharge_date: req.body.discharge_date || null,
placement: req.body.placement || '',
nickname: req.body.nickname || '',
table_id: req.body.table_id || '',
groups: req.body.groups || null,
tags: req.body.tags || null,
roles: req.body.roles || null,
apartment: req.body.apartment || '',
private_note: req.body.private_note || '',
parent_id: '5eee3552b02fac3d4acfd5ea',
site,
disability: req.body.disability || false,
weight: req.body.weight || '',
height: req.body.height || '',
gender: req.body.gender || '',
text_msg_enabled: req.body.text_msg_enabled || false
});
// Save Customer in the database
customer
.save(customer)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Customer."
});
});
};
// Retrieve all Customers from the database.
exports.getAllCustomers = (req, res) => {
var condition = {};
condition = splitSite.splitSiteGet(req, condition);
Customer.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving customers."
});
});
};
// Retrieve all Active Customer from the database.
exports.getAllActiveCustomers = (req, res) => {
var condition = { status: 'active' };
condition = splitSite.splitSiteGet(req, condition);
Customer.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Customers."
});
});
};
// Get One Customer by Id
exports.getCustomer = (req, res) => {
const id = req.params.id;
Customer.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Customer with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Customer with id=" + id });
});
};
// Update a Customer by the id in the request
exports.updateCustomer = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
if (req.body.password) {
req.body.password = bcrypt.hashSync(req.body.password, 8);
}
Customer.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update customer with id=${id}. Maybe Customer was not found!`
});
} else res.send({ success: true, message: "Customer was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Customer with id=" + id
});
});
};
// Soft Delete a Customer with the specified id in the request
exports.deactivateCustomer = (req, res) => {
};
// Delete a Customer by id
exports.deleteCustomer = (req, res) => {
};
// Get Customer with username or email
exports.getCustomersWithNameOrEmail = (req, res) => {
var params = req.query;
var condition = {};
const nameOrEmail = params?.nameOrEmail;
if (nameOrEmail) {
condition = { $or: [
{ email: nameOrEmail },
{ name: nameOrEmail }
]};
}
condition = splitSite.splitSiteGet(req, condition);
Customer.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving customers."
});
});
};

View File

@ -0,0 +1,470 @@
// const axios = require("axios");
// const { splitSite } = require("../middlewares");
// const db = require("../models");
// const DocTemplate = db.doctemplate
// var multer = require('multer');
// var PizZip = require('pizzip');
// var Docxtemplater = require('docxtemplater');
// var fs = require('fs');
// const path = require('path');
// // const docxConverter = require('docx-pdf');
// var libre = require('libreoffice-convert');
// exports.createPDFFromDocTemplateName = (req, res) => {
// console.log('what', __dirname.replace('/controllers', ''));
// var inputData = req.query.inputData;
// var docTemplateName = req.query.docTemplateName;
// // var transportationId = req.body.transportationId;d
// // var transportationName = req.body.transportationName;
// DocTemplate.find({name: docTemplateName}).then((data) => {
// try {
// if (data && data.length > 0) {
// var docTemplate = data[0] || {};
// var templateDoc = `${__dirname.replace('/controllers', '')}${docTemplate?.file[0]?.url}`;
// var outputFileRandom = Math.ceil(Math.random() * 100000000);
// var outputFile = `/tmp/${docTemplate.name}_${outputFileRandom}.docx`;
// var content = fs.readFileSync(templateDoc, 'binary');
// var zip = new PizZip(content);
// var doc = new Docxtemplater(zip, {
// paragraphLoop: true,
// linebreaks: true,
// });
// try {
// // render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
// doc.render(JSON.parse(inputData));
// } catch (error) {
// // The error thrown here contains additional information when logged with JSON.stringify (it contains a properties object containing all suberrors).
// function replaceErrors(key, value) {
// if (value instanceof Error) {
// return Object.getOwnPropertyNames(value).reduce(function(error, key) {
// error[key] = value[key];
// return error;
// }, {});
// }
// return value;
// }
// console.log(JSON.stringify({error: error}, replaceErrors));
// if (error.properties && error.properties.errors instanceof Array) {
// const errorMessages = error.properties.errors.map(function (error) {
// return error.properties.explanation;
// }).join("\n");
// console.log('errorMessages', errorMessages);
// // errorMessages is a humanly readable message looking like this :
// // 'The tag beginning with "foobar" is unopened'
// }
// // callback && callback(error, null, { message:'error in creating doc from template' });
// }
// // save doc to output file
// var buf = doc.getZip().generate({type: 'nodebuffer'});
// // buf is a nodejs buffer, you can either write it to a file or do anything else with it.
// fs.writeFileSync(outputFile, buf);
// var outputFilename = outputFile || {};
// var outputPdfPath = outputFilename.substr(0, outputFilename.length - 5) + '.pdf';
// console.log('outputPDF:', outputPdfPath);
// var extend = 'pdf';
// // Read file
// // var outputFilename = outputFile || {};
// // console.log('filename', `/tmp/${docTemplate.name}_${outputFileRandom}.docx`)
// // docxConverter(path.resolve(`/tmp/${docTemplate.name}_${outputFileRandom}.docx`), path.resolve(`/tmp/${docTemplate.name}_${outputFileRandom}.pdf`), (err, result) => {
// // if (err) console.log(err);
// // else {
// // console.log('res', res);
// // res.download(result, (error) => {
// // console.log('Download PDF error')
// // })
// // }
// // });
// var infile = fs.readFileSync(outputFile);
// // Convert it to pdf format with undefined filter (see Libreoffice doc about filter)
// try {
// libre.convert(infile, extend, undefined, (err, done) => {
// if (err) {
// console.log('Error converting file:', err);
// }
// // Here in done you have pdf file which you can save or transfer in another stream
// fs.writeFileSync(outputPdfPath, done);
// console.log('Conver docx to pdf, Done.');
// res.download(outputPdfPath, function(error) {
// if (error) {
// console.log('Error in sending download file ${outputPdfPath}');
// }
// });
// });
// } catch (e) {
// console.log(e);
// }
// } else {
// res.status(404).send({
// success: false,
// message: "Docs Template doesn't exist"
// })
// }
// } catch(e) {
// console.log(e);
// }
// }).catch(err => {
// res.status(500).send({
// success: false,
// message: "Error Geting docs"
// });
// });
// }
// exports.createDocFromDocTemplateName = (req, res) => {
// console.log('what', __dirname.replace('/controllers', ''));
// // var inputData = req.query.inputData;
// var inputData = req.body.inputData;
// var docTemplateName = req.body.docTemplateName;
// DocTemplate.find({name: docTemplateName}).then((data) => {
// console.log(data);
// try {
// if (data && data.length > 0) {
// var docTemplate = data[0] || {};
// var templateDoc = `${__dirname.replace('/controllers', '')}${docTemplate?.file[0]?.url}`;
// var outputFileRandom = Math.ceil(Math.random() * 100000000);
// var outputFile = `/tmp/${docTemplate.name}_${outputFileRandom}.docx`;
// var content = fs.readFileSync(templateDoc, 'binary');
// var zip = new PizZip(content);
// var doc = new Docxtemplater(zip, {
// paragraphLoop: true,
// linebreaks: true,
// });
// try {
// // render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
// doc.render(JSON.parse(inputData));
// } catch (error) {
// // The error thrown here contains additional information when logged with JSON.stringify (it contains a properties object containing all suberrors).
// function replaceErrors(key, value) {
// if (value instanceof Error) {
// return Object.getOwnPropertyNames(value).reduce(function(error, key) {
// error[key] = value[key];
// return error;
// }, {});
// }
// return value;
// }
// console.log(JSON.stringify({error: error}, replaceErrors));
// if (error.properties && error.properties.errors instanceof Array) {
// const errorMessages = error.properties.errors.map(function (error) {
// return error.properties.explanation;
// }).join("\n");
// console.log('errorMessages', errorMessages);
// // errorMessages is a humanly readable message looking like this :
// // 'The tag beginning with "foobar" is unopened'
// }
// // callback && callback(error, null, { message:'error in creating doc from template' });
// }
// // save doc to output file
// var buf = doc.getZip().generate({type: 'nodebuffer'});
// // buf is a nodejs buffer, you can either write it to a file or do anything else with it.
// fs.writeFileSync(outputFile, buf);
// var outputFilename = outputFile || {};
// res.send(outputFilename, (error) => {
// if (error) {
// console.log('Error in downloading excel')
// }
// });
// console.log('Doc Download Completes')
// } else {
// res.status(404).send({
// success: false,
// message: "Docs Template doesn't exist"
// })
// }
// } catch(e) {
// console.log(e);
// }
// }).catch(err => {
// res.status(500).send({
// success: false,
// message: "Error Geting docs"
// });
// });
// // ids.forEach(id => {
// // CalendarEvent.findByIdAndUpdate(id, {link_event_uuid: transportationId,
// // link_event_name: transportationName}, { useFindAndModify: false })
// // .then(data => {
// // if (!data) {
// // res.status(404).send({
// // message: `Cannot update Event with id=${id}. Maybe Event was not found!`
// // });
// // } else res.send({ success: true, message: "Event was updated successfully." });
// // })
// // .catch(err => {
// // res.status(500).send({
// // success: false,
// // message: "Error updating Event with id=" + id
// // });
// // });
// // })
// }
const axios = require("axios");
const { splitSite } = require("../middlewares");
const db = require("../models");
const DocTemplate = db.doctemplate;
const Event = db.calendar_event;
var multer = require('multer');
var PizZip = require('pizzip');
var Docxtemplater = require('docxtemplater');
var fs = require('fs');
const path = require('path');
// const docxConverter = require('docx-pdf');
var libre = require('libreoffice-convert');
const moment = require("moment-timezone");
exports.createPDFFromDocTemplateName = (req, res) => {
console.log('what', __dirname.replace('/controllers', ''));
var inputData = JSON.parse(req.query.inputData);
var docTemplateName = req.query.docTemplateName;
const eventIds =inputData?.eventIds;
Event.find({ '_id': { $in: eventIds } }).then((events) => {
const docData = {
events: []
};
events.forEach((event) => {
docData.events.push({
event_time: moment(event.start_time).format('hh:mm A MM/DD/YYYY dddd'),
client_name: event.data.client_name || '',
client_status: '会员',
//client_dob: event.data.client_birth_date || '',
//client_pcp: event.data.client_pcp || '',
//client_pharmacy: event.data.client_pharmacy || '',
client_seating: event.data.client_seating || '',
doctor_name: event.data.resource_name || '',
//doctor_phone: event.data.resource_phone || '',
doctor_contact: event.data.resource_contact || '',
doctor_address: event.data.resource_address || '',
//title: event.title || '',
description: event.description || '',
interpreter: event.data.interpreter || '',
//fasting: event.data.fasting || '',
//confirmed: event.data.confirmed,
//new_patient: event.data.new_patient,
//doc_order: event.data.doc_order,
//need_id: event.data.need_id,
//need_med_list: event.data.need_med_list,
reason: event.data.reason || '',
other: event.data.other || ''
});
});
// var transportationId = req.body.transportationId;d
// var transportationName = req.body.transportationName;
DocTemplate.find({name: docTemplateName}).then((data) => {
try {
if (data && data.length > 0) {
var docTemplate = data[0] || {};
var templateDoc = `${__dirname.replace('/controllers', '')}${docTemplate?.file[0]?.url}`;
var outputFileRandom = Math.ceil(Math.random() * 100000000);
var outputFile = `/tmp/${docTemplate.name}_${outputFileRandom}.docx`;
var content = fs.readFileSync(templateDoc, 'binary');
var zip = new PizZip(content);
var doc = new Docxtemplater(zip, {
paragraphLoop: true,
linebreaks: true,
});
try {
// render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
doc.render(docData);
} catch (error) {
// The error thrown here contains additional information when logged with JSON.stringify (it contains a properties object containing all suberrors).
function replaceErrors(key, value) {
if (value instanceof Error) {
return Object.getOwnPropertyNames(value).reduce(function(error, key) {
error[key] = value[key];
return error;
}, {});
}
return value;
}
console.log(JSON.stringify({error: error}, replaceErrors));
if (error.properties && error.properties.errors instanceof Array) {
const errorMessages = error.properties.errors.map(function (error) {
return error.properties.explanation;
}).join("\n");
console.log('errorMessages', errorMessages);
// errorMessages is a humanly readable message looking like this :
// 'The tag beginning with "foobar" is unopened'
}
// callback && callback(error, null, { message:'error in creating doc from template' });
}
// save doc to output file
var buf = doc.getZip().generate({type: 'nodebuffer'});
// buf is a nodejs buffer, you can either write it to a file or do anything else with it.
fs.writeFileSync(outputFile, buf);
var outputFilename = outputFile || {};
var outputPdfPath = outputFilename.substr(0, outputFilename.length - 5) + '.pdf';
console.log('outputPDF:', outputPdfPath);
var extend = 'pdf';
// Read file
// var outputFilename = outputFile || {};
// console.log('filename', `/tmp/${docTemplate.name}_${outputFileRandom}.docx`)
// docxConverter(path.resolve(`/tmp/${docTemplate.name}_${outputFileRandom}.docx`), path.resolve(`/tmp/${docTemplate.name}_${outputFileRandom}.pdf`), (err, result) => {
// if (err) console.log(err);
// else {
// console.log('res', res);
// res.download(result, (error) => {
// console.log('Download PDF error')
// })
// }
// });
var infile = fs.readFileSync(outputFile);
// Convert it to pdf format with undefined filter (see Libreoffice doc about filter)
try {
libre.convert(infile, extend, undefined, (err, done) => {
if (err) {
console.log('Error converting file:', err);
}
// Here in done you have pdf file which you can save or transfer in another stream
fs.writeFileSync(outputPdfPath, done);
console.log('Conver docx to pdf, Done.');
res.download(outputPdfPath, function(error) {
if (error) {
console.log('Error in sending download file ${outputPdfPath}');
}
});
});
} catch (e) {
console.log(e);
}
} else {
res.status(404).send({
success: false,
message: "Docs Template doesn't exist"
})
}
} catch(e) {
console.log(e);
}
}).catch(err => {
res.status(500).send({
success: false,
message: "Error Geting docs"
});
});
})
}
exports.createDocFromDocTemplateName = (req, res) => {
console.log('what', __dirname.replace('/controllers', ''));
var inputData = JSON.parse(req.query.inputData);
const eventIds = inputData?.eventIds;
var docTemplateName = req.query.docTemplateName;
Event.find({ '_id': { $in: eventIds } }).then((events) => {
const docData = {
events: []
};
events.forEach((event) => {
docData.events.push({
event_time: moment(event.start_time).format('hh:mm A MM/DD/YYYY dddd'),
client_name: event.data.client_name || '',
client_status: '会员',
//client_dob: event.data.client_birth_date || '',
//client_pcp: event.data.client_pcp || '',
//client_pharmacy: event.data.client_pharmacy || '',
client_seating: event.data.client_seating || '',
doctor_name: event.data.resource_name || '',
//doctor_phone: event.data.resource_phone || '',
doctor_contact: event.data.resource_contact || '',
doctor_address: event.data.resource_address || '',
//title: event.title || '',
description: event.description || '',
interpreter: event.data.interpreter || '',
//fasting: event.data.fasting || '',
//confirmed: event.data.confirmed,
//new_patient: event.data.new_patient,
//doc_order: event.data.doc_order,
//need_id: event.data.need_id,
//need_med_list: event.data.need_med_list,
reason: event.data.reason || '',
other: event.data.other || ''
});
});
DocTemplate.find({name: docTemplateName}).then((data) => {
try {
if (data && data.length > 0) {
var docTemplate = data[0] || {};
var templateDoc = `${__dirname.replace('/controllers', '')}${docTemplate?.file[0]?.url}`;
var outputFileRandom = Math.ceil(Math.random() * 100000000);
var outputFile = `/tmp/${docTemplate.name}_${outputFileRandom}.docx`;
var content = fs.readFileSync(templateDoc, 'binary');
var zip = new PizZip(content);
var doc = new Docxtemplater(zip, {
paragraphLoop: true,
linebreaks: true,
});
try {
// render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
doc.render(docData);
} catch (error) {
// The error thrown here contains additional information when logged with JSON.stringify (it contains a properties object containing all suberrors).
function replaceErrors(key, value) {
if (value instanceof Error) {
return Object.getOwnPropertyNames(value).reduce(function(error, key) {
error[key] = value[key];
return error;
}, {});
}
return value;
}
console.log(JSON.stringify({error: error}, replaceErrors));
if (error.properties && error.properties.errors instanceof Array) {
const errorMessages = error.properties.errors.map(function (error) {
return error.properties.explanation;
}).join("\n");
console.log('errorMessages', errorMessages);
// errorMessages is a humanly readable message looking like this :
// 'The tag beginning with "foobar" is unopened'
}
// callback && callback(error, null, { message:'error in creating doc from template' });
}
// save doc to output file
var buf = doc.getZip().generate({type: 'nodebuffer'});
// buf is a nodejs buffer, you can either write it to a file or do anything else with it.
fs.writeFileSync(outputFile, buf);
var outputFilename = outputFile || {};
res.download(outputFilename, (error) => {
if (error) {
console.log('Error in downloading excel')
}
});
console.log('Doc Download Completes')
} else {
res.status(404).send({
success: false,
message: "Docs Template doesn't exist"
})
}
} catch(e) {
console.log(e);
}
}).catch(err => {
res.status(500).send({
success: false,
message: "Error Geting docs"
});
});
});
}

View File

@ -0,0 +1,152 @@
const db = require("../models");
const Employee = db.employee;
var bcrypt = require("bcryptjs");
const { splitSite } = require("../middlewares");
// Create and Save a new Employee (driver, distributor, admin)
exports.createEmployee = (req, res) => {
// Validate request
if (!req.body.username) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create a Employee
const employee = new Employee({
username: req.body.username || req.body.email || '',
name: req.body.name || '',
name_cn: req.body.name_cn || '',
email: req.body.email || '',
password: req.body.password ? bcrypt.hashSync(req.body.password, 8) : '',
roles: req.body.roles || [],
mobile_phone: req.body.mobile_phone || '',
phone: req.body.phone || '',
home_phone: req.body.home_phone || '',
language: req.body.language || '',
employment_status: req.body.employment_status || '',
status: req.body.status || 'active',
address: req.body.address || '',
title: req.body.title || '',
title_cn: req.body.title_cn || '',
firstname: req.body.firstname || '',
lastname: req.body.lastname || '',
department: req.body.department || '',
birth_date: req.body.birth_date || null,
driver_capacity: req.body.driver_capacity || null,
date_hired: req.body.date_hired || null,
create_by: req.body.create_by || '',
create_date: new Date(),
edit_by: req.body.edit_by || '',
edit_date: new Date(),
note: req.body.note || '',
tags: req.body.tags || [],
fetch_route_time: req.body.fetch_route_time || null,
site
});
// Save Employee in the database
employee
.save(employee)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Employee."
});
});
};
// Retrieve all Employee from the database.
exports.getAllEmployees = (req, res) => {
var params = req.query;
var condition = {};
condition = splitSite.splitSiteGet(req, condition);
if (params.status) {
condition.status = params.status;
}
if (params.role) {
condition.roles = params.role;
}
Employee.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving employees."
});
});
};
// Retrieve all Active Employee from the database.
exports.getAllActiveEmployees = (req, res) => {
var params = req.query;
var condition = { status: 'active' };
condition = splitSite.splitSiteGet(req, condition);
if (params.roles) {
condition.roles = params.roles;
}
Employee.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving employees."
});
});
};
// Get One Employee by Id
exports.getEmployee = (req, res) => {
const id = req.params.id;
Employee.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Employee with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Employee with id=" + id });
});
};
// Update a Employee by the id in the request
exports.updateEmployee = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
if (req.body.password) {
req.body.password = bcrypt.hashSync(req.body.password, 8);
}
Employee.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update employee with id=${id}. Maybe Employee was not found!`
});
} else res.send({ success: true, message: "Employee was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Employee with id=" + id
});
});
};
// Soft Delete a Employee with the specified id in the request
exports.deactivateEmployee = (req, res) => {
};
// Delete a Employee by id
exports.deleteEmployee = (req, res) => {
};
// Get Employees with username or email
exports.getEmployeesWithUsernameOrEmail = (req, res) => {
};

View File

@ -0,0 +1,109 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const EventRequest = db.event_request;
// Create a new Event Request Item
exports.createEventRequest = (req, res) => {
// Validate request
if (!req.body.customer_id) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create an eventRequest Item
const eventRequest = new EventRequest({
customer_id: req.body.customer_id,
customer_display: req.body.customer_display,
upload: req.body.upload,
resource: req.body.resource,
resource_display: req.body.resource_display,
source: req.body.source,
type: req.body.type,
status: req.body.status || 'active',
symptom: req.body.symptom,
transportation: req.body.transportation,
np: req.body.np,
notes: req.body.notes || [],
create_by: req.body.create_by,
create_date: req.body.create_date,
edit_history: req.body.edit_history,
site
});
// Save eventRequest Item in the database
eventRequest
.save(eventRequest)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the event request Record."
});
});
};
// Retrive all eventRequest Records from database.
exports.getAllEventRequests = (req, res) => {
var params = req.query;
var condition = {};
condition = splitSite.splitSiteGet(req, condition);
EventRequest.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Event Requests."
});
});
};
// Update an Event Request Item by the id in the request
exports.updateRequestItem = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
EventRequest.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Event Request with id=${id}. Maybe Event Request was not found!`
});
} else res.send({ success: true, message: "Event Request was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Event Request with id=" + id
});
});
};
// Delete an Event Request by id
exports.deleteEventRequest = (req, res) => {
const id = req.params.id;
EventRequest.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Event Request with id=${id}. Maybe Event Request was not found!`
});
} else {
res.send({
message: "Event Request was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Event Request with id=" + id
});
});
};

View File

@ -0,0 +1,119 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const Lunch = db.lunch;
// Create a new Lunch Item
exports.createNewLunch = (req, res) => {
// Validate request
if (!req.body.customer_id) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create an Lunch Item
const lunch = new Lunch({
customer_id: req.body.customer_id,
customer_name: req.body.customer_name,
has_lunch: req.body.has_lunch,
create_by: req.body.create_by,
create_date: req.body.create_date,
edit_history: req.body.edit_history,
date: req.body.date,
site
});
// Save lunch Item in the database
lunch
.save(lunch)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Lunch Record."
});
});
};
// Retrive all Lunch Records from database.
exports.getAllLunches = (req, res) => {
var params = req.query;
var condition = {};
if (params.date) {
condition.date = params.date;
}
condition = splitSite.splitSiteGet(req, condition);
Lunch.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Lunches."
});
});
};
// Get One Event by Id
// exports.getEvent = (req, res) => {
// const id = req.params.id;
// CalendarEvent.findById(id)
// .then(data => {
// if (!data)
// res.status(404).send({ message: "Not found Event with id " + id });
// else res.send(data);
// })
// .catch(err => {
// res
// .status(500)
// .send({ message: "Error retrieving Event with id=" + id });
// });
// };
// Update a Lunch by the id in the request
exports.updateLunch = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
Lunch.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Lunch with id=${id}. Maybe Lunch was not found!`
});
} else res.send({ success: true, message: "Lunch was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Lunch with id=" + id
});
});
};
// Delete a Lunch by id
exports.deleteLunch= (req, res) => {
const id = req.params.id;
Lunch.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Lunch with id=${id}. Maybe Lunch was not found!`
});
} else {
res.send({
message: "Lunch was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Lunch with id=" + id
});
});
};

View File

@ -0,0 +1,63 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const MessageToken = db.message_token;
exports.createMessageToken = (req, res) => {
const site = splitSite.findSiteNumber(req);
// Create a MessageToken
const messageToken = new MessageToken({
message_token: req.body.message_token || '',
site
});
// Save MessageToken in the database
messageToken
.save(messageToken)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Message Token."
});
});
};
// Retrieve all MessageTokens from the database.
exports.getAllMessageTokens = (req, res) => {
var condition = {};
MessageToken.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving messageTokens."
});
});
};
// Update a MessageTOken by the id in the request
exports.updateMessageToken = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
MessageToken.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update MessageToken with id=${id}. Maybe MessageToken was not found!`
});
} else res.send({ success: true, message: "MessageToken was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating MessageToken with id=" + id
});
});
};

View File

@ -0,0 +1,191 @@
const axios = require("axios");
const { splitSite } = require("../middlewares");
const db = require("../models");
const Message = db.message;
const MessageToken = db.message_token;
const SentMessage = db.sent_message;
exports.createMessage = (req, res) => {
// Validate request
if (!req.body.message_group) {
res.status(400).send({ message: "Message Group can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create a Message
const message = new Message({
message_group: req.body.message_group || 0,
message_name: req.body.message_name || '',
message_title: req.body.message_title || '',
message_body: req.body.message_body || '',
language: req.body.language || '',
site
});
// Save Message in the database
message
.save(message)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Message."
});
});
};
// Retrieve all Messages from the database.
exports.getAllMessages = (req, res) => {
var condition = {};
Message.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving messages."
});
});
};
// Retrieve messages By group and language
exports.getMessagesByGroupAndLanguage= (req, res) => {
const params = req.query;
const message_group = params?.message_group;
const language = params?.language;
var condition = { message_group, language };
Message.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Messages with Date and Type."
});
});
};
// Get One Message by Id
exports.getMessage = (req, res) => {
const id = req.params.id;
Message.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Message with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Message with id=" + id });
});
};
// Update a Message by the id in the request
exports.updateMessage = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
Message.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Message with id=${id}. Maybe Message was not found!`
});
} else res.send({ success: true, message: "Message was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Message with id=" + id
});
});
};
// exports.sendMessage = async (req, res) => {
// console.log(req.body);
// if (!req.body) {
// return res.status(400).send({
// message: "Data to update can not be empty!"
// });
// }
// const authToken = await MessageToken.find({});
// if (authToken && authToken.length > 0) {
// const token = authToken[0]?.message_token;
// console.log('token', token);
// await axios.post('https://api-app2.simpletexting.com/v2/api/messages', req.body, {
// headers: {
// "Authorization": `Bearer ${token}`,
// "Content-Type": "application/json",
// },
// }).then(() => {
// res.send({success: true, message: "Message Sent Correctly"})
// }).catch(err => console.log(err));
// }
// }
// Retrieve all Sent Messages from the database.
exports.getAllSentMessages = (req, res) => {
var condition = {};
condition = splitSite.splitSiteGet(req, condition);
SentMessage.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving sent messages."
});
});
};
exports.sendMessage = async (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const messages = req.body.messages;
for(const message of messages) {
try {
await axios.post('https://rest.textmagic.com/api/v2/messages', {
text: message?.text,
phones: message?.contactPhone
}, {
headers: {
"X-TM-Username": "oauthyhma",
"X-TM-Key": "Rin866o0cMMAJXkCiIyYd2pw9HSeGo"
}
})
const site = splitSite.findSiteNumber(req);
const sentMessage = new SentMessage({
from_type: 'center',
from: message.from || 'center',
to_type: 'client',
to: message.contactPhone || '',
department: message.department || '',
content: message.text || '',
status: 'active',
create_by: 'admin',
create_date: new Date(),
site
});
await sentMessage.save(sentMessage);
await sleep(200);
} catch (err) {
console.log(err);
}
}
res.send({success: true, message: "Message Sent Correctly"});
}

View File

@ -0,0 +1,118 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const Report = db.report;
exports.createReport = (req, res) => {
// Validate request
if (!req.body.data) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create a Report
const report = new Report({
date: req.body.date || '',
type: req.body.type || '',
route_id: req.body.route_id || '',
driver_name: req.body.driver_name || '',
route_name: req.body.route_name || '',
data: req.body.data || [],
head: req.body.head || [],
chinese_head: req.body.chinese_head || [],
checklist_result: req.body.checklist_result || [],
vehicle_number: req.body.vehicle_number || null,
site
});
// Save Report in the database
report
.save(report)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Report."
});
});
};
// Retrieve all Reports from the database.
exports.getAllReports = (req, res) => {
var condition = {};
condition = splitSite.splitSiteGet(req, condition);
Report.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving reports."
});
});
};
// Retrieve all Active Reports By Date and Type (Admin Reports).
exports.getReportsByDateAndType = (req, res) => {
const params = req.query;
const date = params?.date;
const type = params?.type;
var condition = { date, type };
condition = splitSite.splitSiteGet(req, condition);
Report.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Reports with Date and Type."
});
});
};
// Retrieve reports By RouteId and Type (Senior Route report)
exports.getReportsByRouteIdAndType = (req, res) => {
const params = req.query;
const route_id = params?.route_id;
const type = params?.type;
var condition = { route_id, type };
condition = splitSite.splitSiteGet(req, condition);
Report.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Reports with Date and Type."
});
});
};
// Get One Report by Id
exports.getReport = (req, res) => {
};
// Update a Report by the id in the request
exports.updateReport = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
Report.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Report with id=${id}. Maybe Report was not found!`
});
} else res.send({ success: true, message: "Report was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Report with id=" + id
});
});
};

View File

@ -0,0 +1,152 @@
const db = require("../models");
const Resource = db.resource;
const { splitSite } = require("../middlewares");
// Create and Save a new Resource
exports.createResource = (req, res) => {
// Validate request
if (!req.body.name) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
const resource = new Resource({
name: req.body.name,
name_original: req.body.name_original,
name_branch: req.body.name_branch,
specialty: req.body.specialty,
type: req.body.type, // value may be ['doctor', 'pharmacy' or 'other']
color: req.body.color,
address: req.body.address,
city: req.body.city,
state: req.body.state,
zipcode: req.body.zipcode,
phone: req.body.phone,
status: req.body.status || 'active', // value might be ['active', 'inactive']
create_by: req.body.create_by,
create_date: req.body.create_date || new Date(),
parent_id: req.body.parent_id,
ext_id: req.body.ext_id,
category: req.body.category,
description: req.body.description,
contact: req.body.contact,
fax: req.body.fax,
note: req.body.note,
data: req.body.data,
edit_by: req.body.edit_by,
edit_date: req.body.edit_date || new Date(),
images: req.body.images,
edit_history: req.body.edit_history,
site
});
// Save Resource in the database
resource
.save(resource)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Resource"
});
});
};
// Retrieve all Resources from the database.
exports.getAllResources = (req, res) => {
var params = req.query;
var condition = {};
if (params) {
if (params.type) {
condition.type = params.type;
}
}
Resource.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving resources."
});
});
};
// Get One Resource by Id
exports.getResource = (req, res) => {
const id = req.params.id;
Resource.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Resource with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Resource with id=" + id });
});
};
// Update a Resource by the id in the request
exports.updateResource = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
Resource.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Resource with id=${id}. Maybe Resource was not found!`
});
} else res.send({ success: true, message: "Resource was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Resource with id=" + id
});
});
};
// Disable an Resource by the id in the request
exports.disableResource = (req, res) => {
const id = req.params.id;
Resource.findByIdAndUpdate(id, { ...req.body, status: 'inactive'}, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Resource with id=${id}. Maybe Resource was not found!`
});
} else res.send({ success: true, message: "Resource was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Resource with id=" + id
});
});
};
// Delete a Resource by id
exports.deleteResource= (req, res) => {
const id = req.params.id;
Resource.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Resource with id=${id}. Maybe Resource was not found!`
});
} else {
res.send({
message: "Resource was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Resource with id=" + id
});
});
};

View File

@ -0,0 +1,99 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const RoutePathTemplate = db.route_path_template;
exports.createRoutePathTemplate = (req, res) => {
// Validate request
if (!req.body.name) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create a Route Template
const routePathTemplate = new RoutePathTemplate({
name: req.body.name,
vehicle: req.body.vehicle,
driver: req.body.driver,
type: req.body.type,
route_customer_list: req.body.route_customer_list || [],
status: req.body.status || 'active',
site
});
// Save Route Template in the database
routePathTemplate
.save(routePathTemplate)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Route Template."
});
});
};
// Retrieve all Routes Templates from the database.
exports.getAllRoutesTemplates = (req, res) => {
var condition = {};
condition = splitSite.splitSiteGet(req, condition);
RoutePathTemplate.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Routes."
});
});
};
// Get One Route Template by Id
exports.getRouteTemplate = (req, res) => {
};
// Update a Route Template by the id in the request
exports.updateRouteTemplate = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
RoutePathTemplate.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Route Template with id=${id}. Maybe Route Template was not found!`
});
} else res.send({ success: true, message: "Route Template was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Route Template with id=" + id
});
});
};
// Delete a Route Template by id
exports.deleteRouteTemplate= (req, res) => {
const id = req.params.id;
RoutePathTemplate.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Route Template with id=${id}. Maybe Route Template was not found!`
});
} else {
res.send({
message: "Route Template was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Route Template with id=" + id
});
});
};

View File

@ -0,0 +1,249 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const RoutePath = db.route_path;
const CenterPhone = db.center_phone;
const Employee = db.employee;
exports.createRoutePath = (req, res) => {
// Validate request
if (!req.body.name) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create a Route
const routePath = new RoutePath({
name: req.body.name,
schedule_date: req.body.schedule_date,
vehicle: req.body.vehicle,
status: req.body.status,
driver: req.body.driver,
type: req.body.type,
start_mileage: req.body.start_mileage,
end_mileage: req.body.end_mileage,
start_time: req.body.start_time || null,
end_time: req.body.end_time || null,
estimated_start_time: req.body.estimated_start_time || null,
route_customer_list: req.body.route_customer_list || [],
checklist_result: req.body.checklist_result || [],
site
});
// Save Route in the database
routePath
.save(routePath)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Route."
});
});
};
// Retrieve all Routes from the database.
exports.getAllRoutes = (req, res) => {
var params = req.query;
var condition = {};
if (params) {
if (params.scheduleDate) {
condition.schedule_date = params.scheduleDate;
}
if (params.driverId) {
condition.driver = params.driverId;
}
}
condition.status = { "$ne": 'disabled' };
condition = splitSite.splitSiteGet(req, condition);
RoutePath.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Routes."
});
});
};
// Retrieve all Routes with phones from the database.
exports.getAllRoutesWithPhones = (req, res) => {
var params = req.query;
var condition = {};
var condition2 = {};
if (params) {
if (params.scheduleDate) {
condition.schedule_date = params.scheduleDate;
}
if (params.driverId) {
condition.driver = params.driverId;
}
if (params.activated) {
condition2.activated = params.activated
}
}
condition.status = { "$ne": 'disabled' };
condition = splitSite.splitSiteGet(req, condition);
condition2 = splitSite.splitSiteGet(req, condition2);
Promise.all(
[RoutePath.find(condition), CenterPhone.find(condition2)]
).then(([transRoutes, phones]) => res.send({
transRoutes: transRoutes,
centerPhones: phones
})).catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Routes or phones."
});
});
};
// Get One Route by Id
exports.getRoute = (req, res) => {
const id = req.params.id;
RoutePath.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Route with id " + id });
else {
// console.log('where is driver', data?.driver);
// Employee.findByIdAndUpdate(driver, {fetch_route_time: new Date()}).then((rst) => {
// console.log('updated result',rst);
// }).catch((err) => {
// console.log(`employee ${driver} update failure`)
// })
res.send(data);
}
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Route with id=" + id });
});
};
// Update a Route by the id in the request
exports.updateRoute = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
RoutePath.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Route with id=${id}. Maybe Route was not found!`
});
} else res.send({ success: true, message: "Route was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Route with id=" + id
});
});
};
// update route from mobile without deleting customers
exports.updateRouteInProgress = (req, res) => {
if (!req.body) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const routeBody = req.body;
RoutePath.findById(routeBody.id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Route with id " + id });
else {
const currentRoute = data;
const currentCustomerList = currentRoute.route_customer_list;
const customerListSent = routeBody.route_customer_list;
const finalCustomerList = [...customerListSent];
for (const cust of currentCustomerList) {
if (!customerListSent.find((c) => c.id === cust.id )) {
finalCustomerList.push(cust);
}
}
const finalBody = Object.assign({}, routeBody, {route_customer_list: finalCustomerList})
RoutePath.findByIdAndUpdate(currentRoute.id, finalBody, { useFindAndModify: false })
.then(data => {
// console.log('success', data.id);
// const driver = currentRoute?.driver;
// if (driver) {
// Employee.findById(driver).then((data) => {
// const employeeObj = data;
// // console.log('driverOjb', employeeObj)
// if (employeeObj) {
// const update_route_history = employeeObj?.update_route_history;
// const newHistoryItem = {
// route_id: currentRoute?.id,
// route_name: currentRoute?.name,
// route_schedule_date: currentRoute?.schedule_date,
// route_update_time: new Date()
// };
// let result = [];
// if (update_route_history?.length >= 20) {
// for (let i=1; i < update_route_history.length; i++) {
// result.push(update_route_history[i]);
// }
// result.push(newHistoryItem);
// } else {
// update_route_history.push(newHistoryItem);
// result = update_route_history;
// }
// // console.log('final', result);
// Employee.findByIdAndUpdate(driver, Object.assign({}, employeeObj, {update_route_history: result})).then((rst) => {
// console.log('updated result',rst);
// }).catch((err) => {
// console.log(`employee ${driver} update failure`)
// })
// }
// })
// }
if (!data) {
res.status(404).send({
message: `Cannot update Route with id=${id}. Maybe Route was not found!`
});
} else res.send({ success: true, message: "Route was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Route with id=" + id
});
});
// res.send({ success: true, message: "Route was found successfully." });
}
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Route with id=" + id });
});
}
// Delete a Route by id
exports.deleteRoute= (req, res) => {
const id = req.params.id;
RoutePath.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Route with id=${id}. Maybe Route was not found!`
});
} else {
res.send({
message: "Route was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Route with id=" + id
});
});
};

View File

@ -0,0 +1,126 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const SignatureRequest = db.signature_request;
// Create a new Signature Request
exports.createNewSignatureRequest = (req, res) => {
// Validate request
if (!req.body.route_id) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create an Signature Request
const signatureRequest = new SignatureRequest({
driver_id: req.body.driver_id,
driver_name: req.body.driver_name,
route_id: req.body.route_id,
route_date: req.body.route_date,
route_name: req.body.route_name,
status: req.body.status || 'active',
create_by: req.body.create_by,
create_date: req.body.create_date,
site
});
// Save Signature Request in the database
signatureRequest
.save(signatureRequest)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Signature Request Record."
});
});
};
// Retrive all SignatureRequest from database.
exports.getAllSignatureRequests = (req, res) => {
var params = req.query;
var condition = {};
if (params.route_date) {
condition.route_date = params.route_date;
}
if (params.route_id) {
condition.route_id = params.route_id;
}
if (params.driver_id) {
condition.driver_id = params.driver_id;
}
condition = splitSite.splitSiteGet(req, condition);
SignatureRequest.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Signature Requests."
});
});
};
// Get One Signature Request by Id
exports.getSignatureRequest = (req, res) => {
const id = req.params.id;
SignatureRequest.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Signature Request with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Signature Request with id=" + id });
});
};
// Update a Signature Request by the id in the request
exports.updateSignatureRequest = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
SignatureRequest.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Signature Request with id=${id}. Maybe Signature Request was not found!`
});
} else res.send({ success: true, message: "Signature Request was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Signature Request with id=" + id
});
});
};
// Delete a Signature Request by id
exports.deleteSignatureRequest= (req, res) => {
const id = req.params.id;
SignatureRequest.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Signature Request with id=${id}. Maybe Signature Request was not found!`
});
} else {
res.send({
message: "Signature Request was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Signature Request with id=" + id
});
});
};

View File

@ -0,0 +1,119 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const Snack = db.snack;
// Create a new Snack Item
exports.createNewSnack = (req, res) => {
// Validate request
if (!req.body.customer_id) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create an Snack Item
const snack = new Snack({
customer_id: req.body.customer_id,
customer_name: req.body.customer_name,
has_snack: req.body.has_snack,
create_by: req.body.create_by,
create_date: req.body.create_date,
edit_history: req.body.edit_history,
date: req.body.date,
site
});
// Save snack Item in the database
snack
.save(snack)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Snack Record."
});
});
};
// Retrive all Snack Records from database.
exports.getAllSnacks = (req, res) => {
var params = req.query;
var condition = {};
if (params.date) {
condition.date = params.date;
}
condition = splitSite.splitSiteGet(req, condition);
Snack.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Snacks."
});
});
};
// Get One Event by Id
// exports.getEvent = (req, res) => {
// const id = req.params.id;
// CalendarEvent.findById(id)
// .then(data => {
// if (!data)
// res.status(404).send({ message: "Not found Event with id " + id });
// else res.send(data);
// })
// .catch(err => {
// res
// .status(500)
// .send({ message: "Error retrieving Event with id=" + id });
// });
// };
// Update a Snack by the id in the request
exports.updateSnack = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
Snack.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Snack with id=${id}. Maybe Snack was not found!`
});
} else res.send({ success: true, message: "Snack was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Snack with id=" + id
});
});
};
// Delete a Snack by id
exports.deleteSnack= (req, res) => {
const id = req.params.id;
Snack.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Snack with id=${id}. Maybe Snack was not found!`
});
} else {
res.send({
message: "Snack was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Snack with id=" + id
});
});
};

View File

@ -0,0 +1,114 @@
const db = require("../models");
const Staff = db.staff;
var bcrypt = require("bcryptjs");
const { splitSite } = require("../middlewares");
// Create and Save a new Staff (driver, distributor, admin)
exports.createStaff = (req, res) => {
// Validate request
if (!req.body.username) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create a Staff
const staff = new Staff({
username: req.body.username || req.body.email || '',
name: req.body.name || '',
name_cn: req.body.name_cn || '',
email: req.body.email || '',
password: req.body.password ? bcrypt.hashSync(req.body.password, 8) : '',
roles: req.body.roles || [],
mobile_phone: req.body.mobile_phone || '',
phone: req.body.phone || '',
home_phone: req.body.home_phone || '',
language: req.body.language || '',
employment_status: req.body.employment_status || '',
status: req.body.status || 'active',
title: req.body.title || '',
title_cn: req.body.title_cn || '',
firstname: req.body.firstname || '',
lastname: req.body.lastname || '',
department: req.body.department || '',
birth_date: req.body.birth_date || null,
driver_capacity: req.body.driver_capacity || null,
date_hired: req.body.date_hired || null,
create_by: req.body.create_by || '',
create_date: new Date(),
edit_by: req.body.edit_by || '',
edit_date: new Date(),
salt: req.body.salt || '264897',
city: req.body.city || '',
state: req.body.state || '',
zipcode: req.body.zipcode || '',
group: req.body.group || [],
tags: req.body.tags || [],
parent_id: req.body.parent_id || '5eee3552b02fac3d4acfd5ea',
site
});
// Save Staff in the database
staff
.save(staff)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Staff."
});
});
};
// Update a Staff by the id in the request
exports.updateStaff = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
if (req.body.password) {
req.body.password = bcrypt.hashSync(req.body.password, 8);
}
Staff.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update staff with id=${id}. Maybe staff was not found!`
});
} else res.send({ success: true, message: "Staff was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error updating Staff with id=" + id
});
});
};
// Get Staff with username or email
exports.getStaffsWithNameOrEmail = (req, res) => {
var params = req.query;
var condition = {};
const nameOrEmail = params?.nameOrEmail;
if (nameOrEmail) {
condition = { $or: [
{ email: nameOrEmail },
{ name: nameOrEmail }
]};
}
condition = splitSite.splitSiteGet(req, condition);
Staff.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving staffs."
});
});
};

View File

@ -0,0 +1,25 @@
const axios = require("axios");
const { splitSite } = require("../middlewares");
const db = require("../models");
const Timedata = db.timedata;
var moment = require('moment-timezone');
exports.getDocsByCondition1 = (req, res) => {
const params = req.query;
const date = params.date;
const condition = {};
condition['time'] = {
//$gte: moment(parameter.date + 'T00:00:00.00').toDate()
$gte: moment.tz(date + 'T00:00:00.00', "America/New_York").toDate()
};
Timedata.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving time data."
});
});
}

View File

@ -0,0 +1,70 @@
const upload = require("../middlewares/upload");
const dbConfig = require("../config/db.config");
const MongoClient = require("mongodb").MongoClient;
const GridFSBucket = require("mongodb").GridFSBucket;
const url = dbConfig.url;
const baseUrl = dbConfig.fileUrl;
const mongoClient = new MongoClient(url);
const uploadFiles = async (req, res) => {
try {
await upload(req, res);
if (req.file == undefined) {
return res.send({
message: "You must select a file.",
});
}
return res.send({
message: "File has been uploaded.",
});
} catch (error) {
console.log(error);
return res.send({
message: "Error when trying upload image: ${error}",
});
}
};
const getFile = async (req, res) => {
try {
await mongoClient.connect();
const database = mongoClient.db(dbConfig.database);
const images = database.collection(dbConfig.imgBucket + ".files");
const chunks = database.collection(dbConfig.imgBucket + ".chunks");
const cursor = await (images.find({filename: req.params.name}).toArray());
if (cursor.length === 0) {
return res.status(500).send({
message: "No files found!",
});
}
const chunkCursor = await(chunks.find({files_id: cursor[cursor.length-1]._id}).toArray());
return res.status(200).send(chunkCursor[0].data);
} catch (error) {
return res.status(500).send({
message: error.message,
});
}
};
const deleteFile = async (req, res) => {
try {
await mongoClient.connect();
const database = mongoClient.db(dbConfig.database);
const images = database.collection(dbConfig.imgBucket + ".files");
const chunks = database.collection(dbConfig.imgBucket + ".chunks");
const cursor = await (images.find({filename: req.body.name}).toArray());
if (cursor.length > 0) {
await chunks.deleteMany({files_id: cursor[cursor.length-1]._id});
await images.deleteMany({filename: req.body.name});
}
return res.status(200).send({ message: 'Delete Image Succeed'});
} catch (error) {
return res.status(500).send({
message: error.message,
});
}
};
module.exports = {
uploadFiles,
getFile,
deleteFile
};

View File

@ -0,0 +1,30 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const User = db.user;
// Create and Save a new User
exports.createUser = (req, res) => {
};
// Retrieve all Users from the database.
exports.getAllUsers = (req, res) => {
var condition = {};
condition = splitSite.splitSiteGet(req, condition);
User.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving users."
});
});
};
// Update a User by the id in the request
exports.updateUser = (req, res) => {
};
// Delete a User with the specified id in the request
exports.delete = (req, res) => {
};

View File

@ -0,0 +1,133 @@
const { splitSite } = require("../middlewares");
const db = require("../models");
const Vehicle = db.vehicle;
exports.createVehicle = (req, res) => {
// Validate request
if (!req.body.tag) {
res.status(400).send({ message: "Content can not be empty!" });
return;
}
const site = splitSite.findSiteNumber(req);
// Create a Vehicle
const vehicle = new Vehicle({
vehicle_number: req.body.vehicle_number,
tag: req.body.tag || '',
ezpass: req.body.ezpass || '',
gps_tag: req.body.gps_tag || '',
mileage: req.body.mileage || 0,
capacity: req.body.capacity || 0,
make: req.body.make || '',
vehicle_model: req.body.vehicle_model || '',
year: req.body.year || '',
checklist: req.body.checklist || '',
status: 'active',
site
});
// Save Vehicle in the database
vehicle
.save(vehicle)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Vehicle."
});
});
};
// Retrieve all Vehicles from the database.
exports.getAllVehicles = (req, res) => {
var condition = {};
condition = splitSite.splitSiteGet(req, condition);
Vehicle.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Vehicles."
});
});
};
// Retrieve all Active Vehicles from the database.
exports.getAllActiveVehicles = (req, res) => {
var condition = { status: 'active' };
condition = splitSite.splitSiteGet(req, condition);
Vehicle.find(condition)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Vehicles."
});
});
};
// Get One Vehicle by Id
exports.getVehicle = (req, res) => {
const id = req.params.id;
Vehicle.findById(id)
.then(data => {
if (!data)
res.status(404).send({ message: "Not found Vehicle with id " + id });
else res.send(data);
})
.catch(err => {
res
.status(500)
.send({ message: "Error retrieving Vehicle with id=" + id });
});
};
// Update a Vehicle by the id in the request
exports.updateVehicle = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const id = req.params.id;
Vehicle.findByIdAndUpdate(id, req.body, { useFindAndModify: false })
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update Vehicle with id=${id}. Maybe Vehicle was not found!`
});
} else res.send({ success: true, message: "Vehicle was updated successfully." });
})
.catch(err => {
res.status(500).send({
success: false,
message: "Error" + (err.message || "") + "updating Vehicle with id=" + id
});
});
};
// Soft Delete a Vehicle
exports.deactivateVehicle = (req, res) => {
};
// Delete a Vehicle by id
exports.deleteVehicle= (req, res) => {
const id = req.params.id;
Vehicle.findByIdAndRemove(id)
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot delete Vehicle with id=${id}. Maybe Vehicle was not found!`
});
} else {
res.send({
message: "Vehicle was deleted successfully!"
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Vehicle with id=" + id + ": " + err.message || ""
});
});
};

View File

@ -0,0 +1,413 @@
// const axios = require("axios");
// const { splitSite } = require("../middlewares");
// const db = require("../models");
// const ExcelTemplate = db.exceltemplate;
// var XlsxTemplate = require('xlsx-template');
// var fs = require('fs');
// var multer = require('multer');
// const path = require('path');
// var libre = require('libreoffice-convert');
// exports.createPDFFromSheetTemplateName = (req, res) => {
// console.log('what', __dirname.replace('/controllers', ''));
// var inputData = req.query.inputData;
// var excelTemplateName = req.query.excelTemplateName;
// // var transportationId = req.body.transportationId;d
// // var transportationName = req.body.transportationName;
// ExcelTemplate.find({name: excelTemplateName}).then((data) => {
// try {
// if (data && data.length > 0) {
// var excelTemplate = data[0] || {};
// var templateExcel = `${__dirname.replace('/controllers', '')}${excelTemplate?.file[0]?.url}`;
// var outputFileRandom = Math.ceil(Math.random() * 100000000);
// var outputFile = `/tmp/${excelTemplate.name}_${outputFileRandom}.xlsx`;
// var data = fs.readFileSync(templateExcel, 'binary');
// var template = new XlsxTemplate(data);
// var events = JSON.parse(inputData)?.events;
// for (var i = 0; i < events.length; i++) {
// var pageNumber = i + 2;
// var event = events[i];
// // template.copySheet(1, pageNumber);
// template.copySheet(1, event.client_name);
// // console.log('>>> template substitute:', pageNumber, event);
// template.substitute(pageNumber, event);
// }
// template.deleteSheet(1);
// var newData = template.generate();
// fs.writeFileSync(outputFile, newData, 'binary');
// var outputFilename = outputFile || {};
// var outputPdfPath = outputFilename.substr(0, outputFilename.length - 5) + '.pdf';
// console.log('outputPDF:', outputPdfPath);
// var extend = 'pdf';
// var infile = fs.readFileSync(outputFile);
// // Convert it to pdf format with undefined filter (see Libreoffice doc about filter)
// try {
// libre.convert(infile, extend, undefined, (err, done) => {
// if (err) {
// console.log('Error converting file:', err);
// }
// // Here in done you have pdf file which you can save or transfer in another stream
// fs.writeFileSync(outputPdfPath, done);
// console.log('Conver xlsx to pdf, Done.');
// res.download(outputPdfPath, function(error) {
// if (error) {
// console.log('Error in sending download file ${outputPdfPath}');
// }
// });
// });
// } catch (e) {
// console.log(e);
// }
// } else {
// res.status(404).send({
// success: false,
// message: "Sheet Template doesn't exist"
// })
// }
// } catch(e) {
// console.log(e);
// }
// }).catch(err => {
// res.status(500).send({
// success: false,
// message: "Error Geting docs"
// });
// });
// }
// exports.createSheetFromTemplateName = (req, res) => {
// console.log('what', __dirname.replace('/controllers', ''));
// var inputData = req.query.inputData;
// console.log('inputData', inputData);
// var excelTemplateName = req.query.excelTemplateName;
// // var transportationId = req.body.transportationId;
// // var transportationName = req.body.transportationName;
// ExcelTemplate.find({name: excelTemplateName}).then((data) => {
// try {
// if (data && data.length > 0) {
// var excelTemplate = data[0] || {};
// console.log('template', excelTemplate);
// var templateExcel = `${__dirname.replace('/controllers', '')}${excelTemplate?.file[0]?.url}`;
// var outputFileRandom = Math.ceil(Math.random() * 100000000);
// var outputFile = `/tmp/${excelTemplate.name}_${outputFileRandom}.xlsx`;
// var data = fs.readFileSync(templateExcel, 'binary');
// var template = new XlsxTemplate(data);
// var events = JSON.parse(inputData)?.events;
// console.log('events',events)
// for (var i = 0; i < events.length; i++) {
// var pageNumber = i + 2;
// var event = events[i];
// // template.copySheet(1, pageNumber);
// template.copySheet(1, event.client_name);
// // console.log('>>> template substitute:', pageNumber, event);
// template.substitute(pageNumber, event);
// }
// template.deleteSheet(1);
// var newData = template.generate();
// fs.writeFileSync(outputFile, newData, 'binary');
// console.log('test');
// res.download(outputFile, (error) => {
// if (error) {
// console.log('Error in downloading excel')
// }
// })
// console.log('Download finish');
// } else {
// res.status(404).send({
// success: false,
// message: "excel Template doesn't exist"
// })
// }
// } catch(e) {
// console.log(e);
// }
// }).catch(err => {
// res.status(500).send({
// success: false,
// message: "Error Geting excels"
// });
// });
// // ids.forEach(id => {
// // CalendarEvent.findByIdAndUpdate(id, {link_event_uuid: transportationId,
// // link_event_name: transportationName}, { useFindAndModify: false })
// // .then(data => {
// // if (!data) {
// // res.status(404).send({
// // message: `Cannot update Event with id=${id}. Maybe Event was not found!`
// // });
// // } else res.send({ success: true, message: "Event was updated successfully." });
// // })
// // .catch(err => {
// // res.status(500).send({
// // success: false,
// // message: "Error updating Event with id=" + id
// // });
// // });
// // })
// }
const axios = require("axios");
const { splitSite } = require("../middlewares");
const db = require("../models");
const ExcelTemplate = db.exceltemplate;
const Event = db.calendar_event;
const Customer = db.customer;
const Client = db.client;
const Resource = db.resource;
var XlsxTemplate = require('xlsx-template');
var fs = require('fs');
var multer = require('multer');
const path = require('path');
var libre = require('libreoffice-convert');
const moment = require('moment-timezone');
exports.createPDFFromSheetTemplateName = (req, res) => {
console.log('what', __dirname.replace('/controllers', ''));
var inputData = JSON.parse(req.query.inputData);
const eventIds = inputData?.eventIds;
console.log('eventIds',eventIds);
var excelTemplateName = req.query.excelTemplateName;
console.log('template', excelTemplateName);
Event.find({ '_id': { $in: eventIds } }).then((events) => {
Resource.find({}).then((resources) => {
Customer.find({}).then((customers) => {
Client.find({}).then((clients) => {
const docData = {events: []};
for (const event of events) {
const customerModels = event?.data?.customer ? customers: clients;
const customerId = event?.data?.customer ? event?.data?.customer : event?.target_uuid;
const customer = customerModels.find((customerModel) => customerModel?.id === customerId || customerModel?._id === customerId || customerModel?.name === event?.data?.client_name );
let pharmacyInfo = 'This patient has no contracted pharmacy.\n' + 'Please give the prescription directly to the patient';
const pharmacy = resources.find(r => (r.id === customer?.pharmacy_id)) || resources.find(r => (r.name?.toLowerCase() === event?.data?.client_pharmacy?.toLowerCase()));
if (pharmacy) {
pharmacyInfo = `${pharmacy?.name} @ ${pharmacy?.address} \n` +
`phone:${pharmacy?.phone} fax:${pharmacy?.fax}`;
} else {
if (event?.data?.client_pharmacy) {
pharmacyInfo = 'Pharmacy: ' + event?.data?.client_pharmacy;
}
}
const nameShow = event?.data?.customer ? `${event?.data?.client_name} ${customer?.name_cn}` : `${customer?.name_cn}`
const clientName = (!!customer?.name_cn && !!event?.data?.client_name && nameShow) || customer?.name_cn || (customer?.lastname && customer?.firstname && `${customer?.lastname}, ${customer?.firstname}`) || event?.data?.client_name;
docData.events.push({
event_time: moment(event?.start_time).format('MM/DD/YYYY hh:mm A'),
client_name: event?.data?.client_name, // event.data.client_name,
client_status: '会员',
client_dob: event.data.client_birth_date,
// client_pcp: event.data.client_pcp,
// client_pharmacy: event.data.client_pharmacy,
client_seating: event.data.client_seating,
doctor_name: event.data.resource_name,
doctor_phone: event.data.resource_phone,
//doctor_contact: event.data.resource_contact,
doctor_address: event.data.resource_address?.replaceAll('\n', ' '),
//title: event.title,
// description: event.description,
interpreter: event.data.interpreter,
fasting: event.data.fasting,
confirmed: event.data.confirmed,
new_patient: event.data.new_patient,
doc_order: event.data.doc_order,
need_id: event.data.need_id,
need_med_list: event.data.need_med_list,
reason: event.data.reason,
// notes: event.data.notes,
other: event.data.other,
pharmacy_info: pharmacyInfo,
client_preferred_name: customer?.name_cn,
member_type: customer?.type,
disability: (customer?.disability === true) ? 'Yes' : (event?.data?.disability || 'No')
});
}
// var transportationId = req.body.transportationId;d
// var transportationName = req.body.transportationName;
ExcelTemplate.find({name: excelTemplateName}).then((data) => {
try {
if (data && data.length > 0) {
var excelTemplate = data[0] || {};
var templateExcel = `${__dirname.replace('/controllers', '')}${excelTemplate?.file[0]?.url}`;
var outputFileRandom = Math.ceil(Math.random() * 100000000);
var outputFile = `/tmp/${excelTemplate.name}_${outputFileRandom}.xlsx`;
var data = fs.readFileSync(templateExcel, 'binary');
var template = new XlsxTemplate(data);
var eventDatas = docData.events;
for (var i = 0; i < eventDatas.length; i++) {
var pageNumber = i + 2;
var eventData = eventDatas[i];
// template.copySheet(1, pageNumber);
template.copySheet(1, eventData.client_name);
// console.log('>>> template substitute:', pageNumber, event);
template.substitute(pageNumber, eventData);
}
template.deleteSheet(1);
var newData = template.generate();
fs.writeFileSync(outputFile, newData, 'binary');
var outputFilename = outputFile || {};
var outputPdfPath = outputFilename.substr(0, outputFilename.length - 5) + '.pdf';
console.log('outputPDF:', outputPdfPath);
var extend = 'pdf';
var infile = fs.readFileSync(outputFile);
// Convert it to pdf format with undefined filter (see Libreoffice doc about filter)
try {
libre.convert(infile, extend, undefined, (err, done) => {
if (err) {
console.log('Error converting file:', err);
}
// Here in done you have pdf file which you can save or transfer in another stream
fs.writeFileSync(outputPdfPath, done);
console.log('Conver xlsx to pdf, Done.');
res.download(outputPdfPath, function(error) {
if (error) {
console.log('Error in sending download file ${outputPdfPath}');
}
});
});
} catch (e) {
console.log(e);
}
} else {
res.status(404).send({
success: false,
message: "Sheet Template doesn't exist"
})
}
} catch(e) {
console.log(e);
}
}).catch(err => {
res.status(500).send({
success: false,
message: "Error Geting docs"
});
});
})
})
});
})
}
exports.createSheetFromTemplateName = (req, res) => {
console.log('what', __dirname.replace('/controllers', ''));
var inputData = JSON.parse(req.query.inputData);
const eventIds = inputData?.eventIds;
var excelTemplateName = req.query.excelTemplateName;
Event.find({ '_id': { $in: eventIds } }).then((events) => {
Resource.find({}).then((resources) => {
Customer.find({}).then((customers) => {
Client.find({}).then((clients) => {
const docData = {events: []};
for (const event of events) {
const customerModels = event?.data?.customer ? customers: clients;
const customerId = event?.data?.customer ? event?.data?.customer : event?.target_uuid;
const customer = customerModels.find((customerModel) => customerModel?.id === customerId || customerModel?._id === customerId || customerModel?.name === event?.data?.client_name );
let pharmacyInfo = 'This patient has no contracted pharmacy.\n' + 'Please give the prescription directly to the patient';
const pharmacy = resources.find(r => (r.id === customer?.pharmacy_id)) || resources.find(r => (r.name?.toLowerCase() === event?.data?.client_pharmacy?.toLowerCase()));
if (pharmacy) {
pharmacyInfo = `${pharmacy?.name} @ ${pharmacy?.address} \n` +
`phone:${pharmacy?.phone} fax:${pharmacy?.fax}`;
} else {
if (event?.data?.client_pharmacy) {
pharmacyInfo = 'Pharmacy: ' + event?.data?.client_pharmacy;
}
}
const clientName = (customer?.name_cn && event?.data?.client_name && `${event?.data?.client_name} ${customer?.name_cn}`) || customer?.name_cn || (customer?.lastname && customer?.firstname && `${customer?.lastname}, ${customer?.firstname}`) || event?.data?.client_name;
docData.events.push({
event_time: moment(event?.start_time).format('MM/DD/YYYY hh:mm A'),
client_name: event?.data?.client_name, // event.data.client_name,
client_status: '会员',
client_dob: event.data.client_birth_date,
// client_pcp: event.data.client_pcp,
// client_pharmacy: event.data.client_pharmacy,
client_seating: event.data.client_seating,
doctor_name: event.data.resource_name,
doctor_phone: event.data.resource_phone,
//doctor_contact: event.data.resource_contact,
doctor_address: event.data.resource_address?.replaceAll('\n', ' '),
//title: event.title,
// description: event.description,
interpreter: event.data.interpreter,
fasting: event.data.fasting,
confirmed: event.data.confirmed,
new_patient: event.data.new_patient,
doc_order: event.data.doc_order,
need_id: event.data.need_id,
need_med_list: event.data.need_med_list,
reason: event.data.reason,
// notes: event.data.notes,
other: event.data.other,
pharmacy_info: pharmacyInfo,
client_preferred_name: customer?.name_cn,
member_type: customer?.type,
disability: (customer?.disability === true) ? 'Yes' : (event?.data?.disability || 'No')
});
}
// var transportationId = req.body.transportationId;d
// var transportationName = req.body.transportationName;
ExcelTemplate.find({name: excelTemplateName}).then((data) => {
try {
if (data && data.length > 0) {
var excelTemplate = data[0] || {};
var templateExcel = `${__dirname.replace('/controllers', '')}${excelTemplate?.file[0]?.url}`;
var outputFileRandom = Math.ceil(Math.random() * 100000000);
var outputFile = `/tmp/${excelTemplate.name}_${outputFileRandom}.xlsx`;
var data = fs.readFileSync(templateExcel, 'binary');
var template = new XlsxTemplate(data);
var eventDatas = docData.events;
for (var i = 0; i < eventDatas.length; i++) {
var pageNumber = i + 2;
var eventData = eventDatas[i];
// template.copySheet(1, pageNumber);
template.copySheet(1, eventData.client_name);
// console.log('>>> template substitute:', pageNumber, event);
template.substitute(pageNumber, eventData);
}
template.deleteSheet(1);
var newData = template.generate();
fs.writeFileSync(outputFile, newData, 'binary');
console.log('test');
res.download(outputFile, (error) => {
if (error) {
console.log('Error in downloading excel')
}
})
console.log('Download finish');
} else {
res.status(404).send({
success: false,
message: "Sheet Template doesn't exist"
})
}
} catch(e) {
console.log(e);
}
}).catch(err => {
res.status(500).send({
success: false,
message: "Error Geting docs"
});
});
})
})
});
})
}

BIN
app/middlewares/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,23 @@
const jwt = require("jsonwebtoken");
const config = require("../config/auth.config.js");
const db = require("../models");
const User = db.user;
const Role = db.role;
verifyToken = (req, res, next) => {
let token = req.headers["x-access-token"];
if (!token) {
return res.status(403).send({ message: "No token provided!" });
}
jwt.verify(token, config.secret, (err, decoded) => {
if (err) {
return res.status(401).send({ message: "Unauthorized!" });
}
req.userId = decoded.id;
next();
});
};
const authJwt = {
verifyToken
};
module.exports = authJwt;

6
app/middlewares/index.js Normal file
View File

@ -0,0 +1,6 @@
const authJwt = require("./authJwt");
const splitSite = require("./splitSite");
module.exports = {
authJwt,
splitSite
};

View File

@ -0,0 +1,45 @@
const siteMap = {
'ws1': 1,
'worldshine1': 1,
'ws2': 2,
'worldshine2': 2,
'ws3': 3,
'worldshine3': 3,
'worldshine4': 4,
'ws4': 4,
'worldshine.mayo.llc': 1
};
const findSiteNumber = (req) => {
const hostname = req.hostname;
let site = 1;
for (const key of Object.keys(siteMap)) {
if (hostname.includes(key)) {
site = siteMap[key];
break;
}
}
return site;
}
const splitSiteGet = (req, queryParams) => {
const site = findSiteNumber(req);
const newQueryParams = { ...queryParams, site: site };
console.log('query', newQueryParams);
return newQueryParams;
}
const splitSitePost = (req, postBody) => {
const site = findSiteNumber(req);
const newPostBody = { ...postBody, site: site };
console.log('post', newPostBody);
return newPostBody;
}
const splitSite = {
findSiteNumber,
splitSiteGet,
splitSitePost
}
module.exports = splitSite;

22
app/middlewares/upload.js Normal file
View File

@ -0,0 +1,22 @@
const util = require("util");
const multer = require("multer");
const { GridFsStorage } = require("multer-gridfs-storage");
const dbConfig = require("../config/db.config");
var storage = new GridFsStorage({
url: dbConfig.url,
options: { useNewUrlParser: true, useUnifiedTopology: true },
file: (req, file) => {
const match = ["image/png", "image/jpeg", "image/jpg"];
if (match.indexOf(file.mimetype) === -1) {
const filename = req.params.filename;
return filename;
}
return {
bucketName: dbConfig.imgBucket,
filename: req.params.filename
};
}
});
var uploadFiles = multer({ storage: storage }).single("file");
var uploadFilesMiddleware = util.promisify(uploadFiles);
module.exports = uploadFilesMiddleware;

View File

@ -0,0 +1,29 @@
module.exports = mongoose => {
var editHistorySchema = mongoose.Schema({
employee: String,
date: Date
});
var schema = mongoose.Schema(
{
customer_id: String,
customer_name: String,
date: String,
has_breakfast: Boolean,
create_by: String,
create_date: Date,
edit_history: [{
type: editHistorySchema
}],
site: Number
},
{ collection: 'breakfast', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const Breakfast = mongoose.model("breakfast", schema);
return Breakfast;
};

View File

@ -0,0 +1,91 @@
module.exports = mongoose => {
var editHistorySchema = mongoose.Schema({
employee: String,
date: Date
});
var eventDataSchema = mongoose.Schema({
customer: {type: mongoose.Schema.Types.ObjectId, ref: 'Customer'},
resource: {type: mongoose.Schema.Types.ObjectId, ref: 'Resource'},
// These fields are legacy fields, we will keep it but won't use it again
client_name: String,
client_pharmacy: String,
client_pcp: String,
client_birth_date: String,
client_seating: String,
resource_type: String,
resource_name: String,
resource_phone: String,
resource_contact: String,
resource_address: String,
resource_city: String,
resource_state: String,
// legacy fields end
// We still wanna keep the legacy fields below
new_patient: String,
confirmed: String,
fasting: String,
interpreter: String,
doc_order: String,
need_id: String,
need_med_list: String,
notes: String,
reason: String,
other: String,
disability: String,
disability_support: String,
video_type: String,
video_id: String,
presenter: String,
trans_method: String,
});
var schema = mongoose.Schema(
{
title: String,
type: String,
// value could be ['shopping', 'banking', 'singing', 'dancing', 'medical', 'haircut', 'meal', 'transportation', 'others']
descrption: String,
department: String,
notes: String,
start_time: Date,
stop_time: Date,
color: String,
source_type: String,
source_uuid: String,
source_name: String,
target_type: String,
target_uuid: String,
target_name: String,
link_event_uuid: String,
link_event_name: String,
data: eventDataSchema,
files: [{
type: String
}],
status: String,
confirmed: Boolean,
// value could be ['active', 'inactive']
signup_start_date: Date,
member_col: Object,
tags: [{
type: String
}],
create_by: String,
create_date: Date,
edit_by: String,
edit_date: Date,
youtube_video_id: String,
edit_history: [{
type: editHistorySchema
}],
site: Number
},
{ collection: 'calendar_event', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const CalendarEvent = mongoose.model("calendar_event", schema);
return CalendarEvent;
};

View File

@ -0,0 +1,20 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
phone_title: String,
phone_number: String,
activated: Boolean,
site: Number
},
{ collection: 'center_phone', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.plugin(uniqueValidator);
const CenterPhone = mongoose.model("center_phone", schema);
return CenterPhone;
};

View File

@ -0,0 +1,74 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
username: {
type: String,
unique: true
},
name: String,
name_cn: String,
email: {
type: String,
unique: true
},
parent_id: String,
password: String,
care_provider: String,
emergency_contact: String,
medicare_number: String,
medicaid_number: String,
pharmacy: String,
birth_date: String,
firstname: String,
lastname: String,
address: String,
address2: String,
phone: String,
mobile_phone: String,
type: String,
avatar: String,
note: String,
language: String,
status: String,
create_by: String,
create_date: Date,
edit_by: String,
edit_date: Date,
password: String,
pharmacy_id: String,
pin: String,
admission_date: String,
home_phone: String,
seating: String,
vehicle_no: String,
caller: String,
roles: [{
type: String
}],
discharge_date: String,
placement: String,
nickname: String,
salt: String,
groups: [{
type: String
}],
tags: [{
type: String
}],
api_token: String,
data: String,
title: String,
private_note: String,
site: Number
},
{ collection: 'client', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const Client = mongoose.model("client", schema);
return Client;
};

View File

@ -0,0 +1,86 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
username: {
type: String,
unique: true
},
name: String,
name_cn: String,
email: {
type: String,
unique: true
},
parent_id: String,
password: String,
care_provider: String,
emergency_contact: String,
medicare_number: String,
medicaid_number: String,
pharmacy: String,
birth_date: String,
firstname: String,
lastname: String,
address1: String,
address2: String,
address3: String,
address4: String,
address5: String,
phone: String,
mobile_phone: String,
type: String,
avatar: String,
special_needs: String,
note: String,
language: String,
status: String,
pickup_status: String,
create_by: String,
create_date: Date,
edit_by: String,
edit_date: Date,
password: String,
pharmacy_id: String,
pin: String,
admission_date: String,
home_phone: String,
seating: String,
vehicle_no: String,
caller: String,
roles: [{
type: String
}],
discharge_date: String,
placement: String,
nickname: String,
table_id: String,
salt: String,
groups: [{
type: String
}],
tags: [{
type: String
}],
api_token: String,
data: String,
title: String,
apartment: String,
private_note: String,
site: Number,
disability: Boolean,
height: String,
weight: String,
gender: String,
text_msg_enabled: Boolean
},
{ collection: 'customer', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const Customer = mongoose.model("customer", schema);
return Customer;
};

View File

@ -0,0 +1,37 @@
module.exports = mongoose => {
var editHistorySchema = mongoose.Schema({
employee: String,
date: Date
});
var schema = mongoose.Schema(
{
name: {
type: String,
required: true,
},
content: String,
description: String,
model: Object,
status: String, // 'active', 'inactive'
file: [{
type: Object
}],
site: Number,
create_by: String,
create_date: Date,
edit_by: String,
edit_date: Date,
edit_history: [{
type: editHistorySchema
}],
},
{ collection: 'doctemplate', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const DocTemplate = mongoose.model("doctemplate", schema);
return DocTemplate;
};

View File

@ -0,0 +1,49 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
username: String,
name: String,
name_cn: String,
email: String,
password: String,
roles: [{
type: String
}],
mobile_phone: String,
phone: String,
home_phone: String,
language: String,
employment_status: String,
status: String,
address: String,
title: String,
title_cn: String,
firstname: String,
lastname: String,
department: String,
birth_date: String,
driver_capacity: Number,
date_hired: String,
create_by: String,
create_date: Date,
edit_by: String,
edit_date: Date,
note: String,
tags: [{
type: String
}],
fetch_route_time: Date,
site: Number
},
{ collection: 'employee', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.index({username: 1, email: 1, site:1}, {unique: true});
const Employee = mongoose.model("employee", schema);
return Employee;
};

View File

@ -0,0 +1,39 @@
module.exports = mongoose => {
var editHistorySchema = mongoose.Schema({
employee: String,
date: Date
});
var schema = mongoose.Schema(
{
customer_id: String,
customer_display: String,
source: String,
type: String,
symptom: String,
resource: String,
resource_display: String,
transportation: String,
np: String,
upload: String,
notes: [{
content: String,
author: String
}],
status: String,
create_by: String,
create_date: Date,
edit_history: [{
type: editHistorySchema
}],
site: Number
},
{ collection: 'event_request', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const EventRequest = mongoose.model("event_request", schema);
return EventRequest;
};

30
app/models/index.js Normal file
View File

@ -0,0 +1,30 @@
const dbConfig = require("../config/db.config.js");
const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
const db = {};
db.mongoose = mongoose;
db.url = dbConfig.url;
db.user = require("./user.model.js")(mongoose);
db.employee = require("./employee.model.js")(mongoose);
db.staff = require("./staff.model")(mongoose);
db.vehicle = require("./vehicle.model")(mongoose);
db.customer = require("./customer.model")(mongoose);
db.route_path = require("./route-path.model")(mongoose);
db.route_path_template = require("./route-path-template.model")(mongoose);
db.report = require("./report.model")(mongoose);
db.client = require("./client.model")(mongoose);
db.message = require("./message.model")(mongoose);
db.resource = require("./resource.model")(mongoose);
db.center_phone = require("./center-phone.model")(mongoose);
db.message_token = require("./message-token.model")(mongoose);
db.sent_message = require("./sent-message.model")(mongoose);
db.calendar_event = require("./calendar-event.model")(mongoose);
db.doctemplate = require("./doctemplate.model")(mongoose);
db.exceltemplate = require("./xlsxtemplate.model")(mongoose);
db.timedata = require("./timedata.model")(mongoose);
db.breakfast = require("./breakfast.model")(mongoose);
db.event_request = require("./event-request.model")(mongoose);
db.signature_request = require("./signature-request.model")(mongoose);
db.lunch = require("./lunch.model")(mongoose);
db.snack = require("./snack.model")(mongoose);
module.exports = db;

29
app/models/lunch.model.js Normal file
View File

@ -0,0 +1,29 @@
module.exports = mongoose => {
var editHistorySchema = mongoose.Schema({
employee: String,
date: Date
});
var schema = mongoose.Schema(
{
customer_id: String,
customer_name: String,
date: String,
has_lunch: Boolean,
create_by: String,
create_date: Date,
edit_history: [{
type: editHistorySchema
}],
site: Number
},
{ collection: 'lunch', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const Lunch = mongoose.model("lunch", schema);
return Lunch;
};

View File

@ -0,0 +1,18 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
message_token: String,
site: Number
},
{ collection: 'message_token', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.plugin(uniqueValidator);
const MessageToken = mongoose.model("message_token", schema);
return MessageToken;
};

View File

@ -0,0 +1,22 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
message_name: String,
message_group: Number,
language: String,
message_body: String,
message_title: String,
site: Number
},
{ collection: 'message_template', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.plugin(uniqueValidator);
const Message = mongoose.model("message", schema);
return Message;
};

View File

@ -0,0 +1,39 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var checklistResultSchema = mongoose.Schema({
item: String,
result: Boolean
});
var schema = mongoose.Schema(
{
date: String,
route_id: String,
route_name: String,
driver_name: String,
checklist_result: [{
type: checklistResultSchema
}],
vehicle_number: Number,
type: String,
head: [{
type: String
}],
chinese_head: [{
type: String
}],
data: [{
type: Object
}],
site: Number
},
{ collection: 'report', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.plugin(uniqueValidator);
const Report = mongoose.model("report", schema);
return Report;
};

View File

@ -0,0 +1,51 @@
module.exports = mongoose => {
var editHistorySchema = mongoose.Schema({
employee: String,
date: Date
});
var schema = mongoose.Schema(
{
name: String,
name_original: String,
name_branch: String,
specialty: String,
type: String, // value may be ['doctor', 'pharmacy' or 'other']
color: String,
address: String,
city: String,
state: String,
zipcode: String,
phone: String,
status: String, // value might be ['active', 'inactive']
create_by: String,
create_date: Date,
parent_id: String,
ext_id: String,
category: String,
description: String,
contact: String,
fax: String,
note: String,
data: Object,
edit_by: String,
edit_date: Date,
create_by: String,
create_date: Date,
site: Number,
images: [{
type: String
}],
edit_history: [{
type: editHistorySchema
}],
},
{ collection: 'resource', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const Resource = mongoose.model("resource", schema);
return Resource;
};

View File

@ -0,0 +1,45 @@
module.exports = mongoose => {
var routeCustomerListSchema = mongoose.Schema({
customer_id: String,
customer_name: String,
customer_address: String,
customer_avatar: String,
customer_group: String,
customer_group_address: String,
customer_type: String,
customer_pickup_status: String,
customer_note: String,
customer_special_needs: String,
customer_phone: String,
customer_enter_center_time: Date,
customer_leave_center_time: Date,
customer_pickup_time: Date,
customer_dropoff_time: Date,
customer_route_status: String,
customer_pickup_order: Number,
customer_table_id: String,
customer_estimated_pickup_time: String,
customer_estimated_dropoff_time: String
});
var schema = mongoose.Schema(
{
name: String,
vehicle: String,
driver: String,
type: String,
route_customer_list: [{
type: routeCustomerListSchema
}],
status: String,
site: Number
},
{ collection: 'route_path_template', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const RoutePathTemplate = mongoose.model("route_path_template", schema);
return RoutePathTemplate;
};

View File

@ -0,0 +1,65 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var routeCustomerListSchema = mongoose.Schema({
customer_id: String,
customer_name: String,
customer_address: String,
customer_avatar: String,
customer_group: String,
customer_group_address: String,
customer_type: String,
customer_pickup_status: String,
customer_note: String,
customer_special_needs: String,
customer_phone: String,
customer_enter_center_time: Date,
customer_leave_center_time: Date,
customer_pickup_time: Date,
customer_dropoff_time: Date,
customer_route_status: String,
customer_pickup_order: Number,
customer_table_id: String,
customer_transfer_to_route: String,
customer_language: String,
customer_estimated_pickup_time: String,
customer_estimated_dropoff_time: String,
customer_address_override: String,
});
var checklistResultSchema = mongoose.Schema({
item: String,
result: Boolean
});
var schema = mongoose.Schema(
{
name: String,
schedule_date: String,
vehicle: String,
status: [{
type: String
}],
driver: String,
type: String,
start_mileage: Number,
end_mileage: Number,
start_time: Date,
end_time: Date,
estimated_start_time: Date,
route_customer_list: [{
type: routeCustomerListSchema
}],
checklist_result: [{
type: checklistResultSchema,
}],
site: Number
},
{ collection: 'route_path', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.plugin(uniqueValidator);
const RoutePath = mongoose.model("route_path", schema);
return RoutePath;
};

View File

@ -0,0 +1,26 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
from_type: String,
from: String,
to_type: String,
to: String,
department: String,
content: String,
status: String,
create_by: String,
create_date: Date,
site: Number
},
{ collection: 'message', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.plugin(uniqueValidator);
const SentMessage = mongoose.model("sentMessage", schema);
return SentMessage;
};

View File

@ -0,0 +1,23 @@
module.exports = mongoose => {
var schema = mongoose.Schema(
{
driver_id: String,
driver_name: String,
route_id: String,
route_date: String,
route_name: String,
status: String,
create_by: String,
create_date: Date,
site: Number
},
{ collection: 'signature_request', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const SignatureRequest = mongoose.model("signature_request", schema);
return SignatureRequest;
};

29
app/models/snack.model.js Normal file
View File

@ -0,0 +1,29 @@
module.exports = mongoose => {
var editHistorySchema = mongoose.Schema({
employee: String,
date: Date
});
var schema = mongoose.Schema(
{
customer_id: String,
customer_name: String,
date: String,
has_snack: Boolean,
create_by: String,
create_date: Date,
edit_history: [{
type: editHistorySchema
}],
site: Number
},
{ collection: 'snack', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const Snack = mongoose.model("snack", schema);
return Snack;
};

63
app/models/staff.model.js Normal file
View File

@ -0,0 +1,63 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
username: {
type: String,
required: true,
unique: true
},
name: String,
name_cn: String,
email: {
type: String,
required: true,
unique: true
},
password: String,
roles: [{
type: String
}],
mobile_phone: String,
phone: String,
home_phone: String,
language: String,
employment_status: String,
status: String,
title: String,
title_cn: String,
firstname: String,
lastname: String,
department: String,
birth_date: String,
driver_capacity: Number,
date_hired: String,
create_by: String,
create_date: Date,
edit_by: String,
edit_date: Date,
note: Object,
salt: String,
city: String,
state: String,
zipcode: String,
group: [{
type: String
}],
tags: [{
type: String
}],
parent_id: String,
site: Number
},
{ collection: 'staff', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.plugin(uniqueValidator);
const Staff = mongoose.model("staff", schema);
return Staff;
};

View File

@ -0,0 +1,25 @@
module.exports = mongoose => {
var schema = mongoose.Schema(
{
time: Date,
translate1_number: Number,
translate2_number: Number,
max_resource_number: Number,
status: String, // 'active', 'inactive'
data: Object,
site: Number,
create_by: String,
create_date: Date,
edit_by: String,
edit_date: Date
},
{ collection: 'timedata', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const Timedata = mongoose.model("timedata", schema);
return Timedata;
};

26
app/models/user.model.js Normal file
View File

@ -0,0 +1,26 @@
module.exports = mongoose => {
var schema = mongoose.Schema(
{
username: String,
email: String,
salt: Number,
password: String,
api_token: String,
roles: [{
type: String
}],
status: String,
create_by: String,
create_date: Date,
site: Number
},
{ collection: 'user', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const User = mongoose.model("user", schema);
return User;
};

View File

@ -0,0 +1,40 @@
const uniqueValidator = require('mongoose-unique-validator');
module.exports = mongoose => {
var schema = mongoose.Schema(
{
vehicle_number: {
type: Number,
required: true,
},
tag: {
type: String,
required: true
},
ezpass: {
type: String,
},
gps_tag: {
type: String,
},
mileage: Number,
capacity: Number,
make: String,
vehicle_model: String,
year: String,
checklist: [{
type: String
}],
status: String,
site: Number
},
{ collection: 'vehicle', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
schema.index({tag: 1, site:1}, {unique: true});
const Vehicle = mongoose.model("vehicle", schema);
return Vehicle;
};

View File

@ -0,0 +1,37 @@
module.exports = mongoose => {
var editHistorySchema = mongoose.Schema({
employee: String,
date: Date
});
var schema = mongoose.Schema(
{
name: {
type: String,
required: true,
},
content: String,
description: String,
model: Object,
status: String, // 'active', 'inactive'
file: [{
type: Object
}],
site: Number,
create_by: String,
create_date: Date,
edit_by: String,
edit_date: Date,
edit_history: [{
type: editHistorySchema
}],
},
{ collection: 'xlsx-template', timestamps: true }
);
schema.method("toJSON", function() {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
const ExcelTemplate = mongoose.model("xlsxtemplate", schema);
return ExcelTemplate;
};

BIN
app/routes/.DS_Store vendored Normal file

Binary file not shown.

11
app/routes/auth.routes.js Normal file
View File

@ -0,0 +1,11 @@
module.exports = app => {
const auth = require("../controllers/auth.controller");
app.use(function(req, res, next) {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
app.post('/api/auth/login', auth.login);
};

View File

@ -0,0 +1,19 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const breakfast = require("../controllers/breakfast.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all breakfasts
router.get("/", [authJwt.verifyToken], breakfast.getAllBreakfasts);
// Create a new breakfast
router.post("/", [authJwt.verifyToken], breakfast.createNewBreakfast);
router.put('/:id', [authJwt.verifyToken], breakfast.updateBreakfast);
router.delete('/:id', [authJwt.verifyToken], breakfast.deleteBreakfast)
app.use('/api/breakfasts', router);
};

View File

@ -0,0 +1,23 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const calendarEvent = require("../controllers/calendar-event.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all Events
router.get("/", [authJwt.verifyToken], calendarEvent.getAllEvents);
router.get('/getByCustomer',[authJwt.verifyToken], calendarEvent.getEventsByCustomer );
// Create a new Event
router.post("/", [authJwt.verifyToken], calendarEvent.createCalendarEvent);
router.get('/:id', [authJwt.verifyToken], calendarEvent.getEvent);
router.put('/:id', [authJwt.verifyToken], calendarEvent.updateEvent);
router.put('/:id/disable', [authJwt.verifyToken], calendarEvent.disableEvent);
router.post('/assign', [authJwt.verifyToken], calendarEvent.assignTransportationToEvents);
router.delete('/:id', [authJwt.verifyToken], calendarEvent.deleteEvent);
app.use('/api/events', router);
};

View File

@ -0,0 +1,19 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const centerPhone = require("../controllers/center-phone.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all Phones
router.get("/", [authJwt.verifyToken], centerPhone.getAllCenterPhones);
// Create a new Phone
router.post("/", [authJwt.verifyToken], centerPhone.createCenterPhone);
router.get('/:id', [authJwt.verifyToken], centerPhone.getCenterPhone);
router.put('/:id', [authJwt.verifyToken], centerPhone.updateCenterPhone);
app.use('/api/phones', router);
};

View File

@ -0,0 +1,20 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const clients = require("../controllers/client.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Create a new client
router.post("/",[authJwt.verifyToken], clients.createClient);
router.get("/:id",[authJwt.verifyToken], clients.getClient);
// Update Client
router.put("/:id",[authJwt.verifyToken], clients.updateClient );
// Get clients with name or email
router.get("/search", [authJwt.verifyToken], clients.getClientsWithNameOrEmail);
app.use('/api/clients', router);
};

View File

@ -0,0 +1,24 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const customers = require("../controllers/customer.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all customer
router.get("/", [authJwt.verifyToken], customers.getAllCustomers);
// Get All active customers
router.get("/active",[authJwt.verifyToken], customers.getAllActiveCustomers);
// Create a new customer
router.post("/",[authJwt.verifyToken], customers.createCustomer);
// Get Customers with name or email
router.get("/search", [authJwt.verifyToken], customers.getCustomersWithNameOrEmail);
// Update Customer
router.put("/:id",[authJwt.verifyToken], customers.updateCustomer );
router.get("/:id", [authJwt.verifyToken], customers.getCustomer);
app.use('/api/customers', router);
};

View File

@ -0,0 +1,9 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const docTemplates = require("../controllers/doctemplate.controller.js");
var router = require("express").Router();
// Retrieve all users
router.get("/get-docs", docTemplates.createDocFromDocTemplateName);
router.get("/get-pdfs", docTemplates.createPDFFromDocTemplateName);
app.use('/api/docs', router);
};

View File

@ -0,0 +1,21 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const employees = require("../controllers/employee.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all employee
router.get("/",[authJwt.verifyToken], employees.getAllEmployees);
// Create a new employee
router.post("/", employees.createEmployee);
// Update an employee
router.put("/:id",[authJwt.verifyToken], employees.updateEmployee );
// Get one employee
router.get("/:id",[authJwt.verifyToken], employees.getEmployee)
app.use('/api/employees', router);
};

View File

@ -0,0 +1,19 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const eventRequest = require("../controllers/event-request.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all event Request
router.get("/", [authJwt.verifyToken], eventRequest.getAllEventRequests);
// Create a new event Request
router.post("/", [authJwt.verifyToken], eventRequest.createEventRequest);
router.put('/:id', [authJwt.verifyToken], eventRequest.updateRequestItem);
router.delete('/:id', [authJwt.verifyToken], eventRequest.deleteEventRequest)
app.use('/api/event-requests', router);
};

View File

@ -0,0 +1,19 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const lunch = require("../controllers/lunch.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all lunches
router.get("/", [authJwt.verifyToken], lunch.getAllLunches);
// Create a new Lunch
router.post("/", [authJwt.verifyToken], lunch.createNewLunch);
router.put('/:id', [authJwt.verifyToken], lunch.updateLunch);
router.delete('/:id', [authJwt.verifyToken], lunch.deleteLunch)
app.use('/api/lunches', router);
};

View File

@ -0,0 +1,19 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const messageTokens = require("../controllers/message-token.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all messageTokens
router.get("/",[authJwt.verifyToken], messageTokens.getAllMessageTokens);
// Create a new messageToken
router.post("/", [authJwt.verifyToken], messageTokens.createMessageToken);
// Update an messageToken
router.put("/:id",[authJwt.verifyToken], messageTokens.updateMessageToken );
app.use('/api/message-tokens', router);
};

View File

@ -0,0 +1,25 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const messages = require("../controllers/message.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all messages
router.get("/",[authJwt.verifyToken], messages.getAllMessages);
// Create a new message
router.post("/", [authJwt.verifyToken], messages.createMessage);
// Update an message
router.put("/:id",[authJwt.verifyToken], messages.updateMessage );
// Get messages by Date and Type
router.get("/:id", [authJwt.verifyToken], messages.getMessage);
router.get("/sent-messages/all", [authJwt.verifyToken], messages.getAllSentMessages);
router.get("/public/search", messages.getMessagesByGroupAndLanguage);
router.post("/public/send", [authJwt.verifyToken], messages.sendMessage);
app.use('/api/messages', router);
};

View File

@ -0,0 +1,22 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const reports = require("../controllers/report.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all reports
router.get("/",[authJwt.verifyToken], reports.getAllReports);
// Create a new report
router.post("/", [authJwt.verifyToken], reports.createReport);
// Update an report
router.put("/:id",[authJwt.verifyToken], reports.updateReport );
// Get reports by Date and Type
router.get("/search", reports.getReportsByDateAndType);
router.get("/search-route", reports.getReportsByRouteIdAndType);
app.use('/api/reports', router);
};

View File

@ -0,0 +1,14 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const resource = require("../controllers/resource.controller.js");
var router = require("express").Router();
// Retrieve all resources
router.get("/", [authJwt.verifyToken], resource.getAllResources);
// Create a new resource
router.post("/", [authJwt.verifyToken], resource.createResource);
router.get('/:id', [authJwt.verifyToken], resource.getResource);
router.put('/:id', [authJwt.verifyToken], resource.updateResource);
router.put('/:id/disable', [authJwt.verifyToken], resource.disableResource);
router.delete('/:id', [authJwt.verifyToken], resource.deleteResource)
app.use('/api/resources', router);
};

View File

@ -0,0 +1,22 @@
const { route } = require("express/lib/application");
const {authJwt} = require("../middlewares");
module.exports = app => {
const routePathTemplates = require("../controllers/route-path-template.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all routes
router.get("/", [authJwt.verifyToken],routePathTemplates.getAllRoutesTemplates);
// Create a new route
router.post("/", [authJwt.verifyToken], routePathTemplates.createRoutePathTemplate);
// Update a route with id
router.put("/:id", [authJwt.verifyToken], routePathTemplates.updateRouteTemplate);
// Delete a route with id
router.delete("/:id", [authJwt.verifyToken], routePathTemplates.deleteRouteTemplate);
app.use('/api/route-templates', router);
};

View File

@ -0,0 +1,25 @@
const { route } = require("express/lib/application");
const {authJwt} = require("../middlewares");
module.exports = app => {
const routePaths = require("../controllers/route-path.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all routes
router.get("/", [authJwt.verifyToken], routePaths.getAllRoutes);
router.get("/:id", [authJwt.verifyToken], routePaths.getRoute);
// Create a new route
router.post("/", [authJwt.verifyToken], routePaths.createRoutePath);
// Update a route with id
router.put("/:id", [authJwt.verifyToken], routePaths.updateRoute);
// Delete a route with id
router.delete("/:id", [authJwt.verifyToken], routePaths.deleteRoute);
router.post("/update-in-progress", [authJwt.verifyToken], routePaths.updateRouteInProgress);
router.get("/routes-with-phone", routePaths.getAllRoutesWithPhones);
app.use('/api/routes', router);
};

View File

@ -0,0 +1,23 @@
const { route } = require("express/lib/application");
module.exports = app => {
const signatureRequest = require("../controllers/signature-request.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all signature requests
router.get("/",signatureRequest.getAllSignatureRequests);
// Get one signature request by id
router.get("/:id", signatureRequest.getSignatureRequest);
// Create a new signature request
router.post("/", signatureRequest.createNewSignatureRequest);
// Update a signature request with id
router.put("/:id", signatureRequest.updateSignatureRequest);
// Delete a signature request with id
router.delete("/:id", signatureRequest.deleteSignatureRequest);
app.use('/api/signature-requests', router);
};

View File

@ -0,0 +1,19 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const snack = require("../controllers/snack.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all snacks
router.get("/", [authJwt.verifyToken], snack.getAllSnacks);
// Create a new snack
router.post("/", [authJwt.verifyToken], snack.createNewSnack);
router.put('/:id', [authJwt.verifyToken], snack.updateSnack);
router.delete('/:id', [authJwt.verifyToken], snack.deleteSnack)
app.use('/api/snacks', router);
};

View File

@ -0,0 +1,19 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const staffs = require("../controllers/staff.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Create a new staff
router.post("/", staffs.createStaff);
// Update an Staff
router.put("/:id",[authJwt.verifyToken], staffs.updateStaff );
// Get Staff by email or username
router.get("/search", [authJwt.verifyToken], staffs.getStaffsWithNameOrEmail)
app.use('/api/staffs', router);
};

View File

@ -0,0 +1,9 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const timedata = require("../controllers/timedata.controller");
var router = require("express").Router();
// Retrieve all users
router.get("/get-by-condition1", timedata.getDocsByCondition1);
app.use('/api/timedata', router);
};

View File

@ -0,0 +1,8 @@
module.exports = app => {
const upload = require("../controllers/upload.controller.js");
var router = require("express").Router();
router.get("/:name", upload.getFile);
router.post("/upload/:filename", upload.uploadFiles);
router.post("/delete", upload.deleteFile);
app.use('/api/files', router);
};

View File

@ -0,0 +1,7 @@
module.exports = app => {
const user = require("../controllers/user.controller.js");
var router = require("express").Router();
// Retrieve all users
router.get("/", user.getAllUsers);
app.use('/api/users', router);
};

View File

@ -0,0 +1,21 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const vehicles = require("../controllers/vehicle.controller.js");
app.use((req, res, next) => {
res.header(
"Access-Control-Allow-Headers",
"x-access-token, Origin, Content-Type, Accept"
);
next();
});
var router = require("express").Router();
// Retrieve all employee
router.get("/", [authJwt.verifyToken], vehicles.getAllVehicles);
// Create a new employee
router.post("/", [authJwt.verifyToken], vehicles.createVehicle);
router.get('/active', [authJwt.verifyToken], vehicles.getAllActiveVehicles);
router.get('/:id', [authJwt.verifyToken], vehicles.getVehicle);
router.put('/:id', [authJwt.verifyToken], vehicles.updateVehicle);
router.delete('/:id', [authJwt.verifyToken], vehicles.deleteVehicle);
app.use('/api/vehicles', router);
};

View File

@ -0,0 +1,9 @@
const {authJwt} = require("../middlewares");
module.exports = app => {
const excelTemplates = require("../controllers/xlsxtemplate.controller");
var router = require("express").Router();
// Retrieve all users
router.get("/get-sheets", excelTemplates.createSheetFromTemplateName);
router.get("/get-pdf", excelTemplates.createPDFFromSheetTemplateName);
app.use('/api/sheets', router);
};

BIN
app/upload/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
app/views/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,16 @@
{
"files": {
"main.css": "/static/css/main.22055773.css",
"main.js": "/static/js/main.3884af74.js",
"static/js/787.c4e7f8f9.chunk.js": "/static/js/787.c4e7f8f9.chunk.js",
"static/media/background.jpg": "/static/media/background.d0e107221150b4c16901.jpg",
"index.html": "/index.html",
"main.22055773.css.map": "/static/css/main.22055773.css.map",
"main.3884af74.js.map": "/static/js/main.3884af74.js.map",
"787.c4e7f8f9.chunk.js.map": "/static/js/787.c4e7f8f9.chunk.js.map"
},
"entrypoints": [
"static/css/main.22055773.css",
"static/js/main.3884af74.js"
]
}

BIN
app/views/favicon-16x16.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

BIN
app/views/favicon-32x32.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
app/views/favicon.ico Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
app/views/images/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

View File

@ -0,0 +1 @@
<svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M1020.928353 527.024211a39.408053 39.408053 0 0 0 3.056594-15.047455c0-5.247922-1.095664-10.342246-3.056594-15.124255a38.445507 38.445507 0 0 0-8.463234-12.620612l-162.542218-162.547338c-15.277852-15.282972-40.042923-15.282972-55.407814 0-15.277852 15.359771-15.277852 40.129962 0 55.412934l95.691374 95.691374h-339.031109V133.665592l95.691374 95.691375a39.044538 39.044538 0 0 0 27.668068 11.443029c10.029931 0 20.059861-3.839943 27.739747-11.443029 15.282972-15.359771 15.282972-40.124842 0-55.407815L539.655524 11.396694c-1.802213-1.879012-4.075459-2.739159-6.189988-4.147138-2.114528-1.413099-3.99354-3.215312-6.425504-4.234177a39.459252 39.459252 0 0 0-30.171711 0c-2.431964 1.018865-4.234177 2.815958-6.425504 4.229057-2.03773 1.413099-4.310976 2.273246-6.195107 4.152258L321.710611 173.949152c-15.282972 15.282972-15.282972 40.048043 0 55.407815a39.208376 39.208376 0 0 0 55.407815 0l95.691374-95.691375V472.788859H133.778692l95.609455-95.691374c15.359771-15.282972 15.359771-40.053163 0-55.412934-15.282972-15.282972-40.048043-15.282972-55.407815 0L11.525153 484.231889A37.273045 37.273045 0 0 0 3.051679 496.852501 38.368708 38.368708 0 0 0 0.000205 511.976756a37.989834 37.989834 0 0 0 3.056594 15.052575 37.58536 37.58536 0 0 0 8.463234 12.697411l162.460299 162.465419a39.029178 39.029178 0 0 0 27.744867 11.44303c10.03505 0 20.064981-3.763144 27.662948-11.44303 15.359771-15.282972 15.359771-40.124842 0-55.407814L133.783811 551.164652h339.031109v339.051588l-95.691374-95.619695a39.065018 39.065018 0 0 0-55.407815 0c-15.282972 15.282972-15.282972 40.048043 0 55.412934l162.4603 162.470539a39.438772 39.438772 0 0 0 12.851008 8.463234A37.887435 37.887435 0 0 0 511.992576 1023.999846c5.094324 0 10.188648-1.018865 14.888738-3.056594a38.629824 38.629824 0 0 0 12.851009-8.463234l162.542218-162.470539c15.282972-15.359771 15.282972-40.129962 0-55.412934-15.359771-15.359771-40.124842-15.359771-55.407815 0l-95.691374 95.619695v-339.051588h339.031109l-95.691374 95.619695c-15.277852 15.282972-15.277852 40.124842 0 55.407814a39.029178 39.029178 0 0 0 27.744866 11.44303c10.03505 0 20.064981-3.763144 27.662948-11.44303l162.542218-162.470539a38.773182 38.773182 0 0 0 8.463234-12.697411" fill="#304156" /></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
app/views/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

BIN
app/views/images/logo1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

BIN
app/views/images/logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Some files were not shown because too many files have changed in this diff Show More