'use strict'; const Merchant = require('mongoose').model('Merchant'); const Branch = require('mongoose').model('Branch'); const GiftCard = require('mongoose').model('GiftCard'); const Response = require('../etc/responses.json'); /* * Gather date, merchant_id, branch_id and gift card sequence * to generate a gift_card_number */ module.exports = (req, res, next) => { getMerchantNumber(req, res); } // MARK: get merchant number function getMerchantNumber(req, res) { // Merchant number Merchant.findOne({ _id: req.body.merchant_id }, (err, doc) => { if (err || !doc) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); else { // Make sure the merchant number always has 3 digits var numberString = doc.number.toString(); if (numberString.length === 1) { numberString = "00" + numberString; } else if (numberString.length === 2) { numberString = "0" + numberString; } req.body.merchant_number = numberString; req.body.merchant_name = doc.merchant_name; getBranchNumber(req, res); } }); } // MARK: get branch number function getBranchNumber(req, res) { // Branch number Branch.findOne({ _id: req.body.branch_id }, (err, doc) => { if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (!doc) { // This Merchant has only the main office, no branches. req.body.branch_number = req.body.merchant_id; req.body.branch_number = "00"; req.body.branch_name = req.body.merchant_name; } else { // Make sure the branch number always has 2 digits var numberString = doc.number.toString(); if (numberString.length === 1) { numberString = "0" + numberString; } req.body.branch_number = numberString; req.body.branch_name = doc.branch_name; } generateCardNumber(req, res); }); } // MARK: generate card number function generateCardNumber(req, res) { // Get date var d = new Date(); var year = d.getFullYear().toString().substr(-2); var month = (d.getMonth() + 1).toString(); if (month.length === 1) { month = "0" + month; } var day = d.getDate().toString(); if (day.length === 1) { day = "0" + day; } // Get next available card number GiftCard.findOne({ merchant_id: req.body.merchant_id, branch_id: req.body.branch_id }).sort({ number: -1 }).limit(1).exec((err, doc) => { var numberString; if (err) return res.status(500).json({ success: false, message: Response.r0[req.body.language], error_code: 'e0' }); if (!doc) { req.body.number = 1; numberString = '1'; } else { req.body.number = doc.number + 1; numberString = req.body.number.toString(); } // Make sure the card number always has 4 digits if (numberString.length === 1) { numberString = "000" + numberString; } else if (numberString.length === 2) { numberString = "00" + numberString; } else if (numberString.length === 3) { numberString = "0" + numberString; } // Trim numbers with more than 4 digits. The date components will guarantee the cardNumber uniqueness. else if (numberString.length >= 4) { numberString = numberString.slice(-4); } // Finally compose complete card number const cardNumber = year + month + day + req.body.merchant_number + req.body.branch_number + numberString req.body.gift_card_number = cardNumber; addGiftCard(req, res); }); } // MARK: add gift card function addGiftCard(req, res) { req.body.balance = 0; req.body.points = 0; var msg; if (res.locals.fromAddClient) { msg = Response.r78[req.body.language]; } else { msg = Response.r79[req.body.language]; } var newGiftCard = new GiftCard(req.body); newGiftCard.save((err, doc) => { if (err) { // Gift card number not unique due to simultaneous creation console.log('Gift card number not unique due to simultaneous creation. New number assigned automatically.'); const number = Number(req.body.gift_card_number) + 1; req.body.gift_card_number = number.toString(); newGiftCard = new GiftCard(req.body); newGiftCard.save((err2, doc2) => { if (err2) { return res.status(400).json({ success: false, message: Response.r80[req.body.language], error: 'e32' }); } else { return res.status(200).json({ success: true, message: msg, client_name: req.body.client_name, client_id: req.body.client_id, gift_card_number: doc2.gift_card_number, merchant_name: req.body.merchant_name, branch_name: req.body.branch_name, balance: doc2.balance, points: doc2.points }); } }) } else { return res.status(200).json({ success: true, message: msg, client_name: req.body.client_name, client_id: req.body.client_id, gift_card_number: doc.gift_card_number, merchant_name: req.body.merchant_name, branch_name: req.body.branch_name, balance: doc.balance, points: doc.points }); } }); }