'use strict'; const express = require('express'); const router = new express.Router(); const Merchant = require('mongoose').model('Merchant'); const Branch = require('mongoose').model('Branch'); const Workstation = require('mongoose').model('Workstation'); const Employee = require('mongoose').model('Employee'); const Client = require('mongoose').model('Client'); const GiftCard = require('mongoose').model('GiftCard'); const Transaction = require('mongoose').model('Transaction'); const Generator = require('./gift-card-number.js'); const Response = require('../etc/responses.json'); // REST API // MARK: welcome router.all('/welcome', (req, res) => { res.status(200).json({ success: true, message: Response.r1[req.body.language] }); }); // MARK: - Extractors // MARK: extract client function extractClient(payload) { let client_id = payload._id; let merchant_id = payload.merchant_id; let branch_id = payload.branch_id; let client_name = payload.client_name; let client_email = payload.client_email; let street = payload.street; let street_2 = payload.street_2; let city = payload.city; let province = payload.province; let postal_code = payload.postal_code; let country = payload.country; let telephone = payload.telephone; let cellular = payload.cellular; let telephone_other = payload.telephone_other; let birthday = payload.birthday; return { client_id, merchant_id, branch_id, client_name, client_email, street, street_2, city, province, postal_code, country, telephone, cellular, telephone_other, birthday } } // MARK: extract gift card function extractGiftCard(payload) { let gift_card_id = payload._id; let gift_card_number = payload.gift_card_number; let merchant_id = payload.merchant_id; let branch_id = payload.branch_id; let balance = payload.balance; let points = payload.points; return { gift_card_id, gift_card_number, merchant_id, branch_id, balance, points } } // MARK: extract transaction function extractTransaction(payload) { let transaction_id = payload._id; let merchant_id = payload.merchant_id; let branch_id = payload.branch_id; let client_id = payload.client_id; let workstation_id = payload.workstation_id; let serial_number = payload.serial_number; let employee_id = payload.employee_id; let employee_number = payload.employee_number; let invoice = payload.invoice; let type = payload.type; let gift_card_id = payload.gift_card_id; let gift_card_number = payload.gift_card_number; let points_amount = payload.points_amount; let remainder = payload.remainder; let cancelled_transaction_id = payload.cancelled_transaction_id; let cancelled = payload.cancelled; let message = payload.message; return { transaction_id, merchant_id, branch_id, client_id, workstation_id, serial_number, employee_id, employee_number, invoice, type, gift_card_id, gift_card_number, points_amount, remainder, cancelled_transaction_id, cancelled, message } } // MARK: - Registration // MARK: add branch router.post('/addBranch', (req, res, next) => { if (!req.body.name) { return res.status(400).json({ success: false, error_code: 'e1', messsage: Response.r2[req.body.language] }); } // Search for equal branches already in database for this Merchant Branch.findOne({ merchant_id: req.body.merchant_id, name: req.body.name }, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (!doc) next(); else { return res.status(409).json({ success: false, error_code: 'e2', message: Response.r3[req.body.language] }) }; }) }, (req, res, next) => { // Get the next available branch number Branch.findOne({ merchant_id: req.body.merchant_id }).sort({ number: -1 }).limit(1).exec((err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (!doc) { req.body.number = 1; next(); } else { req.body.number = doc.number + 1; next(); } }); }, (req, res) => { // Create a new branch const newBranch = new Branch(req.body); newBranch.save((err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); return res.status(200).json({ success: true, message: Response.r4[req.body.language], branch_id: doc._id }); }); }); // MARK: add workstation router.post('/addWorkstation', (req, res, next) => { if (!req.body.branch_id) { req.body.branch_id = req.body.merchant_id; } // Get the next available workstation number Workstation.findOne({ merchant_id: req.body.merchant_id }).sort({ number: -1 }).limit(1).exec((err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (!doc) { req.body.number = 1; next(); } else { req.body.number = doc.number + 1; next(); } }) }, (req, res) => { const newWorkstation = new Workstation(req.body); newWorkstation.save((err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); return res.status(200).json({ success: true, message: Response.r5[req.body.language], workstation_id: doc._id }); }); }); // MARK: add employee router.post('/addEmployee', (req, res, next) => { if (!req.body.employee_name) { return res.status(400).json({ success: false, error_code: 'e3', messsage: Response.r6[req.body.language] }); } if (!req.body.branch_id) { req.body.branch_id = req.body.merchant_id; } // Check for employees with the same name at this Merchant Employee.findOne({merchant_id: req.body.merchant_id, employee_name: req.body.employee_name}, (err, doc) =>{ if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (!doc) next(); else { return res.status(400).json({ success: false, error_code: 'e4', messsage: Response.r7[req.body.language] }); } }); }, (req, res, next) => { // Get next available employee number Employee.findOne({ branch_id: req.body.branch_id }).sort({ employee_number: -1 }).limit(1).exec((err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (!doc) { req.body.employee_number = 1; next(); } else { req.body.employee_number = doc.employee_number + 1; next(); } }) }, (req, res) => { const newEmployee = new Employee(req.body); newEmployee.save((err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); return res.status(200).json({ success: true, message: Response.r8[req.body.language], employee_number: doc.employee_number, employee_id: doc._id }); }); }); // MARK: add client // Adding a client automatically creates a gift-card router.post('/addClient', (req, res, next) => { if (!req.body.client_name) { return res.status(400).json({ success: false, message: Response.r9[req.body.language], error_code: 'e5' }); } if (!req.body.client_email) { return res.status(400).json({ success: false, message: Response.r10[req.body.language], error_code: 'e6' }); } if (!req.body.branch_id) { Branch.find({ merchant_id: req.body.merchant_id }, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (doc.length === 0) { req.body.branch_id = req.body.merchant_id; } else if (doc.length > 1) { return res.status(400).json({ success: false, message: Response.r11[req.body.language], error_code: 'e7' }); } }); } // Check if this client name already exists in this Merchant's database Client.findOne({ merchant_id: req.body.merchant_id, name: req.body.client_name }, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (doc) { return res.status(400).json({ success: false, message: Response.r12[req.body.language], error_code: 'e8', client_name: doc.name, client_id: doc._id }); } else { next(); } }); }, (req, res, next) => { // Get next available client number for this merchant Client.findOne({ merchant_id: req.body.merchant_id }).sort({ number: -1 }).limit(1).exec((err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (!doc) { req.body.number = 1; next(); } else { req.body.number = doc.number + 1; next(); } }) }, (req, res) => { // Create next client const newClient = new Client(req.body); newClient.save((err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); req.body.client_id = doc._id; req.body.client_name = doc.client_name; // Proceed to create a gift card for this new client res.locals.fromAddClient = true; Generator(req, res); }); }); // MARK: add gift card router.post('/addGiftCard', (req, res) => { if (!req.body.client_id) { return res.status(400).json({ success: false, error_code: 'e9', message: Response.r13[req.body.language] }); } if (!req.body.branch_id) { return res.status(400).json({ success: false, error_code: 'e10', message: Response.r14[req.body.language] }); } Generator(req, res); }); // MARK: - Editing records // MARK: edit merchant router.put('/editMerchant', (req, res) => { if (!req.body.data) { return res.status(400).json({ success: false, message: Response.r15[req.body.language], error_code: 'e11' }); } Merchant.findOneAndUpdate({_id: req.body.merchant_id}, {$set: req.body.data}, {new: true}, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r16[req.body.language], error_code: 'e12' }); } else return res.status(200).json({ success: true, message: Response.r17[req.body.language], merchant_id: doc._id, merchant_name: doc.merchant_name, merchant_email: doc.merchant_email }); }); }); // MARK: edit branch router.put('/editBranch', (req, res) => { if (!req.body.branch_id) { return res.status(400).json({ success: false, message: Response.r11[req.body.language], error_code: 'e7' }); } if (!req.body.data) { return res.status(400).json({ success: false, message: Response.r15[req.body.language], error_code: 'e11' }); } Branch.findOneAndUpdate({_id: req.body.branch_id}, {$set: req.body.data}, {new: true}, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r18[req.body.language], error_code: 'e13' }); } else { return res.status(200).json({ success: true, message: Response.r19[req.body.language], branch_id: doc._id, branch_name: doc.branch_name, street: doc.street, street_2: doc.street_2, city: doc.city, province: doc.province, postal_code: doc.postal_code, country: doc.country, telephone: doc.telephone, cellular: doc.cellular, telephone_other: doc.telephone_other }); } }); }); // MARK: edit workstation router.put('/editWorkstation', (req, res) => { if (!req.body.workstation_id) { return res.status(400).json({ success: false, message: Response.r20[req.body.language], error_code: 'e14' }); } if (!req.body.data) { return res.status(400).json({ success: false, message: Response.r15[req.body.language], error_code: 'e11' }); } Workstation.findOneAndUpdate({_id: req.body.workstation_id}, {$set: req.body.data}, {new: true}, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r21[req.body.language], error_code: 'e15' }); } else { return res.status(200).json({ success: true, message: Response.r22[req.body.language], workstation_id: doc._id, serial_number: doc.serial_number, workstation_name: doc.workstation_name }); } }); }); // MARK: edit client router.put('/editClient', (req, res) => { if (!req.body.client_id) { return res.status(400).json({ success: false, message: Response.r23[req.body.language], error_code: 'e16' }); } if (!req.body.data) { return res.status(400).json({ success: false, message: Response.r15[req.body.language], error_code: 'e11' }); } Client.findOneAndUpdate({_id: req.body.client_id}, {$set: req.body.data}, {new: true}, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r24[req.body.language], error_code: 'e17' }); } else { return res.status(200).json({ success: true, message: Response.r25[req.body.language], client_id: doc._id, client_name: doc.client_name, client_email: doc.client_email, birthday: doc.birthday, street: doc.street, street_2: doc.street_2, city: doc.city, province: doc.province, postal_code: doc.postal_code, country: doc.country, telephone: doc.telephone, cellular: doc.cellular, telephone_other: doc.telephone_other }); } }); }); // MARK: edit employee router.put('/editEmployee', (req, res) => { if (!req.body.employee_id) { return res.status(400).json({ success: false, message: Response.r26[req.body.language], error_code: 'e18' }); } if (!req.body.data) { return res.status(400).json({ success: false, message: Response.r15[req.body.language], error_code: 'e11' }); } Employee.findOneAndUpdate({_id: req.body.employee_id}, {$set: req.body.data}, {new: true}, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r27[req.body.language], error_code: 'e19' }); } else { return res.status(200).json({ success: true, message: Response.r28[req.body.language], employee_id: doc._id, number: doc.number, employee_name: doc.employee_name }); } }); }); // MARK: - Deleting records // MARK: delete merchant router.delete('/deleteMerchant', (req, res) => { Merchant.remove({_id: req.body.merchant_id}, (err) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else return res.status(200).json({ success: true, message: Response.r29[req.body.language] }); }) }); // MARK: delete branch router.delete('/deleteBranch', (req, res) => { if (!req.body.branch_id) { return res.status(400).json({ success: false, message: Response.r30[req.body.language], error_code: 'e20' }); } Branch.remove({_id: req.body.branch_id}, (err) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else { return res.status(200).json({ success: true, message: Response.r31[req.body.language] }); } }) }); // MARK: delete workstation router.delete('/deleteWorkstation', (req, res) => { if (!req.body.workstation_id) { return res.status(400).json({ success: false, message: Response.r32[req.body.language], error_code: 'e21' }); } Workstation.remove({_id: req.body.workstation_id}, (err) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else { return res.status(200).json({ success: true, message: Response.r33[req.body.language] }); } }) }); // MARK: delete client router.delete('/deleteClient', (req, res) => { if (!req.body.client_id) { return res.status(400).json({ success: false, message: Response.r23[req.body.language], error_code: 'e16' }); } Client.remove({_id: req.body.client_id}, (err) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else { return res.status(200).json({ success: true, message: Response.r34[req.body.language] }); } }) }); // MARK: delete branch router.delete('/deleteEmployee', (req, res) => { if (!req.body.employee_id) { return res.status(400).json({ success: false, message: Response.r35[req.body.language], error_code: 'e22' }); } Employee.remove({_id: req.body.employee_id}, (err) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else { return res.status(200).json({ success: true, message: Response.r36[req.body.language] }); } }) }); // MARK: delete gift card router.delete('/deleteGiftCard', (req, res) => { if (!req.body.gift_card_id && !req.body.gift_card_number) { return res.status(400).json({ success: false, message: Response.r37[req.body.language], error_code: 'e24' }); } if (req.body.gift_card_id) { GiftCard.remove({_id: req.body.gift_card_id}, (err) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else { return res.status(200).json({ success: true, message: Response.r38[req.body.language] }); } }); } else if (req.body.gift_card_number) { GiftCard.remove({gift_card_number: req.body.gift_card_number}, (err) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else { return res.status(200).json({ success: true, message: Response.r38[req.body.language] }); } }) } }); // MARK: - Query // MARK: get merchants router.get('/getMerchants', (req, res) => { Merchant.find(req.query, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(200).json({ success: true, message: Response.r39[req.body.language] }); } else { var array = []; for (var i = 0; i { if (!req.query.merchant_id) { return res.status(400).json({ success: false, message: Response.r41[req.body.language], error_code: 'e25' }); } Branch.find(req.query, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(200).json({ success: true, message: Response.r42[req.body.language] }); } else { var array = []; for (var i = 0; i { Workstation.find(req.query, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(200).json({ success: true, message: Response.r44[req.body.language] }); } else { var array = []; for (var i = 0; i { if (!req.query.merchant_id) { return res.status(400).json({ success: false, message: Response.r41[req.body.language], error_code: 'e25' }); } Client.find(req.query, (err, doc) => { if (err) return res.status(500).send({ error: err }); else if (!doc) { return res.status(200).json({ success: true, message: Response.r46[req.body.language] }); } else { var array = []; for (var i = 0; i { var empty = true; for (var i in req.query) { empty = false; break; } if (empty) { return res.status(400).json({ success: false, message: Response.r48[req.body.language], error_code: 'e27' }) } Client.findOne(req.query, (err, doc) => { if (err) return res.status(500).send({ error: err }); else if (!doc) { return res.status(200).json({ success: false, message: Response.r46[req.body.language], error_code: 'e26' }); } else { res.locals.client = extractClient(doc); next(); } }); }, (req, res, next) => { GiftCard.find({client_id: res.locals.client.client_id}, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (doc) { var array = []; for (var i = 0; i { Transaction.find({client_id: res.locals.client.client_id}, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (doc) { var array = []; for (var i = 0; i { return res.status(200).json({ success: true, message: Response.r49[req.body.language], details: res.locals }) }); // MARK: get employees router.get('/getEmployees', (req, res) => { Employee.find(req.query, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(200).json({ success: true, message: Response.r50[req.body.language] }); } else { var array = []; for (var i = 0; i { GiftCard.find(req.query, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(200).json({ success: true, message: Response.r52[req.body.language] }); } else { var array = []; for (var i = 0; i { if (!req.query.gift_card_id && !req.query.gift_card_number) { return res.status(400).json({ success: false, message: Response.r37[req.body.language], error_code: 'e24' }) } else if (req.query.gift_card_id){ GiftCard.findOne({ _id: req.query.gift_card_id }, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r54[req.body.language], error_code: 'e28' }); } else { res.locals.balance = doc.balance; res.locals.points = doc.points; res.locals.merchant_id = doc.merchant_id, res.locals.branch_id = doc.branch_id; res.locals.client_id = doc.client_id; res.locals.gift_card_number = doc.gift_card_number; next(); } }); } else if (req.query.gift_card_number){ GiftCard.findOne({ gift_card_number: req.query.gift_card_number }, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r54[req.body.language], error_code: 'e28' }); } else { res.locals.balance = doc.balance; res.locals.points = doc.points; res.locals.merchant_id = doc.merchant_id, res.locals.branch_id = doc.branch_id; res.locals.client_id = doc.client_id; res.locals.gift_card_number = doc.gift_card_number; next(); } }); } }, (req, res, next) => { Merchant.findOne(res.locals.merchant_id, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r55[req.body.language], error_code: 'e29' }); } else { res.locals.merchant_name = doc.merchant_name; next(); } }); }, (req, res, next) => { Client.findOne(res.locals.client_id, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(400).json({ success: false, message: Response.r56[req.body.language], error_code: 'e30' }); } else { res.locals.client_name = doc.client_name; next(); } }); }, (req, res) => { Branch.findOne(res.locals.branch_id, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(200).json({ success: true, message: Response.r57[req.body.language], gift_card_number: res.locals.gift_card_number, client_name: res.locals.client_name, merchant_name: res.locals.merchant_name, branch_name: res.locals.merchant_name, balance: res.locals.balance, points: res.locals.points, }); } else { return res.status(200).json({ success: true, message: Response.r57[req.body.language], gift_card_number: res.locals.gift_card_number, client_name: res.locals.client_name, merchant_name: res.locals.merchant_name, branch_name: doc.branch_name, balance: res.locals.balance, points: res.locals.points, }); } }); }); // MARK: get transactions router.get('/getTransactions', (req, res) => { if (!req.query) { return res.status(400).json({ success: false, message: Response.r58[req.body.language], error_code: 'e31' }); } Transaction.find(req.query, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else if (!doc) { return res.status(200).json({ success: true, message: Response.r59[req.body.language] }); } else { var array = []; for (var i = 0; i