PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.10.2
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.10.2
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
acymailing / back / dynamics / subscription / SubscriptionAutomationConditions.php

SubscriptionAutomationConditions.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 10.10.2, at back/dynamics/subscription/SubscriptionAutomationConditions.php

289 lines 15.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 use AcyMailing\Classes\ListClass;
4
5 trait SubscriptionAutomationConditions
6 {
7 public function onAcymDeclareConditions(array &$conditions): void
8 {
9 $listClass = new ListClass();
10 $allLists = $listClass->getAllForSelect(false);
11 $listsWithAny = ['' => acym_translation('ACYM_ANY_LIST')] + $allLists;
12 $list = [
13 'type' => [
14 'sub' => acym_translation('ACYM_SUBSCRIBED'),
15 'unsub' => acym_translation('ACYM_UNSUBSCRIBED'),
16 'notsub' => acym_translation('ACYM_NO_SUBSCRIPTION_STATUS'),
17 'notcurrentsub' => acym_translation('ACYM_NOT_CURRENTLY_SUBSCRIBED'),
18 ],
19 'lists' => $listsWithAny,
20 'date' => [
21 'subscription_date' => acym_translation('ACYM_SUBSCRIPTION_DATE'),
22 'unsubscribe_date' => acym_translation('ACYM_UNSUBSCRIPTION_DATE'),
23 ],
24 ];
25
26 $conditions['user']['acy_list'] = new stdClass();
27 $conditions['user']['acy_list']->name = acym_translation('ACYM_ACYMAILING_LIST');
28
29 $conditions['user']['acy_list']->option = '<div class="intext_select_automation cell">';
30 $conditions['user']['acy_list']->option .= acym_select(
31 $list['type'],
32 'acym_condition[conditions][__numor__][__numand__][acy_list][action]',
33 null,
34 ['class' => 'intext_select_automation acym__select']
35 );
36 $conditions['user']['acy_list']->option .= '</div>';
37 $conditions['user']['acy_list']->option .= '<div class="intext_select_automation cell">';
38 $conditions['user']['acy_list']->option .= acym_select(
39 $list['lists'],
40 'acym_condition[conditions][__numor__][__numand__][acy_list][list]',
41 null,
42 ['class' => 'intext_select_automation acym__select']
43 );
44 $conditions['user']['acy_list']->option .= '</div><br>';
45 $conditions['user']['acy_list']->option .= '<div class="cell grid-x grid-margin-x">';
46 $conditions['user']['acy_list']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][acy_list][date-min]');
47 $conditions['user']['acy_list']->option .= '<span class="acym__title acym__title__secondary acym_vcenter margin-bottom-0 margin-left-1 margin-right-1"><</span>';
48 $conditions['user']['acy_list']->option .= '<div class="intext_select_automation">';
49 $conditions['user']['acy_list']->option .= acym_select(
50 $list['date'],
51 'acym_condition[conditions][__numor__][__numand__][acy_list][date-type]',
52 null,
53 ['class' => 'intext_select_automation acym__select cell']
54 );
55 $conditions['user']['acy_list']->option .= '</div>';
56 $conditions['user']['acy_list']->option .= '<span class="acym__title acym__title__secondary acym_vcenter margin-bottom-0 margin-left-1 margin-right-1"><</span>';
57 $conditions['user']['acy_list']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][acy_list][date-max]');
58 $conditions['user']['acy_list']->option .= '</div>';
59
60 $conditions['classic']['acy_list_all'] = new stdClass();
61 $conditions['classic']['acy_list_all']->name = acym_translation('ACYM_NUMBER_USERS_LIST');
62 $conditions['classic']['acy_list_all']->option = '<div class="cell shrink acym__automation__inner__text">'.acym_translation('ACYM_THERE_IS').'</div>';
63 $conditions['classic']['acy_list_all']->option .= '<div class="intext_select_automation cell">';
64 $conditions['classic']['acy_list_all']->option .= acym_select(
65 ['>' => acym_translation('ACYM_MORE_THAN'), '<' => acym_translation('ACYM_LESS_THAN'), '=' => acym_translation('ACYM_EXACTLY')],
66 'acym_condition[conditions][__numor__][__numand__][acy_list_all][operator]',
67 null,
68 ['class' => 'intext_select_automation acym__select']
69 );
70 $conditions['classic']['acy_list_all']->option .= '</div>';
71 $conditions['classic']['acy_list_all']->option .= '<input type="number" min="0" class="intext_input_automation cell" name="acym_condition[conditions][__numor__][__numand__][acy_list_all][number]">';
72 $conditions['classic']['acy_list_all']->option .= '<div class="cell shrink acym__automation__inner__text">'.acym_translation('ACYM_ACYMAILING_USERS').'</div>';
73 $listTypeAll = [
74 'sub' => acym_translation('ACYM_SUBSCRIBED'),
75 'unsub' => acym_translation('ACYM_UNSUBSCRIBED'),
76 'notsub' => acym_translation('ACYM_NO_SUBSCRIPTION_STATUS'),
77 ];
78 $conditions['classic']['acy_list_all']->option .= '<div class="cell grid-x grid-margin-x margin-left-0 margin-right-0"><div class="intext_select_automation cell">';
79 $conditions['classic']['acy_list_all']->option .= acym_select(
80 $listTypeAll,
81 'acym_condition[conditions][__numor__][__numand__][acy_list_all][action]',
82 null,
83 ['class' => 'intext_select_automation acym__select']
84 );
85 $conditions['classic']['acy_list_all']->option .= '</div>';
86 $conditions['classic']['acy_list_all']->option .= '<div class="intext_select_automation cell">';
87 $conditions['classic']['acy_list_all']->option .= acym_select(
88 $list['lists'],
89 'acym_condition[conditions][__numor__][__numand__][acy_list_all][list]',
90 null,
91 ['class' => 'intext_select_automation acym__select']
92 );
93 $conditions['classic']['acy_list_all']->option .= '</div></div>';
94 $conditions['classic']['acy_list_all']->option .= '<br><div class="cell grid-x grid-margin-x">';
95 $conditions['classic']['acy_list_all']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][acy_list_all][date-min]');
96 $conditions['classic']['acy_list_all']->option .= '<span class="acym__title acym__title__secondary acym_vcenter margin-bottom-0 margin-left-1 margin-right-1"><</span>';
97 $conditions['classic']['acy_list_all']->option .= '<div class="intext_select_automation">';
98 $conditions['classic']['acy_list_all']->option .= acym_select(
99 $list['date'],
100 'acym_condition[conditions][__numor__][__numand__][acy_list_all][date-type]',
101 null,
102 ['class' => 'intext_select_automation acym__select cell']
103 );
104 $conditions['classic']['acy_list_all']->option .= '</div>';
105 $conditions['classic']['acy_list_all']->option .= '<span class="acym__title acym__title__secondary acym_vcenter margin-bottom-0 margin-left-1 margin-right-1"><</span>';
106 $conditions['classic']['acy_list_all']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][acy_list_all][date-max]');
107 }
108
109 public function onAcymDeclareConditionsScenario(array &$conditions): void
110 {
111 $this->onAcymDeclareConditions($conditions);
112 }
113
114 private function processConditionAcyLists(&$query, &$options, $num)
115 {
116 $isAnyList = empty($options['list']);
117
118 $otherConditions = '';
119 if (!empty($options['date-min'])) {
120 $options['date-min'] = acym_replaceDate($options['date-min']);
121 if (!is_numeric($options['date-min'])) {
122 $options['date-min'] = strtotime($options['date-min']);
123 }
124 if (!empty($options['date-min'])) {
125 $otherConditions .= ' AND userlist'.$num.'.'.acym_secureDBColumn($options['date-type']).' > '.acym_escapeDB(acym_date($options['date-min'], 'Y-m-d H:i:s', false));
126 }
127 }
128 if (!empty($options['date-max'])) {
129 $options['date-max'] = acym_replaceDate($options['date-max']);
130 if (!is_numeric($options['date-max'])) {
131 $options['date-max'] = strtotime($options['date-max']);
132 }
133 if (!empty($options['date-max'])) {
134 $otherConditions .= ' AND userlist'.$num.'.'.acym_secureDBColumn($options['date-type']).' < '.acym_escapeDB(acym_date($options['date-max'], 'Y-m-d H:i:s', false));
135 }
136 }
137
138 if ($isAnyList) {
139 $standardListType = acym_escapeDB(ListClass::LIST_TYPE_STANDARD);
140
141 if (in_array($options['action'], ['notsub', 'notcurrentsub'])) {
142 $statusCondition = $options['action'] == 'notcurrentsub' ? 'userlist.status = 1 AND ' : '';
143 $subquery = 'SELECT userlist.user_id FROM #__acym_user_has_list AS userlist
144 INNER JOIN #__acym_list AS list ON userlist.list_id = list.id
145 WHERE '.$statusCondition.'list.type = '.$standardListType;
146 $query->where[] = 'user.id NOT IN ('.$subquery.')';
147 } else {
148 $status = $options['action'] === 'sub' ? '1' : '0';
149 $query->join['list'.$num] = '#__acym_user_has_list AS userlist'.$num.' ON user.id = userlist'.$num.'.user_id AND userlist'.$num.'.status = '.$status.$otherConditions;
150 $query->join['listtype'.$num] = '#__acym_list AS list'.$num.' ON userlist'.$num.'.list_id = list'.$num.'.id AND list'.$num.'.type = '.$standardListType;
151 }
152 } else {
153 $query->leftjoin['list'.$num] = '#__acym_user_has_list AS userlist'.$num.' ON user.id = userlist'.$num.'.user_id AND userlist'.$num.'.list_id = '.intval(
154 $options['list']
155 ).$otherConditions;
156 if ($options['action'] == 'notsub') {
157 $query->where[] = 'userlist'.$num.'.user_id IS NULL';
158 } elseif ($options['action'] === 'notcurrentsub') {
159 $query->where[] = '(userlist'.$num.'.user_id IS NULL OR userlist'.$num.'.status = 0)';
160 } else {
161 $status = $options['action'] == 'sub' ? '1' : '0';
162 $query->where[] = 'userlist'.$num.'.status = '.intval($status);
163 }
164 }
165
166 return $query->count();
167 }
168
169 public function onAcymProcessCondition_acy_list(&$query, &$options, $num, &$conditionNotValid)
170 {
171 $affectedRows = $this->processConditionAcyLists($query, $options, $num);
172 if (empty($affectedRows)) $conditionNotValid++;
173 }
174
175 public function onAcymProcessCondition_acy_list_all(&$query, &$options, $num, &$conditionNotValid)
176 {
177 $affectedRows = $this->processConditionAcyLists($query, $options, $num);
178
179 $res = false;
180 switch ($options['operator']) {
181 case '=':
182 $res = $affectedRows == $options['number'];
183 break;
184 case '>':
185 $res = $affectedRows > $options['number'];
186 break;
187 case '<':
188 $res = $affectedRows < $options['number'];
189 break;
190 }
191
192 if (!$res) {
193 $conditionNotValid++;
194 }
195 }
196
197 public function onAcymDeclareSummary_conditions(&$automation)
198 {
199 if (!empty($automation['acy_list_all'])) {
200 $operators = ['=' => acym_translation('ACYM_EXACTLY'), '>' => acym_translation('ACYM_MORE_THAN'), '<' => acym_translation('ACYM_LESS_THAN')];
201 $finalText = acym_translation('ACYM_THERE_IS').' '.acym_strtolower(
202 $operators[$automation['acy_list_all']['operator']]
203 ).' '.$automation['acy_list_all']['number'].' '.acym_translation('ACYM_ACYMAILING_USERS').' ';
204 $listClass = new ListClass();
205 $automation['acy_list_all']['list'] = $listClass->getOneById($automation['acy_list_all']['list'] ? : 0);
206 if (empty($automation['acy_list_all']['list'])) {
207 $automation = '<span class="acym__color__red">'.acym_translation('ACYM_SELECT_A_LIST').'</span>';
208
209 return;
210 }
211 if ($automation['acy_list_all']['action'] == 'sub') $automation['acy_list_all']['action'] = 'ACYM_SUBSCRIBED';
212 if ($automation['acy_list_all']['action'] == 'unsub') $automation['acy_list_all']['action'] = 'ACYM_UNSUBSCRIBED';
213 if ($automation['acy_list_all']['action'] == 'notsub') $automation['acy_list_all']['action'] = 'ACYM__NOT_SUBSCRIBED';
214 $finalText .= acym_translationSprintf(
215 'ACYM_CONDITION_ACY_LIST_SUMMARY',
216 acym_translation($automation['acy_list_all']['action']),
217 $automation['acy_list_all']['list']->name
218 ).' ';
219
220 $automation = $this->summaryDate($automation['acy_list_all'], $finalText);
221 }
222
223 $this->onAcymDeclareSummary_conditionsFilters(
224 $automation,
225 'ACYM_CONDITION_ACY_LIST_SUMMARY',
226 'ACYM_IS_SUBSCRIBED',
227 'ACYM_IS_UNSUBSCRIBED',
228 'ACYM_IS_NOT_SUBSCRIBED',
229 'ACYM_IS_NOT_CURRENTLY_SUBSCRIBED'
230 );
231 }
232
233 private function onAcymDeclareSummary_conditionsFilters(
234 &$automation,
235 string $key,
236 string $keySub,
237 string $keyUnsub,
238 string $keyNotSub,
239 string $keyNotCurrentSub
240 ): void {
241 if (!empty($automation['acy_list'])) {
242 $finalText = '';
243 $listClass = new ListClass();
244 $automation['acy_list']['list'] = $listClass->getOneById($automation['acy_list']['list'] ? : 0);
245
246 $listName = empty($automation['acy_list']['list'])
247 ? acym_translation('ACYM_ANY_LIST')
248 : $automation['acy_list']['list']->name;
249
250 if ($automation['acy_list']['action'] === 'sub') $automation['acy_list']['action'] = $keySub;
251 if ($automation['acy_list']['action'] === 'unsub') $automation['acy_list']['action'] = $keyUnsub;
252 if ($automation['acy_list']['action'] === 'notsub') $automation['acy_list']['action'] = $keyNotSub;
253 if ($automation['acy_list']['action'] === 'notcurrentsub') $automation['acy_list']['action'] = $keyNotCurrentSub;
254 $finalText .= acym_translationSprintf(
255 $key,
256 acym_translation($automation['acy_list']['action']),
257 $listName
258 ).' ';
259
260 $automation = $this->summaryDate($automation['acy_list'], $finalText);
261 }
262
263 if (!empty($automation['unconfirmed'])) {
264 $automation = acym_translation('ACYM_ACTION_UNCONFIRM');
265 }
266 }
267
268 private function summaryDate($automation, $finalText)
269 {
270 if (!empty($automation['date-min']) || !empty($automation['date-max'])) {
271 $finalText .= acym_translationSprintf('ACYM_WHERE_DATE_ACY_LIST_SUMMARY', acym_strtolower(acym_translation('ACYM_'.strtoupper($automation['date-type']))));
272
273 $dates = [];
274 if (!empty($automation['date-min'])) {
275 $automation['date-min'] = acym_replaceDate($automation['date-min']);
276 $dates[] = acym_translationSprintf('ACYM_WHERE_DATE_MIN_ACY_LIST_SUMMARY', acym_date($automation['date-min'], 'd M Y H:i'));
277 }
278 if (!empty($automation['date-max'])) {
279 $automation['date-max'] = acym_replaceDate($automation['date-max']);
280 $dates[] = acym_translationSprintf('ACYM_WHERE_DATE_MAX_ACY_LIST_SUMMARY', acym_date($automation['date-max'], 'd M Y H:i'));
281 }
282
283 $finalText .= ' '.implode(' '.acym_strtolower(acym_translation('ACYM_AND')).' ', $dates);
284 }
285
286 return $finalText;
287 }
288 }
289