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