1 (function (angular
, $, _
) {
3 angular
.module('crmMailingAB2').factory('crmMailingABCriteria', function () {
4 // TODO Get data from server
6 '1': {value
: '1', name
: 'Subject lines', label
: ts('Test different "Subject" lines')},
7 '2': {value
: '2', name
: 'From names', label
: ts('Test different "From" lines')},
8 '3': {value
: '3', name
: 'Two different emails', label
: ts('Test entirely different emails')}
11 get: function get(value
) {
12 var r
= _
.where(values
, {value
: '' + value
});
13 return r
.length
> 0 ? r
[0] : null;
15 getAll
: function getAll() {
21 // CrmMailingAB is a data-model which combines an AB test (APIv3 "MailingAB"), three mailings (APIv3 "Mailing"),
22 // and three sets of attachments (APIv3 "Attachment").
25 // var abtest = new CrmMailingAB(123);
26 // abtest.load().then(function(){
27 // alert("Mailing A is named "+abtest.mailings.a.name);
29 angular
.module('crmMailingAB2').factory('CrmMailingAB', function (crmApi
, crmMailingMgr
, $q
, CrmAttachments
) {
30 function CrmMailingAB(id
) {
33 this.attachments
= {};
36 angular
.extend(CrmMailingAB
.prototype, {
37 // @return Promise CrmMailingAB
38 load
: function load() {
39 var crmMailingAB
= this;
40 if (!crmMailingAB
.id
) {
42 name
: 'Example', // FIXME
47 testing_criteria_id
: 1, // FIXME
48 winner_criteria_id
: null,
50 declare_winning_time
: null,
53 crmMailingAB
.mailings
.a
= crmMailingMgr
.create();
54 crmMailingAB
.mailings
.b
= crmMailingMgr
.create();
55 crmMailingAB
.mailings
.c
= crmMailingMgr
.create();
56 crmMailingAB
.attachments
.a
= new CrmAttachments(function () {
57 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
['mailing_id_a']};
59 crmMailingAB
.attachments
.b
= new CrmAttachments(function () {
60 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
['mailing_id_b']};
62 crmMailingAB
.attachments
.c
= new CrmAttachments(function () {
63 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
['mailing_id_c']};
67 dfr
.resolve(crmMailingAB
);
71 return crmApi('MailingAB', 'get', {id
: crmMailingAB
.id
})
72 .then(function (abResult
) {
73 crmMailingAB
.ab
= abResult
.values
[abResult
.id
];
74 return crmMailingAB
._loadMailings();
78 // @return Promise CrmMailingAB
79 save
: function save() {
80 var crmMailingAB
= this;
82 return crmMailingAB
._saveMailings()
84 return crmApi('MailingAB', 'create', crmMailingAB
.ab
)
85 .then(function (abResult
) {
86 crmMailingAB
.ab
.id
= abResult
.id
;
93 // Load mailings A, B, and C (if available)
94 // @return Promise CrmMailingAB
95 _loadMailings
: function _loadMailings() {
96 var crmMailingAB
= this;
98 _
.each(['a', 'b', 'c'], function (mkey
) {
99 if (crmMailingAB
.ab
['mailing_id_' + mkey
]) {
100 todos
[mkey
] = crmMailingMgr
.get(crmMailingAB
.ab
['mailing_id_' + mkey
])
101 .then(function (mailing
) {
102 crmMailingAB
.mailings
[mkey
] = mailing
;
103 crmMailingAB
.attachments
[mkey
] = new CrmAttachments(function () {
104 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
['mailing_id_' + mkey
]};
106 return crmMailingAB
.attachments
[mkey
].load();
110 crmMailingAB
.mailings
[mkey
] = crmMailingMgr
.create();
111 crmMailingAB
.attachments
[mkey
] = new CrmAttachments(function () {
112 return {entity_table
: 'civicrm_mailing', entity_id
: crmMailingAB
.ab
['mailing_id_' + mkey
]};
116 return $q
.all(todos
).then(function () {
120 // Save mailings A, B, and C (if available)
121 // @return Promise CrmMailingAB
122 _saveMailings
: function _saveMailings() {
123 var crmMailingAB
= this;
125 _
.each(['a', 'b', 'c'], function (mkey
) {
126 if (!crmMailingAB
.mailings
[mkey
]) {
129 if (crmMailingAB
.ab
['mailing_id_' + mkey
]) {
130 // paranoia: in case caller forgot to manage id on mailing
131 crmMailingAB
.mailings
[mkey
].id
= crmMailingAB
.ab
['mailing_id_' + mkey
];
133 todos
[mkey
] = crmMailingMgr
.save(crmMailingAB
.mailings
[mkey
])
135 crmMailingAB
.ab
['mailing_id_' + mkey
] = crmMailingAB
.mailings
[mkey
].id
;
136 return crmMailingAB
.attachments
[mkey
].save();
139 return $q
.all(todos
).then(function () {
148 })(angular
, CRM
.$, CRM
._
);