CRM-15578 - crmMailingAB - Submit UI
[civicrm-core.git] / js / angular-crmMailingAB / services.js
index 7fe65355aa49b137c1b20b0384196c3abf74f6f5..fd656bf346c1bf9bde7fda3cde9711fbd626b767 100644 (file)
@@ -1,5 +1,23 @@
 (function (angular, $, _) {
 
+  // FIXME: surely there's already some helper which can do this in one line?
+  // @return string "YYYY-MM-DD hh:mm:ss"
+  var createNow = function () {
+    var currentdate = new Date();
+    var yyyy = currentdate.getFullYear();
+    var mm = currentdate.getMonth() + 1;
+    mm = mm < 10 ? '0' + mm : mm;
+    var dd = currentdate.getDate();
+    dd = dd < 10 ? '0' + dd : dd;
+    var hh = currentdate.getHours();
+    hh = hh < 10 ? '0' + hh : hh;
+    var min = currentdate.getMinutes();
+    min = min < 10 ? '0' + min : min;
+    var sec = currentdate.getSeconds();
+    sec = sec < 10 ? '0' + sec : sec;
+    return yyyy + "-" + mm + "-" + dd + " " + hh + ":" + min + ":" + sec;
+  };
+
   angular.module('crmMailingAB').factory('crmMailingABCriteria', function () {
     // TODO Get data from server
     var values = {
@@ -40,6 +58,7 @@
         if (!crmMailingAB.id) {
           crmMailingAB.ab = {
             name: 'Example', // FIXME
+            status: 'Draft',
             mailing_id_a: null,
             mailing_id_b: null,
             mailing_id_c: null,
@@ -70,6 +89,9 @@
         else {
           return crmApi('MailingAB', 'get', {id: crmMailingAB.id})
             .then(function (abResult) {
+              if (abResult.count != 1) {
+                throw "Failed to load AB Test";
+              }
               crmMailingAB.ab = abResult.values[abResult.id];
               return crmMailingAB._loadMailings();
             });
       // @return Promise CrmMailingAB
       save: function save() {
         var crmMailingAB = this;
-
         return crmMailingAB._saveMailings()
           .then(function () {
             return crmApi('MailingAB', 'create', crmMailingAB.ab)
             return crmMailingAB;
           });
       },
+      // Schedule the test
+      // @return Promise CrmMailingAB
+      // Note: Submission may cause the server state to change. Consider abtest.submit().then(abtest.load)
+      submit: function submit(newStatus) {
+        var crmMailingAB = this;
+        var params = {
+          id: this.id,
+          status: newStatus,
+          approval_date: createNow(),
+          scheduled_date: this.mailings.a.scheduled_date ? this.mailings.a.scheduled_date : createNow()
+        };
+        return crmApi('MailingAB', 'submit', params)
+          .then(function () {
+            return crmMailingAB;
+          });
+      },
+      // @param mailing Object (per APIv3)
+      // @return Promise
+      'delete': function () {
+        if (this.id) {
+          return crmApi('MailingAB', 'delete', {id: this.id});
+        }
+        else {
+          var d = $q.defer();
+          d.resolve();
+          return d.promise;
+        }
+      },
       // Load mailings A, B, and C (if available)
       // @return Promise CrmMailingAB
       _loadMailings: function _loadMailings() {
       _saveMailings: function _saveMailings() {
         var crmMailingAB = this;
         var todos = {};
+        var p = $q.when(true);
         _.each(['a', 'b', 'c'], function (mkey) {
           if (!crmMailingAB.mailings[mkey]) {
             return;
             // paranoia: in case caller forgot to manage id on mailing
             crmMailingAB.mailings[mkey].id = crmMailingAB.ab['mailing_id_' + mkey];
           }
-          todos[mkey] = crmMailingMgr.save(crmMailingAB.mailings[mkey])
-            .then(function () {
-              crmMailingAB.ab['mailing_id_' + mkey] = crmMailingAB.mailings[mkey].id;
-              return crmMailingAB.attachments[mkey].save();
-            });
+          p = p.then(function(){
+            return crmMailingMgr.save(crmMailingAB.mailings[mkey])
+              .then(function () {
+                crmMailingAB.ab['mailing_id_' + mkey] = crmMailingAB.mailings[mkey].id;
+                return crmMailingAB.attachments[mkey].save();
+              });
+          });
         });
-        return $q.all(todos).then(function () {
+        return p.then(function () {
           return crmMailingAB;
         });
       }