Create call tasks and opps for license requests

This commit is contained in:
Matt Lott 2016-06-23 06:12:51 -07:00
parent b8bdc0c726
commit 18de9ab298
3 changed files with 82 additions and 24 deletions

View file

@ -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: @

View file

@ -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()

View file

@ -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