(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"),
// 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 = {};
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;
});
}