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 / birthday / BirthdayAutomationTriggers.php

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

233 lines 8.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 trait BirthdayAutomationTriggers
4 {
5 private $dataSources = [];
6
7 public function onAcymDefineUserStatusCheckTriggers(&$triggers)
8 {
9 $triggers[] = 'on_birthday';
10 }
11
12 public function onAcymDeclareTriggers(&$triggers, &$defaultValues)
13 {
14 $dataSources = [];
15 acym_trigger('onAcymDeclareDataSourcesBirthdayTrigger', [&$dataSources]);
16
17 $this->dataSources = $dataSources;
18
19 $sourceOptions = [];
20
21 $defaultSource = empty($defaultValues['on_birthday']['source']) ? 'acymailing' : $defaultValues['on_birthday']['source'];
22 $defaultField = empty($defaultValues['on_birthday']['field']) ? '' : $defaultValues['on_birthday']['field'];
23 $defaultDayBefore = empty($defaultValues['on_birthday']['day_before']) ? '0' : $defaultValues['on_birthday']['day_before'];
24 $defaultBeforeHour = empty($defaultValues['on_birthday']['hour']) ? '12' : $defaultValues['on_birthday']['hour'];
25 $defaultBeforeMinutes = empty($defaultValues['on_birthday']['minutes']) ? '00' : $defaultValues['on_birthday']['minutes'];
26
27 foreach ($this->dataSources as $key => $oneSource) {
28 $sourceOptions[] = acym_selectOption($key, $oneSource['source_name']);
29 }
30
31 $triggers['user']['on_birthday'] = new stdClass();
32 $triggers['user']['on_birthday']->name = acym_translation('ACYM_ON_USER_BIRTHDAY');
33
34 $hour = [];
35 $minutes = [];
36 $i = 0;
37 while ($i <= 59) {
38 $j = $i < 10 ? '0'.$i : $i;
39 if ($i <= 23) {
40 $hour[$j] = $j;
41 }
42 $minutes[$j] = $j;
43 $i++;
44 }
45
46 $option = '<div class="grid-x grid-margin-x grid-margin-y">
47 <div class="cell grid-x">
48 <div class="cell medium-shrink" style="display: none">
49 '.acym_translation('ACYM_SOURCE').' : ';
50
51 $option .= acym_select(
52 $sourceOptions,
53 '[triggers][user][on_birthday][source]',
54 $defaultSource,
55 ['data-class' => 'intext_select acym__select']
56 );
57 $option .= '
58 </div>
59 </div>';
60
61 if (empty($this->dataSources[$defaultSource]['fields']) && !empty($this->dataSources[$defaultSource]['no_fields_error_message'])) {
62 $option .= '<div class="cell grid-x"><span class="cell small-1 vertical-align-middle"><i class="acymicon-exclamation-circle acym__color__orange"></i></span><span class="cell small-11"><b>'.acym_translation(
63 $this->dataSources[$defaultSource]['no_fields_error_message']
64 ).'</b></span></div>';
65 } else {
66 $option .= '<div class="cell grid-x">
67 <div class="cell medium-shrink">
68 '.acym_translation('ACYM_FIELD').' : ';
69 $fieldsOption = $this->getFieldsForTable('acymailing');
70
71 $option .= acym_select(
72 $fieldsOption,
73 '[triggers][user][on_birthday][field]',
74 $defaultField,
75 ['data-class' => 'intext_select acym__select']
76 );
77
78 $hourSelector = acym_select(
79 $hour,
80 '[triggers][user][on_birthday][hour]',
81 $defaultBeforeHour,
82 ['data-class' => 'intext_select acym__select']
83 );
84 $minuteSelector = acym_select(
85 $minutes,
86 '[triggers][user][on_birthday][minutes]',
87 $defaultBeforeMinutes,
88 ['data-class' => 'intext_select acym__select']
89 );
90
91 $option .= '
92 </div>
93 </div>
94 <div class="cell grid-x">
95 <div class="cell auto word-break acym__automation__trigger__action__birthday">
96 '.acym_translationSprintf(
97 'ACYM_TRIGGER_EVENT_BEFORE_BIRTHDAY',
98 '<input type="number" name="[triggers][user][on_birthday][day_before]" class="intext_input" min="0" value="'.acym_escape($defaultDayBefore).'">',
99 $hourSelector,
100 $minuteSelector
101 ).'
102 </div>
103 </div>
104 <span class="cell margin-top-1 acym__color__dark-gray word-break">'.acym_translation('ACYM_BIRTHDAY_TRIGGER_INFO').'</span>';
105 }
106
107 $option .= '</div>';
108
109 $triggers['user']['on_birthday']->option = $option;
110 }
111
112 public function onAcymDeclareTriggersScenario(&$triggers, &$defaultValues)
113 {
114 $this->onAcymDeclareTriggers($triggers, $defaultValues);
115 }
116
117 public function onAcymExecuteTrigger(&$step, &$execute, &$data)
118 {
119 if (!empty($step->next_execution) && $step->next_execution > $data['time']) {
120 return;
121 }
122
123 $triggers = $step->triggers;
124
125 if (empty($triggers['on_birthday'])) return;
126
127 $sourceName = $triggers['on_birthday']['source'];
128 $fieldId = $triggers['on_birthday']['field'];
129 $dayBefore = $triggers['on_birthday']['day_before'];
130 $hour = $triggers['on_birthday']['hour'];
131 $minutes = $triggers['on_birthday']['minutes'];
132
133 $dateNowWithTimeZone = acym_date('now', 'Y-m-d h:i:s');
134 $now = new DateTime($dateNowWithTimeZone);
135 $triggerDate = new DateTime($dateNowWithTimeZone);
136
137 $triggerDate->setTime($hour, $minutes);
138
139 if (!empty($now->date) && !empty($triggerDate->date) && $now->date < $triggerDate->date) {
140 $step->next_execution = acym_getTime('today '.$hour.':'.$minutes);
141
142 return;
143 } else {
144 $step->next_execution = acym_getTime('tomorrow '.$hour.':'.$minutes);
145 }
146
147 $dataSources = [];
148 acym_trigger('onAcymDeclareDataSourcesBirthdayTrigger', [&$dataSources]);
149
150 $this->dataSources = $dataSources;
151
152 $format = '';
153 $query = '';
154
155 if (empty($this->dataSources[$sourceName]['fields'])) return;
156
157 foreach ($this->dataSources[$sourceName]['fields'] as $oneField) {
158 if ($oneField['id'] === $fieldId) {
159 $format = $oneField['format'];
160 $query = $oneField['query'];
161 }
162 }
163
164 if (empty($format) || empty($query)) return;
165
166 $users = acym_loadObjectList($query);
167
168 if (empty($users)) return;
169
170 foreach ($users as $oneUser) {
171 if (empty($oneUser->date)) continue;
172
173 $userBirthday = DateTime::createFromFormat($format, $oneUser->date);
174 if (empty($userBirthday)) continue;
175
176 $userBirthday->sub(new DateInterval('P'.$dayBefore.'D'));
177
178 if ($now->format('m-d') === $userBirthday->format('m-d')) {
179 $execute = true;
180 $data['userIds'][] = $oneUser->user_id;
181 }
182 }
183 }
184
185 protected function getFieldsForTable($dataSource): array
186 {
187 if (empty($this->dataSources[$dataSource]['fields'])) return [];
188
189 $fieldsOption = [];
190 foreach ($this->dataSources[$dataSource]['fields'] as $oneField) {
191 $fieldsOption[] = acym_selectOption($oneField['id'], $oneField['name']);
192 }
193
194 return $fieldsOption;
195 }
196
197 public function onAcymDeclareSummary_triggers(object $automation): void
198 {
199 if (empty($automation->triggers['on_birthday']['source'])) {
200 return;
201 }
202
203 $dataSources = [];
204 acym_trigger('onAcymDeclareDataSourcesBirthdayTrigger', [&$dataSources]);
205
206 if (
207 empty($dataSources[$automation->triggers['on_birthday']['source']]['fields'])
208 && !empty($dataSources[$automation->triggers['on_birthday']['source']]['no_fields_error_message'])
209 ) {
210 $automation->triggers['on_birthday'] = acym_translation($dataSources[$automation->triggers['on_birthday']['source']]['no_fields_error_message']);
211
212 return;
213 }
214
215 $fieldToDisplay = [];
216 foreach ($dataSources[$automation->triggers['on_birthday']['source']]['fields'] as $field) {
217 if ($field['id'] != $automation->triggers['on_birthday']['field']) continue;
218 $fieldToDisplay = $field;
219 }
220
221 $date = empty($automation->triggers['on_birthday']['day_before'])
222 ? acym_translation('ACYM_ON_USER_BIRTHDAY')
223 : acym_translationSprintf(
224 'ACYM_X_DAYS_BEFORE_BIRTHDAY',
225 $automation->triggers['on_birthday']['day_before']
226 );
227 $time = acym_translationSprintf('ACYM_AT_DATE_TIME', $automation->triggers['on_birthday']['hour'], $automation->triggers['on_birthday']['minutes']);
228 $end = acym_translationSprintf('ACYM_FOR_THE_X_FIELD_X', $dataSources[$automation->triggers['on_birthday']['source']]['source_name'], $fieldToDisplay['name']);
229
230 $automation->triggers['on_birthday'] = $date.' '.$time.' '.$end;
231 }
232 }
233