PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.0.0
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.0.0
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 / Helpers / MigrationHelper.php

MigrationHelper.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 11.0.0, at back/Helpers/MigrationHelper.php

1,459 lines 55.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace AcyMailing\Helpers;
4
5 use AcyMailing\Classes\CampaignClass;
6 use AcyMailing\Classes\FieldClass;
7 use AcyMailing\Classes\FollowupClass;
8 use AcyMailing\Classes\ListClass;
9 use AcyMailing\Classes\MailboxClass;
10 use AcyMailing\Classes\MailClass;
11 use AcyMailing\Core\AcymObject;
12
13 class MigrationHelper extends AcymObject
14 {
15 private array $errors = [];
16 private array $result = [
17 'isOk' => true,
18 'errorInsert' => false,
19 'errorClean' => false,
20 'count' => 0,
21 ];
22
23 public function preMigration(string $element): array
24 {
25 $connection = [
26 'config' => ['table' => 'config', 'where' => ''],
27 'templates' => ['table' => 'template', 'where' => ''],
28 'mails' => ['table' => 'mail', 'where' => ''],
29 'lists' => ['table' => 'list', 'where' => ''],
30 'users' => ['table' => 'subscriber', 'where' => ''],
31 'bounce' => ['table' => 'rules', 'where' => ''],
32 'distrib' => ['table' => 'action', 'where' => ''],
33 'subscriptions' => ['table' => 'listsub', 'where' => ''],
34 'mailhaslists' => ['table' => 'listmail', 'where' => ''],
35 'mailstats' => ['table' => 'stats', 'where' => ''],
36 'welcomeunsub' => ['table' => 'list', 'where' => 'unsubmailid IS NOT NULL OR welmailid IS NOT NULL'],
37 'users_fields' => ['table' => 'subscriber'],
38 'fields' => ['table' => 'fields', 'where' => 'namekey NOT IN (\'name\', \'html\', \'email\')'],
39 ];
40
41 $this->doCleanTable($element);
42
43 if ('users_fields' === $element) {
44 $fields = acym_loadResultArray(
45 'SELECT namekey FROM #__acymailing_fields WHERE `namekey` NOT IN ("name", "email", "html") AND `type` NOT IN ("customtext", "category", "gravatar")'
46 );
47 $columnUserTable = acym_getColumns('acymailing_subscriber', false);
48
49 $fieldToCheck = [];
50
51 foreach ($fields as $key => $field) {
52 if (in_array($field, $columnUserTable)) {
53 $fieldToCheck[$key] = '`'.acym_secureDBColumn($field).'`';
54 }
55 }
56
57 $connection[$element]['where'] = implode(' IS NOT NULL OR ', $fieldToCheck);
58 if (!empty($fieldToCheck)) {
59 $connection[$element]['where'] .= ' IS NOT NULL;';
60 }
61 }
62
63 $query = 'SELECT COUNT(*) FROM #__acymailing_'.$connection[$element]['table'];
64 if (!empty($connection[$element]['where'])) {
65 $query .= ' WHERE '.$connection[$element]['where'];
66 }
67
68 $this->result['count'] = acym_loadResult($query);
69
70 return $this->result;
71 }
72
73 public function doConfigMigration(): array
74 {
75 $this->doElementMigration('config');
76
77 return $this->result;
78 }
79
80 public function doUsers_fieldsMigration(): array
81 {
82 $this->doElementMigration('users_fields');
83
84 return $this->result;
85 }
86
87 public function doMailStatsMigration(): array
88 {
89 $this->doElementMigration('MailStats');
90
91 return $this->result;
92 }
93
94 public function doMailhaslistsMigration(): array
95 {
96 $this->doElementMigration('MailHasLists');
97
98 return $this->result;
99 }
100
101 public function doTemplatesMigration(): array
102 {
103 $this->doElementMigration('templates');
104
105 return $this->result;
106 }
107
108 public function doMailsMigration(): array
109 {
110 $this->doElementMigration('mails');
111
112 return $this->result;
113 }
114
115 public function doFieldsMigration(): array
116 {
117 $this->doElementMigration('fields');
118
119 return $this->result;
120 }
121
122 public function doListsMigration(): array
123 {
124
125 $this->doElementMigration('lists');
126
127 return $this->result;
128 }
129
130 public function doUsersMigration(): array
131 {
132
133 $this->doElementMigration('users');
134
135 return $this->result;
136 }
137
138 public function doSubscriptionsMigration(): array
139 {
140 $this->doElementMigration('subscriptions');
141
142 return $this->result;
143 }
144
145 public function doWelcomeunsubMigration(): array
146 {
147 $this->doElementMigration('Welcomeunsub');
148
149 return $this->result;
150 }
151
152 public function doBounceMigration(): array
153 {
154 $this->doElementMigration('bounce');
155
156 return $this->result;
157 }
158
159 public function doDistribMigration(): array
160 {
161 $this->doElementMigration('distrib');
162
163 return $this->result;
164 }
165
166 private function doCleanTable(string $tableName): void
167 {
168 $functionName = 'clean'.ucfirst($tableName).'Table';
169
170 if (method_exists($this, $functionName) && !$this->$functionName()) {
171 $this->result['isOk'] = false;
172 $this->result['errorClean'] = true;
173 $this->result['errors'] = $this->errors;
174 }
175 }
176
177 private function doElementMigration(string $elementName): bool
178 {
179 $functionName = 'migrate'.ucfirst($elementName);
180
181 $params = [
182 'currentElement' => acym_getVar('int', 'currentElement'),
183 'insertPerCalls' => acym_getVar('int', 'insertPerCalls'),
184 ];
185
186 $nbInsert = $this->$functionName($params);
187
188 if ($nbInsert !== -1) {
189 $this->result[$elementName] = $nbInsert;
190
191 return true;
192 } else {
193 $this->result[$elementName] = false;
194 $this->result['isOk'] = false;
195 $this->result['errorInsert'] = true;
196 $this->result['errors'] = $this->errors;
197
198 return false;
199 }
200 }
201
202 private function migrateConfig(array $params): int
203 {
204 //Mail Settings
205 $fieldsMatchMailSettings = [
206 'add_names' => 'add_names',
207 'bounce_email' => 'bounce_email',
208 'charset' => 'charset',
209 'dkim' => 'dkim',
210 'dkim_domain' => 'dkim_domain',
211 'dkim_identity' => 'dkim_identity',
212 'dkim_passphrase' => 'dkim_passphrase',
213 'dkim_private' => 'dkim_private',
214 'dkim_public' => 'dkim_public',
215 'dkim_selector' => 'dkim_selector',
216 'elasticemail_password' => 'elasticemail_password',
217 'elasticemail_port' => 'elasticemail_port',
218 'elasticemail_username' => 'elasticemail_username',
219 'embed_files' => 'embed_files',
220 'embed_images' => 'embed_images',
221 'encoding_format' => 'encoding_format',
222 'from_email' => 'from_email',
223 'from_name' => 'from_name',
224 'mailer_method' => 'mailer_method',
225 'multiple_part' => 'multiple_part',
226 'reply_email' => 'replyto_email',
227 'reply_name' => 'replyto_name',
228 'sendmail_path' => 'sendmail_path',
229 'smtp_auth' => 'smtp_auth',
230 'smtp_host' => 'smtp_host',
231 'smtp_keepalive' => 'smtp_keepalive',
232 'smtp_password' => 'smtp_password',
233 'smtp_port' => 'smtp_port',
234 'smtp_secured' => 'smtp_secured',
235 'smtp_username' => 'smtp_username',
236 'special_chars' => 'special_chars',
237 ];
238
239 //Queue Process
240 $fieldsMatchQueueProcess = [
241 'cron_frequency' => 'cron_frequency',
242 'cron_fromip' => 'cron_fromip',
243 'cron_last' => 'cron_last',
244 'cron_report' => 'cron_report',
245 'cron_savereport' => 'cron_savereport',
246 'cron_sendreport' => 'cron_sendreport',
247 'cron_sendto' => 'cron_sendto',
248 'queue_nbmail' => 'queue_nbmail',
249 'queue_nbmail_auto' => 'queue_nbmail_auto',
250 'queue_pause' => 'queue_pause',
251 'queue_try' => 'queue_try',
252 'queue_type' => 'queue_type',
253 ];
254
255 //Subscription
256 $fieldsMatchSubscription = [
257 'require_confirmation' => 'require_confirmation',
258 ];
259
260 //Security
261 $fieldsMatchSecurity = [
262 'allowedfiles' => 'allowed_files',
263 'email_checkdomain' => 'email_checkdomain',
264 'recaptcha_secretkey' => 'recaptcha_secretkey',
265 'recaptcha_sitekey' => 'recaptcha_sitekey',
266 'security_key' => 'security_key',
267 ];
268
269 $fieldsMatchNotUsed = [
270 'allow_visitor' => 'allow_visitor',
271 'confirm_redirect' => 'confirm_redirect',
272 'confirmation_message' => 'confirmation_message',
273 'cron_next' => 'cron_next',
274 'priority_newsletter' => 'priority_newsletter',
275 'subscription_message' => 'subscription_message',
276 'unsub_message' => 'unsub_message',
277 'welcome_message' => 'welcome_message',
278 ];
279
280 //Bounce handling
281 $fieldsMatchBounce = [
282 'bounce_email' => 'bounce_email',
283 'bounce_server' => 'bounce_server',
284 'bounce_port' => 'bounce_port',
285 'bounce_connection' => 'bounce_connection',
286 'bounce_secured' => 'bounce_secured',
287 'bounce_certif' => 'bounce_certif',
288 'bounce_username' => 'bounce_username',
289 'bounce_password' => 'bounce_password',
290 'bounce_timeout' => 'bounce_timeout',
291 'bounce_max' => 'bounce_max',
292 'auto_bounce' => 'auto_bounce',
293 'auto_bounce_frequency' => 'auto_bounce_frequency',
294 'bounce_action_lists_maxtry' => 'bounce_action_lists_maxtry',
295 ];
296
297 $fieldsMatch = array_merge(
298 $fieldsMatchMailSettings,
299 $fieldsMatchQueueProcess,
300 $fieldsMatchSubscription,
301 $fieldsMatchSecurity,
302 $fieldsMatchNotUsed,
303 $fieldsMatchBounce
304 );
305
306 $dataPrevious = acym_loadObjectList(
307 'SELECT `namekey`, `value`
308 FROM #__acymailing_config
309 WHERE `namekey` IN ("'.implode('","', array_keys($fieldsMatch)).'")
310 LIMIT '.intval($params['currentElement']).', '.intval($params['insertPerCalls'])
311 );
312
313 if (empty($dataPrevious)) {
314 return 0;
315 }
316
317 $valuesToInsert = [];
318
319 foreach ($dataPrevious as $value) {
320 if (empty($fieldsMatch[$value->namekey])) {
321 continue;
322 }
323
324 $value->namekey = $fieldsMatch[$value->namekey];
325
326 switch ($value->namekey) {
327 case 'queue_type':
328 switch ($value->value) {
329 case 'onlyauto':
330 $value->value = 'auto';
331 break;
332 case 'auto':
333 $value->value = 'automan';
334 break;
335 }
336 break;
337
338 case 'mailer_method':
339 $sending_platform = $value->value == 'smtp' || $value->value === 'elasticemail' ? 'external' : 'server';
340 $valuesToInsert[] = '("sending_platform",'.acym_escapeDB($sending_platform).')';
341 break;
342 }
343
344 $valuesToInsert[] = '('.acym_escapeDB($value->namekey).','.acym_escapeDB($value->value).')';
345 }
346
347 $query = 'REPLACE INTO #__acym_configuration VALUES '.implode(',', $valuesToInsert).';';
348
349 return $this->insertQuery($query);
350 }
351
352 private function migrateTemplates(array $params): int
353 {
354 $mailClass = new MailClass();
355
356 $queryGetTemplates = 'SELECT `tempid`, `name`, `body`, `styles`, `subject`, `stylesheet`, `fromname`, `fromemail`, `replyname`, `replyemail` FROM #__acymailing_template LIMIT '.intval(
357 $params['currentElement']
358 ).', '.intval($params['insertPerCalls']);
359
360 $templates = acym_loadObjectList($queryGetTemplates);
361 if (empty($templates)) {
362 return 0;
363 }
364
365 $valuesToInsert = [];
366
367 $templates = $mailClass->encode($templates);
368
369 foreach ($templates as $oneTemplate) {
370 $oneTemplateStyles = unserialize($oneTemplate->styles);
371
372 foreach ($oneTemplateStyles as $key => $value) {
373 if (strpos($key, 'tag_') !== false) {
374 $tag = str_replace('tag_', '', $key);
375 $styleDeclaration = $tag.'{'.$value.'}';
376 } elseif (strpos($key, 'color_bg') !== false) {
377 $styleDeclaration = '';
378 } else {
379 $styleDeclaration = '.'.$key.'{'.$value.'}';
380 }
381
382 $oneTemplate->stylesheet .= $styleDeclaration;
383 }
384
385 $valuesToInsert[] = '('.implode(
386 ', ',
387 [
388 acym_escapeDB(empty($oneTemplate->name) ? acym_translation('ACYM_MIGRATED_TEMPLATE').' '.time() : $oneTemplate->name),
389 acym_escapeDB(acym_date('now', 'Y-m-d H:i:s', false)),
390 '0',
391 acym_escapeDB(MailClass::TYPE_TEMPLATE),
392 acym_escapeDB(empty($oneTemplate->body) ? '' : $oneTemplate->body),
393 acym_escapeDB($oneTemplate->subject),
394 acym_escapeDB($oneTemplate->fromname),
395 acym_escapeDB($oneTemplate->fromemail),
396 acym_escapeDB($oneTemplate->replyname),
397 acym_escapeDB($oneTemplate->replyemail),
398 acym_escapeDB($oneTemplate->stylesheet),
399 intval(acym_currentUserId()),
400 ]
401 ).')';
402 }
403
404 if (empty($valuesToInsert)) {
405 return 0;
406 }
407
408 $queryInsert = 'INSERT INTO #__acym_mail (`name`, `creation_date`, `drag_editor`, `type`, `body`, `subject`, `from_name`, `from_email`, `reply_to_name`, `reply_to_email`, `stylesheet`, `creator_id`) VALUES '.implode(
409 ',',
410 $valuesToInsert
411 ).';';
412
413 return $this->insertQuery($queryInsert);
414 }
415
416 private function migrateUsers_fields(array $params): int
417 {
418 $fieldsV5InDB = acym_loadObjectList(
419 'SELECT `namekey`, `type`
420 FROM #__acymailing_fields
421 WHERE `namekey` NOT IN ("name", "email", "html")
422 AND `type` NOT IN ("customtext", "category", "gravatar")',
423 'namekey'
424 );
425
426 if (empty($fieldsV5InDB)) {
427 return 0;
428 }
429
430 $columnUserTable = acym_getColumns('acymailing_subscriber', false);
431
432 $fieldsV5 = [];
433
434 foreach ($fieldsV5InDB as $key => $field) {
435 if (in_array($key, $columnUserTable)) {
436 $fieldsV5[$key] = $field;
437 }
438 }
439
440 if (empty($fieldsV5)) {
441 return 0;
442 }
443
444 $fieldsKeyV5 = array_keys($fieldsV5);
445
446 $whereUserField = '`'.implode('` IS NOT NULL OR `', $fieldsKeyV5);
447 if (!empty($fieldsKeyV5)) {
448 $whereUserField .= '` IS NOT NULL';
449 }
450
451 $query = 'SELECT `subid`, `'.implode('`, `', $fieldsKeyV5).'` FROM #__acymailing_subscriber WHERE '.$whereUserField.' LIMIT '.intval($params['currentElement']).', '.intval(
452 $params['insertPerCalls']
453 );
454 $usersFieldsValuesV5 = acym_loadObjectList($query);
455
456 $fieldImported = acym_loadObjectList('SELECT `id`, `namekey`, `option`, `type` FROM #__acym_field WHERE `namekey` IN ("'.implode('", "', $fieldsKeyV5).'")', 'namekey');
457
458 $valuesToInsert = [];
459
460 foreach ($fieldsKeyV5 as $fieldKey) {
461 foreach ($usersFieldsValuesV5 as $user) {
462 if ('date' == $fieldImported[$fieldKey]->type) {
463 $user->$fieldKey = preg_replace('@[^0-9]@', '/', $user->$fieldKey);
464 }
465
466 if ('birthday' == $fieldsV5[$fieldKey]->type && !empty($user->$fieldKey)) {
467 if (!is_array($fieldImported[$fieldKey]->option)) {
468 $fieldImported[$fieldKey]->option = json_decode($fieldImported[$fieldKey]->option, true);
469 }
470
471 if (!empty($fieldImported[$fieldKey]->option['format'])) {
472 $birthdayValue = explode('/', $user->$fieldKey);
473 $positions = [
474 '0' => strpos($fieldImported[$fieldKey]->option['format'], '%y'),
475 '1' => strpos($fieldImported[$fieldKey]->option['format'], '%m'),
476 '2' => strpos($fieldImported[$fieldKey]->option['format'], '%d'),
477 ];
478 asort($positions);
479 $final = [];
480 foreach ($positions as $key => $value) {
481 $final[] = $birthdayValue[$key];
482 }
483 $user->$fieldKey = implode('/', $final);
484 }
485 }
486
487 if ('phone' == $fieldImported[$fieldKey]->type) {
488 $user->$fieldKey = str_replace('+', '', $user->$fieldKey);
489 }
490
491 if (strlen($user->$fieldKey) === 0 || ($fieldImported[$fieldKey]->type === 'phone' && $user->$fieldKey === ',')) {
492 continue;
493 }
494
495 $valuesToInsert[] = '('.intval($user->subid).', '.acym_escapeDB($user->$fieldKey).', '.intval($fieldImported[$fieldKey]->id).')';
496 }
497 }
498
499 if (empty($valuesToInsert)) {
500 return 0;
501 }
502
503 return (int)acym_query('INSERT IGNORE INTO #__acym_user_has_field (`user_id`, `value`, `field_id`) VALUES '.implode(', ', $valuesToInsert));
504 }
505
506 private function migrateFields(array $params): int
507 {
508 $fieldClass = new FieldClass();
509
510 $columnConnection = [
511 'namekey' => 'namekey',
512 'fieldname' => 'name',
513 'published' => 'active',
514 'options' => 'option',
515 'listing' => 'backend_listing',
516 'backend' => 'backend_edition',
517 'default' => 'default_value',
518 'type' => 'type',
519 'value' => 'value',
520 'ordering' => 'ordering',
521 'required' => 'required',
522 ];
523
524 $optionConnection = [
525 'errormessage' => 'error_message',
526 'checkcontent' => 'authorized_content',
527 'errormessagecheckcontent' => 'error_message_invalid',
528 'cols' => 'columns',
529 'fieldcatclass' => 'css_class',
530 'format' => 'format',
531 'size' => 'size',
532 'rows' => 'rows',
533 'customtext' => 'custom_text',
534 ];
535
536 $databaseConnection = [
537 'dbName' => 'database',
538 'tableName' => 'table',
539 'valueFromDb' => 'value',
540 'titleFromDb' => 'title',
541 'whereCond' => 'where',
542 'whereOperator' => 'where_sign',
543 'whereValue' => 'where_value',
544 'orderField' => 'order_by',
545 'orderValue' => 'sort_order',
546 ];
547
548 $typeConnection = [
549 'text' => 'text',
550 'textarea' => 'textarea',
551 'radio' => 'radio',
552 'checkbox' => 'checkbox',
553 'singledropdown' => 'single_dropdown',
554 'multipledropdown' => 'multiple_dropdown',
555 'date' => 'date',
556 'birthday' => 'date',
557 'file' => 'file',
558 'phone' => 'phone',
559 'customtext' => 'custom_text',
560 ];
561
562 $fieldsFromV5 = acym_loadObjectList(
563 'SELECT * FROM #__acymailing_fields WHERE `namekey` NOT IN ("name", "email", "html") AND `type` NOT IN ("gravatar", "category") LIMIT '.intval(
564 $params['currentElement']
565 ).', '.intval($params['insertPerCalls'])
566 );
567
568 $insertedFields = [];
569
570 foreach ($fieldsFromV5 as $oneField) {
571 $newField = new \stdClass();
572 foreach ($oneField as $key => $value) {
573 if (!array_key_exists($key, $columnConnection)) {
574 continue;
575 }
576
577 if ('type' === $columnConnection[$key]) {
578 $value = $typeConnection[$value];
579 }
580 if ('default_value' === $columnConnection[$key] && in_array($oneField->type, ['date', 'birthday'])) {
581 $value = preg_replace('@[^0-9]@', '/', $value);
582 }
583 if ('value' === $columnConnection[$key]) {
584 //Decode value from v5
585 $allValues = explode("\n", $value);
586 $returnedValues = [];
587 foreach ($allValues as $id => $oneVal) {
588 $line = explode('::', trim($oneVal));
589 if (empty($line[1])) continue;
590 $var = empty($line[0]) ? '' : $line[0];
591 $val = empty($line[1]) ? '' : $line[1];
592
593 $obj = new \stdClass();
594 $obj->value = $var;
595 $obj->title = $val;
596 if (!empty($line[2])) {
597 $obj->disabled = 'y';
598 } else {
599 $obj->disabled = 'n';
600 }
601 $returnedValues[] = $obj;
602 }
603 $value = json_encode($returnedValues);
604 }
605 if ('option' === $columnConnection[$key]) {
606 $options = unserialize($value);
607 if (empty($options)) {
608 continue;
609 }
610 $newOption = new \stdClass();
611 foreach ($options as $keyOption => $option) {
612 if (!array_key_exists($keyOption, $optionConnection)) continue;
613 if ('authorized_content' === $optionConnection[$keyOption]) {
614 $option = [
615 $option,
616 'regex' => $options['regexp'],
617 ];
618 }
619 if (in_array($oneField->type, ['date', 'birthday']) && 'format' === $keyOption) {
620 if (empty($option)) {
621 $option = '%d%m%y';
622 } else {
623 $option = strtolower($option);
624 $position = [
625 '%y' => strpos($option, '%y'),
626 '%m' => strpos($option, '%m'),
627 '%d' => strpos($option, '%d'),
628 ];
629 asort($position);
630 $option = implode('', array_keys($position));
631 }
632 }
633 $optionName = $optionConnection[$keyOption];
634 $newOption->$optionName = $option;
635 }
636 $newOption->fieldDB = [];
637 foreach ($databaseConnection as $keyOldDatabase => $keyNewDatabase) {
638 if (!array_key_exists($keyOldDatabase, $options)) {
639 $newOption->fieldDB[$keyNewDatabase] = '';
640 continue;
641 }
642 if ('database' == $keyNewDatabase && 'current' == $options[$keyOldDatabase]) $options[$keyOldDatabase] = acym_loadResult('SELECT DATABASE();');
643 $newOption->fieldDB[$keyNewDatabase] = $options[$keyOldDatabase];
644 }
645 $newOption->fieldDB = json_encode($newOption->fieldDB);
646 $value = json_encode($newOption);
647 }
648 $column = $columnConnection[$key];
649 $newField->$column = $value;
650 }
651 $insertedFields[] = $fieldClass->save($newField);
652 }
653
654 return count($insertedFields);
655 }
656
657 private function migrateMails(array $params): int
658 {
659 $queryGetMails = 'SELECT mail.`mailid`,
660 mail.`created`,
661 mail.`type`,
662 mail.`body`,
663 mail.`subject`,
664 mail.`fromname`,
665 mail.`fromemail`,
666 mail.`replyname`,
667 mail.`replyemail`,
668 mail.`bccaddresses`,
669 mail.`tempid`,
670 mail.`senddate`,
671 mail.`published`,
672 mail.`attach`,
673 mail.userid,
674 template.`stylesheet`,
675 template.`styles`
676 FROM #__acymailing_mail mail
677 LEFT JOIN #__acymailing_template template
678 ON mail.tempid = template.tempid
679 LIMIT '.intval($params['currentElement']).', '.intval($params['insertPerCalls']);
680
681 $mails = acym_loadObjectList($queryGetMails);
682
683 if (empty($mails)) {
684 return 0;
685 }
686
687 $mailsToInsert = [];
688 $campaignsToInsert = [];
689 $followupsToInsert = [];
690 $followupsCreated = [];
691 $followupClass = new FollowupClass();
692
693 foreach ($mails as $oneMail) {
694 if (empty($oneMail->mailid)) {
695 continue;
696 }
697
698 switch ($oneMail->type) {
699 case 'welcome':
700 $mailType = MailClass::TYPE_WELCOME;
701 break;
702 case 'unsub':
703 $mailType = MailClass::TYPE_UNSUBSCRIBE;
704 break;
705 case 'followup':
706 $mailType = MailClass::TYPE_FOLLOWUP;
707 break;
708 case 'news':
709 $mailType = MailClass::TYPE_STANDARD;
710 break;
711 default:
712 $mailType = 'invalid';
713 break;
714 }
715
716 if ($mailType === 'invalid') {
717 continue;
718 }
719
720 $mailStylesheet = $oneMail->stylesheet;
721
722 $templateStyles = unserialize($oneMail->styles);
723
724 if ($templateStyles !== false) {
725 foreach ($templateStyles as $key => $value) {
726 if (strpos($key, 'tag_') !== false) {
727 $tag = str_replace('tag_', '', $key);
728 $styleDeclaration = $tag.'{'.$value.'}';
729 } elseif (strpos($key, 'color_bg') !== false) {
730 $styleDeclaration = '';
731 } else {
732 $styleDeclaration = '.'.$key.'{'.$value.'}';
733 }
734 $mailStylesheet .= $styleDeclaration;
735 }
736 }
737
738 $subject = acym_utf8Encode(substr($oneMail->subject, 0, 255));
739
740 $mail = [
741 'id' => intval($oneMail->mailid),
742 'name' => acym_escapeDB($subject),
743 'creation_date' => acym_escapeDB(acym_date(empty($oneMail->created) ? 'now' : $oneMail->created, 'Y-m-d H:i:s')),
744 'drag_editor' => 0,
745 'type' => acym_escapeDB($mailType),
746 'body' => acym_escapeDB(acym_utf8Encode($oneMail->body)),
747 'subject' => acym_escapeDB($subject),
748 'from_name' => acym_escapeDB($oneMail->fromname),
749 'from_email' => acym_escapeDB($oneMail->fromemail),
750 'reply_to_name' => acym_escapeDB($oneMail->replyname),
751 'reply_to_email' => acym_escapeDB($oneMail->replyemail),
752 'bcc' => acym_escapeDB($oneMail->bccaddresses),
753 'stylesheet' => acym_escapeDB($mailStylesheet),
754 'creator_id' => empty($oneMail->userid) ? acym_currentUserId() : intval($oneMail->userid),
755 'attachments' => [],
756 ];
757
758 if (!empty($oneMail->attach)) {
759 $attachments = unserialize($oneMail->attach);
760 foreach ($attachments as $oneAttachment) {
761 $fileName = substr($oneAttachment->filename, strrpos($oneAttachment->filename, DS));
762 $uploadFolder = str_replace(['/', '\\'], DS, acym_getFilesFolder());
763 $v7Location = $uploadFolder.$fileName;
764
765 // if the file doesn't exist, don't add it
766 $v5Path = acym_cleanPath(ACYM_ROOT.DS.$oneAttachment->filename);
767 if (!file_exists($v5Path)) continue;
768
769 // copy the file to the v7 files location
770 $v7Path = acym_cleanPath(ACYM_ROOT.DS.$v7Location);
771 if (!file_exists($v7Path)) {
772 acym_copyFile($v5Path, $v7Path);
773 }
774
775 // add the attachment to the new mail entry
776 $mail['attachments'][] = (object)[
777 'filename' => $v7Location,
778 'size' => $oneAttachment->size,
779 ];
780 }
781 }
782 $mail['attachments'] = acym_escapeDB(json_encode($mail['attachments']));
783
784 // Create the related campaign
785 if ($mailType === MailClass::TYPE_STANDARD) {
786 $stats = acym_loadResult('SELECT COUNT(mailid) FROM #__acymailing_stats WHERE mailid = '.intval($oneMail->mailid));
787 $isSent = !empty($stats);
788
789 $sendingType = intval(!$isSent && ($oneMail->senddate > time()));
790 $campaign = [
791 'sending_date' => empty($oneMail->senddate) ? 'NULL' : acym_escapeDB(acym_date($oneMail->senddate, 'Y-m-d H:i:s')),
792 'draft' => intval(!$isSent),
793 'active' => empty($oneMail->published) ? 0 : intval($oneMail->published),
794 'mail_id' => intval($oneMail->mailid),
795 'sending_type' => acym_escapeDB(0 === $sendingType ? CampaignClass::SENDING_TYPE_NOW : CampaignClass::SENDING_TYPE_SCHEDULED),
796 'sent' => intval($isSent),
797 'sending_params' => acym_escapeDB('[]'),
798 ];
799 $campaignsToInsert[] = '('.implode(', ', $campaign).')';
800 }
801
802 // Create the related follow-up
803 if ($mailType === MailClass::TYPE_FOLLOWUP) {
804 $v5Campaign = acym_loadObject(
805 'SELECT l.listid, l.published, l.name
806 FROM #__acymailing_listmail AS lm
807 JOIN #__acymailing_list AS l ON l.listid = lm.listid
808 WHERE mailid = '.intval($oneMail->mailid)
809 );
810
811 // If the followup campaign doesn't exist, create it
812 if (empty($followupsCreated[$v5Campaign->listid])) {
813 $followupListIds = acym_loadResultArray('SELECT listid FROM #__acymailing_listcampaign WHERE campaignid = '.intval($v5Campaign->listid));
814 $followupCampaign = new \stdClass();
815 $followupCampaign->name = $v5Campaign->name;
816 $followupCampaign->display_name = $v5Campaign->name;
817 $followupCampaign->creation_date = acym_date('now', 'Y-m-d H:i:s');
818 $followupCampaign->trigger = 'user_subscribe';
819 $followupCampaign->condition = [
820 'lists_status' => 'is',
821 'lists' => $followupListIds,
822 'segments_status' => '',
823 ];
824 $followupCampaign->active = $v5Campaign->published;
825 $followupCampaign->send_once = 1;
826 $followupCampaign->list_id = $v5Campaign->listid;
827
828 $followupsCreated[$v5Campaign->listid] = $followupClass->save($followupCampaign);
829 }
830
831 $delay = $oneMail->senddate;
832 if (empty($delay)) {
833 $unit = 60;
834 } elseif ($delay % 2628000 === 0) {
835 $unit = 2628000;
836 } elseif ($delay % 604800 === 0) {
837 $unit = 604800;
838 } elseif ($delay % 86400 === 0) {
839 $unit = 86400;
840 } elseif ($delay % 3600 === 0) {
841 $unit = 3600;
842 } else {
843 $unit = 60;
844 }
845 $delay = $delay / $unit;
846
847 $followup = [
848 'mail_id' => intval($oneMail->mailid),
849 'followup_id' => intval($followupsCreated[$v5Campaign->listid]),
850 'delay' => intval($delay),
851 'delay_unit' => intval($unit),
852 ];
853
854 $followupsToInsert[] = '('.implode(', ', $followup).')';
855 }
856
857 $mailsToInsert[] = '('.implode(', ', $mail).')';
858 }
859
860 if (empty($mailsToInsert)) {
861 return 0;
862 }
863
864 $queryMailsInsert = 'INSERT INTO #__acym_mail ('.implode(', ', array_keys($mail)).') VALUES '.implode(',', $mailsToInsert).';';
865 $resultMail = $this->insertQuery($queryMailsInsert);
866 if ($resultMail === -1) {
867 return -1;
868 }
869
870 if (!empty($campaignsToInsert)) {
871 $queryCampaignInsert = 'INSERT IGNORE INTO #__acym_campaign ('.implode(', ', array_keys($campaign)).') VALUES '.implode(',', $campaignsToInsert).';';
872 if ($this->insertQuery($queryCampaignInsert) === false) {
873 return -1;
874 }
875 }
876
877 if (!empty($followupsToInsert)) {
878 $queryInsert = 'INSERT IGNORE INTO #__acym_followup_has_mail ('.implode(', ', array_keys($followup)).') VALUES '.implode(',', $followupsToInsert).';';
879 if ($this->insertQuery($queryInsert) === false) {
880 return -1;
881 }
882 }
883
884 return $resultMail;
885 }
886
887 private function migrateLists(array $params): int
888 {
889 $lists = acym_loadObjectList(
890 'SELECT `listid`, `name`, `published`, `visible`, `color`, `userid`, `type`, `description`, `access_manage`
891 FROM #__acymailing_list
892 LIMIT '.intval($params['currentElement']).', '.intval($params['insertPerCalls'])
893 );
894
895 $listsToInsert = [];
896
897 $siteUserGroupIds = array_keys(acym_getGroups());
898
899 foreach ($lists as $oneList) {
900 $access = '';
901 if ($oneList->access_manage === 'all') {
902 $access = ','.implode(',', $siteUserGroupIds).',';
903 } elseif ($oneList->access_manage !== 'none') {
904 $access = $oneList->access_manage;
905 }
906
907 $list = [
908 'id' => intval($oneList->listid),
909 'name' => acym_escapeDB($oneList->name),
910 'active' => $oneList->type === 'campaign' ? 1 : (empty($oneList->published) ? 0 : 1),
911 'visible' => acym_escapeDB($oneList->visible),
912 'clean' => 0,
913 'color' => acym_escapeDB($oneList->color),
914 'creation_date' => acym_escapeDB(acym_date('now', 'Y-m-d H:i:s')),
915 'cms_user_id' => empty($oneList->userid) ? acym_currentUserId() : intval($oneList->userid),
916 'description' => acym_escapeDB($oneList->description),
917 'type' => acym_escapeDB($oneList->type === 'campaign' ? ListClass::LIST_TYPE_FOLLOWUP : ListClass::LIST_TYPE_STANDARD),
918 'access' => acym_escapeDB($access),
919 ];
920
921 $listsToInsert[] = '('.implode(', ', $list).')';
922 }
923
924 if (empty($listsToInsert)) {
925 return 0;
926 }
927
928 $queryInsert = 'INSERT INTO #__acym_list ('.implode(', ', array_keys($list)).') VALUES '.implode(',', $listsToInsert).';';
929
930 return $this->insertQuery($queryInsert);
931 }
932
933 private function migrateUsers(array $params): int
934 {
935 $queryGetUsers = 'SELECT `subid`, `name`, `email`, `created`, `enabled`, `userid`, `source`, `confirmed`, `key` FROM #__acymailing_subscriber LIMIT '.intval(
936 $params['currentElement']
937 ).', '.intval($params['insertPerCalls']);
938
939 $users = acym_loadObjectList($queryGetUsers, 'subid');
940
941 $usersToInsert = [];
942
943 foreach ($users as $oneUser) {
944 if (empty($oneUser->subid)) {
945 continue;
946 }
947
948 $user = [
949 'id' => intval($oneUser->subid),
950 'name' => acym_escapeDB($oneUser->name),
951 'email' => acym_escapeDB($oneUser->email),
952 'creation_date' => acym_escapeDB(empty($oneUser->created) ? acym_date('now', 'Y-m-d H:i:s') : acym_date($oneUser->created, 'Y-m-d H:i:s')),
953 'active' => acym_escapeDB($oneUser->enabled),
954 'cms_id' => intval($oneUser->userid),
955 'source' => acym_escapeDB($oneUser->source),
956 'confirmed' => acym_escapeDB($oneUser->confirmed),
957 'key' => acym_escapeDB($oneUser->key),
958 ];
959
960 $usersToInsert[] = '('.implode(', ', $user).')';
961 }
962
963 if (empty($usersToInsert)) {
964 return 0;
965 }
966
967 $queryInsert = 'INSERT INTO #__acym_user (`id`, `name`, `email`, `creation_date`, `active`, `cms_id`, `source`, `confirmed`, `key`) VALUES '.implode(
968 ', ',
969 $usersToInsert
970 ).';';
971
972 return $this->insertQuery($queryInsert);
973 }
974
975 private function migrateBounce(array $params): int
976 {
977 $rules = acym_loadObjectList('SELECT * FROM #__acymailing_rules LIMIT '.intval($params['currentElement']).', '.intval($params['insertPerCalls']));
978
979 if (empty($rules)) {
980 return 0;
981 }
982
983 $keys = [
984 'ACY_RULE_ACTION' => 'ACYM_ACTION_REQUIRED',
985 'ACY_RULE_ACKNOWLEDGE_BODY' => 'ACYM_ACKNOWLEDGMENT_RECEIPT_BODY',
986 'ACY_RULE_ACKNOWLEDGE' => 'ACYM_ACKNOWLEDGMENT_RECEIPT_SUBJECT',
987 'ACY_RULE_LOOP_BODY' => 'ACYM_FEEDBACK_LOOP_BODY',
988 'ACY_RULE_LOOP' => 'ACYM_FEEDBACK_LOOP',
989 'ACY_RULE_FULL' => 'ACYM_MAILBOX_FULL',
990 'ACY_RULE_GOOGLE' => 'ACYM_BLOCKED_GOOGLE_GROUPS',
991 'ACY_RULE_EXIST1' => 'ACYM_MAILBOX_DOESNT_EXIST_1',
992 'ACY_RULE_FILTERED' => 'ACYM_MESSAGE_BLOCKED_RECIPIENTS',
993 'ACY_RULE_EXIST2' => 'ACYM_MAILBOX_DOESNT_EXIST_2',
994 'ACY_RULE_DOMAIN' => 'ACYM_DOMAIN_NOT_EXIST',
995 'ACY_RULE_TEMPORAR' => 'ACYM_TEMPORARY_FAILURES',
996 'ACY_RULE_PERMANENT' => 'ACYM_FAILED_PERM',
997 'ACY_RULE_FINAL' => 'ACYM_FINAL_RULE',
998 ];
999
1000 $migratedRules = [];
1001 foreach ($rules as $oneRule) {
1002 $actionUser = unserialize($oneRule->action_user);
1003 $actionMessage = unserialize($oneRule->action_message);
1004
1005 $actionsOnUsers = [];
1006 if (!empty($actionUser['unsub'])) $actionsOnUsers[] = 'unsubscribe_user';
1007 if (!empty($actionUser['sub']) && !empty($actionUser['subscribeto'])) {
1008 $actionsOnUsers[] = 'subscribe_user';
1009 $actionsOnUsers['subscribe_user_list'] = $actionUser['subscribeto'];
1010 }
1011 if (!empty($actionUser['block'])) $actionsOnUsers[] = 'block_user';
1012 if (!empty($actionUser['delete'])) $actionsOnUsers[] = 'delete_user';
1013 if (!empty($actionUser['emptyq'])) $actionsOnUsers[] = 'empty_queue_user';
1014
1015
1016 $actionsOnEmail = [];
1017 if (!empty($actionMessage['save'])) $actionsOnEmail[] = 'save_message';
1018 if (!empty($actionMessage['delete'])) $actionsOnEmail[] = 'delete_message';
1019 if (!empty($actionMessage['forwardto'])) {
1020 $actionsOnEmail[] = 'forward_message';
1021 $actionsOnEmail['forward_to'] = $actionMessage['forwardto'];
1022 }
1023
1024 $rule = [
1025 'id' => intval($oneRule->ruleid),
1026 'name' => acym_escapeDB(str_replace(array_keys($keys), $keys, $oneRule->name)),
1027 'active' => intval($oneRule->published),
1028 'ordering' => intval($oneRule->ordering),
1029 'regex' => acym_escapeDB($oneRule->regex),
1030 'executed_on' => acym_escapeDB(json_encode(array_keys(unserialize($oneRule->executed_on)))),
1031 'execute_action_after' => empty($actionUser['min']) ? 0 : intval($actionUser['min']),
1032 'increment_stats' => empty($actionUser['stats']) ? 0 : intval($actionUser['stats']),
1033 'action_user' => acym_escapeDB(json_encode($actionsOnUsers)),
1034 'action_message' => acym_escapeDB(json_encode($actionsOnEmail)),
1035 ];
1036
1037 $migratedRules[] = '('.implode(', ', $rule).')';
1038 }
1039
1040 if (empty($migratedRules)) {
1041 return 0;
1042 }
1043
1044 $queryInsert = 'INSERT INTO #__acym_rule (`id`, `name`, `active`, `ordering`, `regex`, `executed_on`, `execute_action_after`, `increment_stats`, `action_user`, `action_message`) VALUES '.implode(
1045 ', ',
1046 $migratedRules
1047 );
1048
1049 try {
1050 return (int)acym_query($queryInsert);
1051 } catch (\Exception $e) {
1052 $this->errors[] = $e->getMessage();
1053
1054 return -1;
1055 }
1056 }
1057
1058 private function migrateDistrib(array $params): int
1059 {
1060 $distributionLists = acym_loadObjectList(
1061 'SELECT *
1062 FROM #__acymailing_action
1063 LIMIT '.intval($params['currentElement']).', '.intval($params['insertPerCalls'])
1064 );
1065
1066 if (empty($distributionLists)) {
1067 return 0;
1068 }
1069
1070 $mailboxClass = new MailboxClass();
1071 $listClass = new ListClass();
1072 $standardLists = array_column($listClass->getAllWithoutManagement(), 'id');
1073 $groups = acym_getGroups();
1074 foreach ($distributionLists as $oneDistributionList) {
1075 $mailboxAction = new \stdClass();
1076 $mailboxAction->name = $oneDistributionList->name;
1077 $mailboxAction->active = $oneDistributionList->published;
1078 $mailboxAction->frequency = $oneDistributionList->frequency;
1079 $mailboxAction->description = $oneDistributionList->description;
1080
1081 $mailboxAction->server = $oneDistributionList->server;
1082 $mailboxAction->username = $oneDistributionList->username;
1083 $mailboxAction->password = $oneDistributionList->password;
1084 $mailboxAction->connection_method = $oneDistributionList->connection_method;
1085 $mailboxAction->secure_method = $oneDistributionList->secure_method;
1086 $mailboxAction->port = $oneDistributionList->port;
1087 $mailboxAction->self_signed = $oneDistributionList->self_signed;
1088
1089 $mailboxAction->delete_wrong_emails = $oneDistributionList->delete_wrong_emails;
1090
1091 $oneDistributionList->conditions = json_decode($oneDistributionList->conditions, true);
1092 $mailboxAction->conditions = [
1093 'sender' => '',
1094 'specific' => '',
1095 'groups' => [],
1096 'lists' => [],
1097 'subject' => '',
1098 'subject_text' => '',
1099 'subject_regex' => '',
1100 ];
1101
1102 if ($oneDistributionList->conditions['sender'] === 'specific') {
1103 $mailboxAction->conditions['sender'] = 'specific';
1104 $mailboxAction->conditions['specific'] = $oneDistributionList->conditions['specific'];
1105 } elseif ($oneDistributionList->conditions['sender'] === 'group') {
1106 $mailboxAction->conditions['sender'] = 'groups';
1107 if ($oneDistributionList->conditions['group'] === 'all') {
1108 $mailboxAction->conditions['groups'] = array_keys($groups);
1109 } else {
1110 $mailboxAction->conditions['groups'] = $oneDistributionList->conditions['group'];
1111 }
1112 } elseif ($oneDistributionList->conditions['sender'] === 'list') {
1113 $mailboxAction->conditions['sender'] = 'lists';
1114 if ($oneDistributionList->conditions['listids'] === 'All') {
1115 $mailboxAction->conditions['lists'] = $standardLists;
1116 } else {
1117 $mailboxAction->conditions['lists'] = is_array($oneDistributionList->conditions['listids']) ? $oneDistributionList->conditions['listids']
1118 : [$oneDistributionList->conditions['listids']];
1119 }
1120 }
1121
1122 if ($oneDistributionList->conditions['subject'] !== 'all') {
1123 $mailboxAction->conditions['subject'] = $oneDistributionList->conditions['subject'];
1124 $mailboxAction->conditions['subject_text'] = $oneDistributionList->conditions['subjectvalue'];
1125 }
1126
1127 $mailboxAction->conditions['subject_remove'] = $oneDistributionList->conditions['removeSubject'];
1128
1129
1130 $oneDistributionList->actions = json_decode($oneDistributionList->actions, true);
1131 $mailboxAction->actions = [];
1132
1133 foreach ($oneDistributionList->actions as $oneAction) {
1134 if ($oneAction['type'] === 'forward') {
1135 $mailboxAction->actions[] = [
1136 'forward_specific' => [
1137 'addresses' => $oneAction['forward'],
1138 'template_id' => $oneAction['template'],
1139 ],
1140 ];
1141 } elseif ($oneAction['type'] === 'forwardlist') {
1142 $mailboxAction->actions[] = [
1143 'forward_list' => [
1144 'list_id' => $oneAction['list'],
1145 'template_id' => $oneAction['template'],
1146 ],
1147 ];
1148 } elseif ($oneAction['type'] === 'subscribe') {
1149 $mailboxAction->actions[] = [
1150 'acy_list_subscribe' => [
1151 'list_id' => $oneAction['list'],
1152 ],
1153 ];
1154 } elseif ($oneAction['type'] === 'unsubscribe') {
1155 $mailboxAction->actions[] = [
1156 'acy_list_unsubscribe' => [
1157 'list_id' => $oneAction['list'],
1158 ],
1159 ];
1160 }
1161 }
1162
1163 $mailboxAction->conditions = json_encode($mailboxAction->conditions);
1164 $mailboxAction->actions = json_encode($mailboxAction->actions);
1165
1166 $mailboxAction->senderfrom = $oneDistributionList->senderfrom;
1167 $mailboxAction->senderto = $oneDistributionList->senderto;
1168
1169 $mailboxClass->save($mailboxAction);
1170 }
1171
1172 return 0;
1173 }
1174
1175 private function migrateSubscriptions(array $params): int
1176 {
1177 $queryGetSubscriptions = 'SELECT `listid`, `subid`, `subdate`, `unsubdate`, `status` FROM #__acymailing_listsub LIMIT '.intval($params['currentElement']).', '.intval(
1178 $params['insertPerCalls']
1179 );
1180
1181 $subscriptions = acym_loadObjectList($queryGetSubscriptions);
1182
1183 if (empty($subscriptions)) {
1184 return 0;
1185 }
1186
1187 $subscriptionsToInsert = [];
1188
1189 foreach ($subscriptions as $oneSubscription) {
1190 if (empty($oneSubscription->subid) || empty($oneSubscription->listid)) {
1191 continue;
1192 }
1193
1194 if ($oneSubscription->status == 2) $oneSubscription->status = 1;
1195
1196 $subscription = [
1197 'user_id' => acym_escapeDB($oneSubscription->subid),
1198 'list_id' => acym_escapeDB($oneSubscription->listid),
1199 'status' => acym_escapeDB($oneSubscription->status == -1 ? 0 : $oneSubscription->status),
1200 'subscription_date' => empty($oneSubscription->subdate) ? 'NULL' : acym_escapeDB(acym_date($oneSubscription->subdate, 'Y-m-d H:i:s')),
1201 'unsubscribe_date' => empty($oneSubscription->unsubdate) ? 'NULL' : acym_escapeDB(acym_date($oneSubscription->unsubdate, 'Y-m-d H:i:s')),
1202 ];
1203
1204 $subscriptionsToInsert[] = '('.implode(', ', $subscription).')';
1205 }
1206
1207 if (empty($subscriptionsToInsert)) {
1208 return 0;
1209 }
1210
1211 $queryInsert = 'INSERT IGNORE INTO #__acym_user_has_list (`user_id`, `list_id`, `status`, `subscription_date`, `unsubscribe_date`) VALUES '.implode(
1212 ', ',
1213 $subscriptionsToInsert
1214 ).';';
1215
1216 return $this->insertQuery($queryInsert);
1217 }
1218
1219 private function migrateMailHasLists(array $params): int
1220 {
1221 $queryGetMailHasLists = 'SELECT listmail.`mailid`, listmail.`listid`
1222 FROM #__acymailing_listmail AS listmail
1223 JOIN #__acymailing_mail AS mail ON mail.`mailid` = listmail.`mailid`
1224 WHERE mail.`type` IN ("news", "unsub", "welcome", "followup")
1225 LIMIT '.intval($params['currentElement']).', '.intval($params['insertPerCalls']);
1226
1227 $mailHasLists = acym_loadObjectList($queryGetMailHasLists);
1228 if (empty($mailHasLists)) {
1229 return 0;
1230 }
1231
1232 $mailHasListsToInsert = [];
1233
1234 foreach ($mailHasLists as $oneMailHasLists) {
1235 if (empty($oneMailHasLists->mailid) || empty($oneMailHasLists->listid)) {
1236 continue;
1237 }
1238
1239 $mailHasListsToInsert[] = '('.intval($oneMailHasLists->mailid).', '.intval($oneMailHasLists->listid).')';
1240 }
1241
1242 if (empty($mailHasListsToInsert)) {
1243 return 0;
1244 }
1245
1246 $queryInsert = 'INSERT IGNORE INTO #__acym_mail_has_list (`mail_id`, `list_id`) VALUES '.implode(',', $mailHasListsToInsert).';';
1247
1248 return $this->insertQuery($queryInsert);
1249 }
1250
1251 private function migrateMailStats(array $params): int
1252 {
1253 $queryGetStats = 'SELECT `mailid`, `senthtml`, `senttext`, `senddate`, `fail`, `openunique`, `opentotal` FROM #__acymailing_stats LIMIT '.intval(
1254 $params['currentElement']
1255 ).', '.intval($params['insertPerCalls']);
1256
1257 $stats = acym_loadObjectList($queryGetStats);
1258 if (empty($stats)) {
1259 return 0;
1260 }
1261
1262
1263 $statsToInsert = [];
1264
1265 $allMails = acym_loadResultArray('SELECT id FROM #__acym_mail');
1266
1267 foreach ($stats as $oneStat) {
1268 if (empty($oneStat->mailid) || !in_array($oneStat->mailid, $allMails)) {
1269 continue;
1270 }
1271
1272 $totalSent = intval($oneStat->senthtml) + intval($oneStat->senttext);
1273 $stat = [
1274 'mail_id' => acym_escapeDB($oneStat->mailid),
1275 'total_subscribers' => acym_escapeDB($totalSent + $oneStat->fail),
1276 'sent' => acym_escapeDB($totalSent),
1277 'send_date' => empty($oneStat->senddate) ? 'NULL' : acym_escapeDB(acym_date($oneStat->senddate, 'Y-m-d H:i:s', false)),
1278 'fail' => acym_escapeDB($oneStat->fail),
1279 'open_unique' => intval($oneStat->openunique),
1280 'open_total' => intval($oneStat->opentotal),
1281 ];
1282 $statsToInsert[] = '('.implode(', ', $stat).')';
1283 }
1284
1285 if (empty($statsToInsert)) {
1286 return 0;
1287 }
1288
1289 $queryInsert = 'INSERT IGNORE INTO #__acym_mail_stat (`mail_id`, `total_subscribers`, `sent`, `send_date`, `fail`, `open_unique`, `open_total`) VALUES '.implode(
1290 ',',
1291 $statsToInsert
1292 ).';';
1293
1294 return $this->insertQuery($queryInsert);
1295 }
1296
1297 private function migrateWelcomeunsub(array $params): int
1298 {
1299 $queryGetIds = 'SELECT `listid`, `welmailid`, `unsubmailid` FROM #__acymailing_list LIMIT '.intval($params['currentElement']).', '.intval($params['insertPerCalls']);
1300
1301 $ids = acym_loadObjectList($queryGetIds);
1302
1303 if (empty($ids)) {
1304 return 0;
1305 }
1306
1307 $idsToInsert = [];
1308
1309 foreach ($ids as $oneId) {
1310 if (empty($oneId->listid) || (empty($oneId->welmailid) && empty($oneId->unsubmailid))) {
1311 continue;
1312 }
1313
1314 $welId = empty($oneId->welmailid) ? 'NULL' : intval($oneId->welmailid);
1315 $unsId = empty($oneId->unsubmailid) ? 'NULL' : intval($oneId->unsubmailid);
1316
1317 $id = [
1318 'id' => intval($oneId->listid),
1319 'welcome_id' => $welId,
1320 'unsubscribe_id' => $unsId,
1321 ];
1322
1323 $idsToInsert[] = '('.implode(', ', $id).')';
1324 }
1325
1326 if (empty($idsToInsert)) {
1327 return 0;
1328 }
1329
1330 $queryInsert = 'INSERT IGNORE INTO #__acym_list(`id`, `welcome_id`, `unsubscribe_id`) VALUES '.implode(
1331 ',',
1332 $idsToInsert
1333 ).' ON DUPLICATE KEY UPDATE `welcome_id` = VALUES(`welcome_id`), `unsubscribe_id` = VALUES(`unsubscribe_id`)';
1334
1335 return $this->insertQuery($queryInsert);
1336 }
1337
1338 private function insertQuery(string $queryInsert): int
1339 {
1340 try {
1341 $resultQuery = acym_query($queryInsert);
1342 } catch (\Exception $e) {
1343 $this->errors[] = $e->getMessage();
1344
1345 return -1;
1346 }
1347
1348 if ($resultQuery === null) {
1349 $this->errors[] = acym_getDBError();
1350
1351 return -1;
1352 } else {
1353 return intval($resultQuery);
1354 }
1355 }
1356
1357 private function cleanFieldsTable(): bool
1358 {
1359 $queryClean = [
1360 'DELETE FROM #__acym_user_has_field',
1361 'DELETE FROM #__acym_field WHERE `id` NOT IN (1,2)',
1362 ];
1363
1364 return $this->finalizeClean($queryClean);
1365 }
1366
1367 private function cleanUsers_fieldsTable(): bool
1368 {
1369 return true;
1370 }
1371
1372 private function finalizeClean(array $queryClean): bool
1373 {
1374 $hasError = false;
1375
1376 foreach ($queryClean as $oneQuery) {
1377 try {
1378 $res = acym_query($oneQuery);
1379 } catch (\Exception $e) {
1380 $res = null;
1381 }
1382 if ($res === null) {
1383 $this->errors[] = isset($e) ? $e->getMessage() : acym_getDBError();
1384 $hasError = true;
1385 break;
1386 }
1387 }
1388
1389 return !$hasError;
1390 }
1391
1392 private function cleanMailsTable(): bool
1393 {
1394 $queryClean = [
1395 'UPDATE #__acym_list SET `unsubscribe_id` = NULL',
1396 'UPDATE #__acym_list SET `welcome_id` = NULL',
1397 'UPDATE #__acym_mail SET `parent_id` = NULL',
1398 'DELETE FROM #__acym_mail_archive',
1399 'DELETE FROM #__acym_followup_has_mail',
1400 'DELETE FROM #__acym_followup',
1401 'DELETE FROM #__acym_tag WHERE `type` = "mail"',
1402 'DELETE FROM #__acym_mail_override',
1403 'DELETE FROM #__acym_campaign WHERE `mail_id` IS NOT NULL',
1404 'DELETE FROM #__acym_campaign',
1405 'DELETE FROM #__acym_queue',
1406 'DELETE FROM #__acym_mail_has_list',
1407 'DELETE FROM #__acym_user_stat',
1408 'DELETE FROM #__acym_url_click',
1409 'DELETE FROM #__acym_mail_stat',
1410 'DELETE FROM #__acym_mail',
1411 ];
1412
1413 return $this->finalizeClean($queryClean);
1414 }
1415
1416 private function cleanListsTable(): bool
1417 {
1418 $queryClean = [
1419 'UPDATE #__acym_followup SET `list_id` = NULL',
1420 'DELETE FROM #__acym_tag WHERE `type` = "list"',
1421 'DELETE FROM #__acym_mail_has_list',
1422 'DELETE FROM #__acym_user_has_list',
1423 'DELETE FROM #__acym_list',
1424 ];
1425
1426 return $this->finalizeClean($queryClean);
1427 }
1428
1429 private function cleanUsersTable(): bool
1430 {
1431 $queryClean = [
1432 'DELETE FROM `#__acym_user_has_field`',
1433 'DELETE FROM `#__acym_user_has_list`',
1434 'DELETE FROM `#__acym_queue`',
1435 'DELETE FROM `#__acym_user`',
1436 ];
1437
1438 return $this->finalizeClean($queryClean);
1439 }
1440
1441 private function cleanBounceTable(): bool
1442 {
1443 $queryClean = [
1444 'DELETE FROM `#__acym_rule`',
1445 ];
1446
1447 return $this->finalizeClean($queryClean);
1448 }
1449
1450 private function cleanDistribTable(): bool
1451 {
1452 $queryClean = [
1453 'DELETE FROM `#__acym_mailbox_action`',
1454 ];
1455
1456 return $this->finalizeClean($queryClean);
1457 }
1458 }
1459