Merge pull request #5047 from colemanw/CRM-15898
[civicrm-core.git] / js / angular-crmMailingAB / services.js
index becabe19fae5adccdf92f04fb052e3340897dfdb..e23c905b1feab15f1aedd091497d84679e1bdc1e 100644 (file)
@@ -1,5 +1,19 @@
 (function (angular, $, _) {
 
+  function OptionGroup(values) {
+    this.get = function get(value) {
+      var r = _.where(values, {value: '' + value});
+      return r.length > 0 ? r[0] : null;
+    };
+    this.getByName = function get(name) {
+      var r = _.where(values, {name: '' + name});
+      return r.length > 0 ? r[0] : null;
+    };
+    this.getAll = function getAll() {
+      return values;
+    };
+  }
+
   angular.module('crmMailingAB').factory('crmMailingABCriteria', function () {
     // TODO Get data from server
     var values = {
       '2': {value: '2', name: 'From names', label: ts('Test different "From" lines')},
       '3': {value: '3', name: 'Two different emails', label: ts('Test entirely different emails')}
     };
-    return {
-      get: function get(value) {
-        var r = _.where(values, {value: '' + value});
-        return r.length > 0 ? r[0] : null;
-      },
-      getAll: function getAll() {
-        return values;
-      }
+    return new OptionGroup(values);
+  });
+
+  angular.module('crmMailingAB').factory('crmMailingABStatus', function () {
+    // TODO Get data from server
+    var values = {
+      '1': {value: '1', name: 'Draft', label: ts('Draft')},
+      '2': {value: '2', name: 'Testing', label: ts('Testing')},
+      '3': {value: '3', name: 'Final', label: ts('Final')}
     };
+    return new OptionGroup(values);
   });
 
   // CrmMailingAB is a data-model which combines an AB test (APIv3 "MailingAB"), three mailings (APIv3 "Mailing"),
@@ -26,7 +42,7 @@
   //   abtest.load().then(function(){
   //     alert("Mailing A is named "+abtest.mailings.a.name);
   //   });
-  angular.module('crmMailingAB').factory('CrmMailingAB', function (crmApi, crmMailingMgr, $q, CrmAttachments) {
+  angular.module('crmMailingAB').factory('CrmMailingAB', function (crmApi, crmMailingMgr, $q, CrmAttachments, crmNow) {
     function CrmMailingAB(id) {
       this.id = id;
       this.mailings = {};
@@ -40,6 +56,7 @@
         if (!crmMailingAB.id) {
           crmMailingAB.ab = {
             name: 'Example', // FIXME
+            status: 'Draft',
             mailing_id_a: null,
             mailing_id_b: null,
             mailing_id_c: null,
           crmMailingAB.mailings.b = crmMailingMgr.create();
           crmMailingAB.mailings.c = crmMailingMgr.create();
           crmMailingAB.attachments.a = new CrmAttachments(function () {
-            return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab['mailing_id_a']};
+            return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab.mailing_id_a};
           });
           crmMailingAB.attachments.b = new CrmAttachments(function () {
-            return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab['mailing_id_b']};
+            return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab.mailing_id_b};
           });
           crmMailingAB.attachments.c = new CrmAttachments(function () {
-            return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab['mailing_id_c']};
+            return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab.mailing_id_c};
           });
 
           var dfr = $q.defer();
       // @return Promise CrmMailingAB
       save: function save() {
         var crmMailingAB = this;
-
         return crmMailingAB._saveMailings()
           .then(function () {
             return crmApi('MailingAB', 'create', crmMailingAB.ab)
               .then(function (abResult) {
-                crmMailingAB.ab.id = abResult.id;
+                crmMailingAB.id = crmMailingAB.ab.id = abResult.id;
               });
           })
           .then(function () {
             return crmMailingAB;
           });
       },
+      // Schedule the test
+      // @return Promise CrmMailingAB
+      // Note: Submission may cause the server state to change. Consider abtest.submit().then(...abtest.load()...)
+      submitTest: function submitTest() {
+        var crmMailingAB = this;
+        var params = {
+          id: this.ab.id,
+          status: 'Testing',
+          approval_date: crmNow(),
+          scheduled_date: this.mailings.a.scheduled_date ? this.mailings.a.scheduled_date : crmNow()
+        };
+        return crmApi('MailingAB', 'submit', params)
+          .then(function () {
+            return crmMailingAB;
+          });
+      },
+      // Schedule the final mailing
+      // @return Promise CrmMailingAB
+      // Note: Submission may cause the server state to change. Consider abtest.submit().then(...abtest.load()...)
+      submitFinal: function submitFinal() {
+        var crmMailingAB = this;
+        var params = {
+          id: this.ab.id,
+          status: 'Final',
+          approval_date: crmNow(),
+          scheduled_date: this.mailings.c.scheduled_date ? this.mailings.c.scheduled_date : crmNow()
+        };
+        return crmApi('MailingAB', 'submit', params)
+          .then(function () {
+            return crmMailingAB;
+          });
+      },
       // @param mailing Object (per APIv3)
       // @return Promise
       'delete': function () {
       _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;
         });
       }