1 (function (angular
, $, _
) {
3 function OptionGroup(values
) {
4 this.get = function get(value
) {
5 var r
= _
.where(values
, {value
: '' + value
});
6 return r
.length
> 0 ? r
[0] : null;
8 this.getByName
= function get(name
) {
9 var r
= _
.where(values
, {name
: '' + name
});
10 return r
.length
> 0 ? r
[0] : null;
12 this.getAll
= function getAll() {
17 angular
.module('crmMailingAB').factory('crmMailingABCriteria', function () {
18 // TODO Get data from server
20 '1': {value
: 'subject', name
: 'subject', label
: ts('Test different "Subject" lines')},
21 '2': {value
: 'from', name
: 'from', label
: ts('Test different "From" lines')},
22 '3': {value
: 'full_email', name
: 'full_email', label
: ts('Test entirely different emails')}
24 return new OptionGroup(values
);
27 angular
.module('crmMailingAB').factory('crmMailingABStatus', function () {
28 // TODO Get data from server
30 '1': {value
: '1', name
: 'Draft', label
: ts('Draft')},
31 '2': {value
: '2', name
: 'Testing', label
: ts('Testing')},
32 '3': {value
: '3', name
: 'Final', label
: ts('Final')}
34 return new OptionGroup(values
);
37 // CrmMailingAB is a data-model which combines an AB test (APIv3 "MailingAB"), three mailings (APIv3 "Mailing"),
38 // and three sets of attachments (APIv3 "Attachment").
41 // var abtest = new CrmMailingAB(123);
42 // abtest.load().then(function(){
43 // alert("Mailing A is named "+abtest.mailings.a.name);
45 angular
.module('crmMailingAB').factory('CrmMailingAB', function (crmApi
, crmMailingMgr
, $q
, CrmAttachments
) {
46 function CrmMailingAB(id
) {
49 this.attachments
= {};
52 angular
.extend(CrmMailingAB
.prototype, {
53 getAutosaveSignature: function() {
57 this.attachments
.a
.getAutosaveSignature(),
58 this.attachments
.b
.getAutosaveSignature(),
59 this.attachments
.c
.getAutosaveSignature()
62 // @return Promise CrmMailingAB
63 load
: function load() {
64 var crmMailingAB
= this;
65 if (!crmMailingAB
.id
) {
72 testing_criteria
: 'subject',
73 winner_criteria
: null,
75 declare_winning_time
: null,
78 var mailingDefaults
= {
79 // Most defaults provided by Mailing.create API, but we
80 // want to force-enable tracking.
83 mailing_type
:"experiment"
85 crmMailingAB
.mailings
.a
= crmMailingMgr
.create(mailingDefaults
);
86 crmMailingAB
.mailings
.b
= crmMailingMgr
.create(mailingDefaults
);
87 mailingDefaults
.mailing_type
= 'winner';
88 crmMailingAB
.mailings
.c
= crmMailingMgr
.create(mailingDefaults
);
89 crmMailingAB
.attachments
.a
= new CrmAttachments(function () {
90 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
.mailing_id_a
};
92 crmMailingAB
.attachments
.b
= new CrmAttachments(function () {
93 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
.mailing_id_b
};
95 crmMailingAB
.attachments
.c
= new CrmAttachments(function () {
96 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
.mailing_id_c
};
100 dfr
.resolve(crmMailingAB
);
104 return crmApi('MailingAB', 'get', {id
: crmMailingAB
.id
})
105 .then(function (abResult
) {
106 if (abResult
.count
!= 1) {
107 throw "Failed to load AB Test";
109 crmMailingAB
.ab
= abResult
.values
[abResult
.id
];
110 return crmMailingAB
._loadMailings();
114 // @return Promise CrmMailingAB
115 save
: function save() {
116 var crmMailingAB
= this;
117 return crmMailingAB
._saveMailings()
119 return crmApi('MailingAB', 'create', crmMailingAB
.ab
)
120 .then(function (abResult
) {
121 if (!crmMailingAB
.id
) {
122 crmMailingAB
.id
= crmMailingAB
.ab
.id
= abResult
.id
;
131 // @return Promise CrmMailingAB
132 // Note: Submission may cause the server state to change. Consider abtest.submit().then(...abtest.load()...)
133 submitTest
: function submitTest() {
134 var crmMailingAB
= this;
138 approval_date
: 'now',
139 scheduled_date
: this.mailings
.a
.scheduled_date
? this.mailings
.a
.scheduled_date
: 'now'
141 return crmApi('MailingAB', 'submit', params
)
143 return crmMailingAB
.load();
146 // Schedule the final mailing
147 // @return Promise CrmMailingAB
148 // Note: Submission may cause the server state to change. Consider abtest.submit().then(...abtest.load()...)
149 submitFinal
: function submitFinal(winner_id
) {
150 var crmMailingAB
= this;
154 winner_id
: winner_id
,
155 approval_date
: 'now',
156 scheduled_date
: this.mailings
.c
.scheduled_date
? this.mailings
.c
.scheduled_date
: 'now'
158 return crmApi('MailingAB', 'submit', params
)
160 return crmMailingAB
.load();
163 // @param mailing Object (per APIv3)
165 'delete': function () {
167 return crmApi('MailingAB', 'delete', {id
: this.id
});
175 // Load mailings A, B, and C (if available)
176 // @return Promise CrmMailingAB
177 _loadMailings
: function _loadMailings() {
178 var crmMailingAB
= this;
180 _
.each(['a', 'b', 'c'], function (mkey
) {
181 if (crmMailingAB
.ab
['mailing_id_' + mkey
]) {
182 todos
[mkey
] = crmMailingMgr
.get(crmMailingAB
.ab
['mailing_id_' + mkey
])
183 .then(function (mailing
) {
184 crmMailingAB
.mailings
[mkey
] = mailing
;
185 crmMailingAB
.attachments
[mkey
] = new CrmAttachments(function () {
186 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
['mailing_id_' + mkey
]};
188 return crmMailingAB
.attachments
[mkey
].load();
192 crmMailingAB
.mailings
[mkey
] = crmMailingMgr
.create();
193 crmMailingAB
.attachments
[mkey
] = new CrmAttachments(function () {
194 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
['mailing_id_' + mkey
]};
198 return $q
.all(todos
).then(function () {
202 // Save mailings A, B, and C (if available)
203 // @return Promise CrmMailingAB
204 _saveMailings
: function _saveMailings() {
205 var crmMailingAB
= this;
207 var p
= $q
.when(true);
208 _
.each(['a', 'b', 'c'], function (mkey
) {
209 if (!crmMailingAB
.mailings
[mkey
]) {
212 if (crmMailingAB
.ab
['mailing_id_' + mkey
]) {
213 // paranoia: in case caller forgot to manage id on mailing
214 crmMailingAB
.mailings
[mkey
].id
= crmMailingAB
.ab
['mailing_id_' + mkey
];
216 p
= p
.then(function(){
217 return crmMailingMgr
.save(crmMailingAB
.mailings
[mkey
])
219 crmMailingAB
.ab
['mailing_id_' + mkey
] = crmMailingAB
.mailings
[mkey
].id
;
220 return crmMailingAB
.attachments
[mkey
].save();
224 return p
.then(function () {
233 })(angular
, CRM
.$, CRM
._
);