From 18de9ab2989d58037ae988ba3f48759b10eb4e25 Mon Sep 17 00:00:00 2001 From: Matt Lott <mattlott@live.com> Date: Thu, 23 Jun 2016 06:12:51 -0700 Subject: [PATCH] Create call tasks and opps for license requests --- .../teachers/TeachersContactModal.coffee | 2 +- server/lib/closeIO.coffee | 82 +++++++++++++++---- server/routes/contact.coffee | 22 +++-- 3 files changed, 82 insertions(+), 24 deletions(-) diff --git a/app/views/teachers/TeachersContactModal.coffee b/app/views/teachers/TeachersContactModal.coffee index ab8fbf06b..52d4488c7 100644 --- a/app/views/teachers/TeachersContactModal.coffee +++ b/app/views/teachers/TeachersContactModal.coffee @@ -62,7 +62,7 @@ module.exports = class TeachersContactModal extends ModalView return unless _.isEmpty(formErrors) @state.set('sendingState', 'sending') - data = _.extend({ country: me.get('country'), recipientID: 'schools@codecombat.com' }, formValues) + data = _.extend({ country: me.get('country') }, formValues) contact.send({ data context: @ diff --git a/server/lib/closeIO.coffee b/server/lib/closeIO.coffee index c72c4b8c4..8de1f78fa 100644 --- a/server/lib/closeIO.coffee +++ b/server/lib/closeIO.coffee @@ -66,33 +66,81 @@ module.exports = return done("Unexpected activities format: " + body) unless activities.data? for activity in activities.data when activity._type is 'Email' if /@codecombat\.(?:com)|(?:nl)/ig.test(activity.sender) and not activity.sender?.indexOf(config.mail.username) >= 0 - return done(null, activity.sender, lead.id) + return done(null, activity.sender, activity.user_id, lead.id) return done(null, config.mail.supportSchools, lead.id) catch error log.error("closeIO.getSalesContactEmail Error for #{email}: #{JSON.stringify(error)}") return done(error) - sendMail: (fromAddress, subject, content, done) -> + sendMail: (fromAddress, subject, content, salesContactEmail, leadID, done) -> # log.info("DEBUG: closeIO.sendMail #{fromAddress} #{subject} #{content}") - @getSalesContactEmail fromAddress, (err, salesContactEmail, leadID) -> - return done("Error getting sales contact for #{fromAddress}: #{err}") if err - matches = salesContactEmail.match(/^[a-zA-Z_]+ <(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3})>$|(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3})/i) - salesContactEmail = matches?[1] ? matches?[2] ? config.mail.supportSchools - salesContactEmail = config.mail.supportSchools if salesContactEmail?.indexOf('brian@codecombat.com') >= 0 + matches = salesContactEmail.match(/^[a-zA-Z_]+ <(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3})>$|(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3})/i) + salesContactEmail = matches?[1] ? matches?[2] ? config.mail.supportSchools + salesContactEmail = config.mail.supportSchools if salesContactEmail?.indexOf('brian@codecombat.com') >= 0 + + postData = + to: [salesContactEmail] + sender: config.mail.username + subject: subject + body_text: content + lead_id: leadID + status: 'outbox' + options = + uri: "https://#{apiKey}:X@app.close.io/api/v1/activity/email/" + body: JSON.stringify(postData) + request.post options, (error, response, body) => + return done(error) if error + result = JSON.parse(body) + if result.errors or result['field-errors'] + errorMessage = "Close.io Send email POST error for #{fromAddress} #{JSON.stringify(result.errors)} #{JSON.stringify(result['field-errors'])}" + return done(errorMessage) + return done() + + processLicenseRequest: (teacherEmail, userID, leadID, licensesRequested, amount, done) -> + # Update lead with licenses requested + putData = 'custom.licensesRequested': licensesRequested + options = + uri: "https://#{apiKey}:X@app.close.io/api/v1/lead/#{leadID}/" + body: JSON.stringify(putData) + request.put options, (error, response, body) => + return done(error) if error + result = JSON.parse(body) + if result.errors or result['field-errors'] + errorMessage = "Update Close.io lead PUT error for #{teacherEmail} #{leadID}" + return done(errorMessage) + + # Create call task postData = - to: [salesContactEmail] - sender: config.mail.username - subject: subject - body_text: content + _type: "lead" lead_id: leadID - status: 'outbox' + assigned_to: userID + text: "Call #{teacherEmail}" + is_complete: false options = - uri: "https://#{apiKey}:X@app.close.io/api/v1/activity/email/" + uri: "https://#{apiKey}:X@app.close.io/api/v1/task/" body: JSON.stringify(postData) request.post options, (error, response, body) => - return done(error) if error - result = JSON.parse(body); + return done(error) if error + result = JSON.parse(body) if result.errors or result['field-errors'] - errorMessage = "Close.io Send email POST error for #{fromAddress} #{JSON.stringify(result.errors)} #{JSON.stringify(result['field-errors'])}"; + errorMessage = "Create Close.io call task POST error for #{teacherEmail} #{leadID}" return done(errorMessage) - return done() + + # Create opportunity + postData = + note: "#{licensesRequested} licenses requested" + confidence: 5 + lead_id: leadID + status: 'Active' + value: parseInt(licensesRequested) * amount + value_period: "annual" + options = + uri: "https://#{apiKey}:X@app.close.io/api/v1/opportunity/" + body: JSON.stringify(postData) + request.post options, (error, response, body) => + return done(error) if error + result = JSON.parse(body) + if result.errors or result['field-errors'] + errorMessage = "Create Close.io opportunity POST error for #{teacherEmail} #{leadID}" + return done(errorMessage) + return done() diff --git a/server/routes/contact.coffee b/server/routes/contact.coffee index f391a9050..8cbf51dbe 100644 --- a/server/routes/contact.coffee +++ b/server/routes/contact.coffee @@ -3,8 +3,9 @@ log = require 'winston' User = require '../models/User' sendwithus = require '../sendwithus' async = require 'async' -LevelSession = require '../models/LevelSession' moment = require 'moment' +LevelSession = require '../models/LevelSession' +Product = require '../models/Product' closeIO = require '../lib/closeIO' module.exports.setup = (app) -> @@ -13,10 +14,19 @@ module.exports.setup = (app) -> # log.info "Sending mail from #{req.body.email} saying #{req.body.message}" fromAddress = req.body.sender or req.body.email or req.user.get('email') createMailContent req, fromAddress, (subject, content) -> - if req.body.recipientID is 'schools@codecombat.com' or req.user.isTeacher() - req.user.update({$set: { enrollmentRequestSent: true }}).exec(_.noop) if req.body.recipientID is 'schools@codecombat.com' - closeIO.sendMail fromAddress, subject, content, (err) -> - log.error "Error sending contact form email via Close.io: #{err.message or err}" if err + if req.body.licensesNeeded or req.user.isTeacher() + closeIO.getSalesContactEmail fromAddress, (err, salesContactEmail, userID, leadID) -> + return log.error("Error getting sales contact for #{fromAddress}: #{err.message or err}") if err + closeIO.sendMail fromAddress, subject, content, salesContactEmail, leadID, (err) -> + return log.error("Error sending contact form email via Close.io: #{err.message or err}") if err + if licensesNeeded = req.body.licensesNeeded + Product.findOne({name: 'course'}).exec (err, product) => + return log.error(err) if err + return log.error('course product not found') if not product + amount = product.get('amount') + closeIO.processLicenseRequest fromAddress, userID, leadID, licensesNeeded, amount, (err) -> + return log.error("Error processing license request via Close.io: #{err.message or err}") if err + req.user.update({$set: { enrollmentRequestSent: true }}).exec(_.noop) else createSendWithUsContext req, fromAddress, subject, content, (context) -> sendwithus.api.send context, (err, result) -> @@ -53,7 +63,7 @@ createSendWithUsContext = (req, fromAddress, subject, content, done) -> premium = user?.isPremium() teacher = user?.isTeacher() - if recipientID is 'schools@codecombat.com' or teacher + if teacher or req.body.licensesNeeded return done("Tried to send a teacher contact us email via sendwithus #{fromAddress} #{subject}") toAddress = switch