1: <?php
2: namespace Opencart\Admin\Controller\Mail;
3: /**
4: * Class Gdpr
5: *
6: * @package Opencart\Admin\Controller\Mail
7: */
8: class Gdpr extends \Opencart\System\Engine\Controller {
9: // admin/model/customer/gdpr/editStatus
10: /**
11: * Index
12: *
13: * @param string $route
14: * @param array<int, mixed> $args
15: * @param mixed $output
16: *
17: * @return void
18: */
19: public function index(string &$route, array &$args, &$output): void {
20: $this->load->model('customer/gdpr');
21:
22: $gdpr_info = $this->model_customer_gdpr->getGdpr($args[0]);
23:
24: if ($gdpr_info) {
25: // Choose which mail to send
26:
27: // Export plus complete
28: if ($gdpr_info['action'] == 'export' && (int)$args[1] == 3) {
29: $this->export($gdpr_info);
30: }
31:
32: // Approve plus processing
33: if ($gdpr_info['action'] == 'approve' && (int)$args[1] == 2) {
34: $this->approve($gdpr_info);
35: }
36:
37: // Remove plus complete
38: if ($gdpr_info['action'] == 'remove' && (int)$args[1] == 3) {
39: $this->remove($gdpr_info);
40: }
41:
42: // Deny
43: if ($args[1] == -1) {
44: $this->deny($gdpr_info);
45: }
46: }
47: }
48:
49: /**
50: * Export
51: *
52: * @param array<string, mixed> $gdpr_info
53: *
54: * @throws \Exception
55: *
56: * @return void
57: */
58: public function export(array $gdpr_info): void {
59: $this->load->model('setting/store');
60:
61: $store_info = $this->model_setting_store->getStore($gdpr_info['store_id']);
62:
63: if ($store_info) {
64: $this->load->model('setting/setting');
65:
66: $store_logo = html_entity_decode($this->model_setting_setting->getValue('config_logo', $store_info['store_id']), ENT_QUOTES, 'UTF-8');
67: $store_name = html_entity_decode($store_info['name'], ENT_QUOTES, 'UTF-8');
68: $store_url = $store_info['url'];
69: } else {
70: $store_logo = html_entity_decode($this->config->get('config_logo'), ENT_QUOTES, 'UTF-8');
71: $store_name = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');
72: $store_url = HTTP_CATALOG;
73: }
74:
75: // Send the email in the correct language
76: $this->load->model('localisation/language');
77:
78: $language_info = $this->model_localisation_language->getLanguage($gdpr_info['language_id']);
79:
80: if ($language_info) {
81: $language_code = $language_info['code'];
82: } else {
83: $language_code = $this->config->get('config_language');
84: }
85:
86: // Load the language for any mails using a different country code and prefixing it so it does not pollute the main data pool.
87: $this->load->language('default', 'mail', $language_code);
88: $this->load->language('mail/gdpr_export', 'mail', $language_code);
89:
90: // Add language vars to the template folder
91: $results = $this->language->all('mail');
92:
93: foreach ($results as $key => $value) {
94: $data[$key] = $value;
95: }
96:
97: $subject = sprintf($this->language->get('mail_text_subject'), $store_name);
98:
99: if (is_file(DIR_IMAGE . $store_logo)) {
100: $data['logo'] = $store_url . 'image/' . $store_logo;
101: } else {
102: $data['logo'] = '';
103: }
104:
105: $this->load->model('customer/customer');
106:
107: $customer_info = $this->model_customer_customer->getCustomerByEmail($gdpr_info['email']);
108:
109: if ($customer_info) {
110: $data['text_hello'] = sprintf($this->language->get('mail_text_hello'), html_entity_decode($customer_info['firstname'], ENT_QUOTES, 'UTF-8'));
111: } else {
112: $data['text_hello'] = sprintf($this->language->get('mail_text_hello'), $this->language->get('mail_text_user'));
113: }
114:
115: // Personal info
116: if ($customer_info) {
117: $data['customer_id'] = $customer_info['customer_id'];
118: $data['firstname'] = $customer_info['firstname'];
119: $data['lastname'] = $customer_info['lastname'];
120: $data['email'] = $customer_info['email'];
121: $data['telephone'] = $customer_info['telephone'];
122: }
123:
124: // Addresses
125: $data['addresses'] = [];
126:
127: if ($customer_info) {
128: $results = $this->model_customer_customer->getAddresses($customer_info['customer_id']);
129:
130: foreach ($results as $result) {
131: $address = [
132: 'firstname' => $result['firstname'],
133: 'lastname' => $result['lastname'],
134: 'address_1' => $result['address_1'],
135: 'address_2' => $result['address_2'],
136: 'city' => $result['city'],
137: 'postcode' => $result['postcode'],
138: 'country' => $result['country'],
139: 'zone' => $result['zone']
140: ];
141:
142: if (!in_array($address, $data['addresses'])) {
143: $data['addresses'][] = $address;
144: }
145: }
146: }
147:
148: // Order Addresses
149: $this->load->model('sale/order');
150:
151: $results = $this->model_sale_order->getOrders(['filter_email' => $gdpr_info['email']]);
152:
153: foreach ($results as $result) {
154: $order_info = $this->model_sale_order->getOrder($result['order_id']);
155:
156: if ($order_info['payment_country_id']) {
157: $address = [
158: 'firstname' => $order_info['payment_firstname'],
159: 'lastname' => $order_info['payment_lastname'],
160: 'address_1' => $order_info['payment_address_1'],
161: 'address_2' => $order_info['payment_address_2'],
162: 'city' => $order_info['payment_city'],
163: 'postcode' => $order_info['payment_postcode'],
164: 'country' => $order_info['payment_country'],
165: 'zone' => $order_info['payment_zone']
166: ];
167:
168: if (!in_array($address, $data['addresses'])) {
169: $data['addresses'][] = $address;
170: }
171: }
172:
173: if ($order_info['shipping_country_id']) {
174: $address = [
175: 'firstname' => $order_info['shipping_firstname'],
176: 'lastname' => $order_info['shipping_lastname'],
177: 'address_1' => $order_info['shipping_address_1'],
178: 'address_2' => $order_info['shipping_address_2'],
179: 'city' => $order_info['shipping_city'],
180: 'postcode' => $order_info['shipping_postcode'],
181: 'country' => $order_info['shipping_country'],
182: 'zone' => $order_info['shipping_zone']
183: ];
184:
185: if (!in_array($address, $data['addresses'])) {
186: $data['addresses'][] = $address;
187: }
188: }
189: }
190:
191: // Ip's
192: $data['ips'] = [];
193:
194: if ($customer_info) {
195: $results = $this->model_customer_customer->getIps($customer_info['customer_id']);
196:
197: foreach ($results as $result) {
198: $data['ips'][] = [
199: 'ip' => $result['ip'],
200: 'date_added' => date($this->language->get('mail_datetime_format'), strtotime($result['date_added']))
201: ];
202: }
203: }
204:
205: $data['store_name'] = $store_name;
206: $data['store_url'] = $store_url;
207:
208: if ($this->config->get('config_mail_engine')) {
209: $mail_option = [
210: 'parameter' => $this->config->get('config_mail_parameter'),
211: 'smtp_hostname' => $this->config->get('config_mail_smtp_hostname'),
212: 'smtp_username' => $this->config->get('config_mail_smtp_username'),
213: 'smtp_password' => html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'),
214: 'smtp_port' => $this->config->get('config_mail_smtp_port'),
215: 'smtp_timeout' => $this->config->get('config_mail_smtp_timeout')
216: ];
217:
218: $mail = new \Opencart\System\Library\Mail($this->config->get('config_mail_engine'), $mail_option);
219: $mail->setTo($gdpr_info['email']);
220: $mail->setFrom($this->config->get('config_email'));
221: $mail->setSender($store_name);
222: $mail->setSubject($subject);
223: $mail->setHtml($this->load->view('mail/gdpr_export', $data));
224: $mail->send();
225: }
226: }
227:
228: /**
229: * Approve
230: *
231: * @param array<string, mixed> $gdpr_info
232: *
233: * @throws \Exception
234: *
235: * @return void
236: */
237: public function approve(array $gdpr_info): void {
238: $this->load->model('setting/store');
239:
240: $store_info = $this->model_setting_store->getStore($gdpr_info['store_id']);
241:
242: if ($store_info) {
243: $this->load->model('setting/setting');
244:
245: $store_logo = html_entity_decode($this->model_setting_setting->getValue('config_logo', $store_info['store_id']), ENT_QUOTES, 'UTF-8');
246: $store_name = html_entity_decode($store_info['name'], ENT_QUOTES, 'UTF-8');
247: $store_url = $store_info['url'];
248: } else {
249: $store_logo = html_entity_decode($this->config->get('config_logo'), ENT_QUOTES, 'UTF-8');
250: $store_name = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');
251: $store_url = HTTP_CATALOG;
252: }
253:
254: // Send the email in the correct language
255: $this->load->model('localisation/language');
256:
257: $language_info = $this->model_localisation_language->getLanguage($gdpr_info['language_id']);
258:
259: if ($language_info) {
260: $language_code = $language_info['code'];
261: } else {
262: $language_code = $this->config->get('config_language');
263: }
264:
265: // Load the language for any mails using a different country code and prefixing it so it does not pollute the main data pool.
266: $this->load->language('default', 'mail', $language_code);
267: $this->load->language('mail/gdpr_approve', 'mail', $language_code);
268:
269: // Add language vars to the template folder
270: $results = $this->language->all('mail');
271:
272: foreach ($results as $key => $value) {
273: $data[$key] = $value;
274: }
275:
276: $subject = sprintf($this->language->get('mail_text_subject'), $store_name);
277:
278: $this->load->model('tool/image');
279:
280: if (is_file(DIR_IMAGE . $store_logo)) {
281: $data['logo'] = $store_url . 'image/' . $store_logo;
282: } else {
283: $data['logo'] = '';
284: }
285:
286: $this->load->model('customer/customer');
287:
288: $customer_info = $this->model_customer_customer->getCustomerByEmail($gdpr_info['email']);
289:
290: if ($customer_info) {
291: $data['text_hello'] = sprintf($this->language->get('mail_text_hello'), html_entity_decode($customer_info['firstname'], ENT_QUOTES, 'UTF-8'));
292: } else {
293: $data['text_hello'] = sprintf($this->language->get('mail_text_hello'), $this->language->get('mail_text_user'));
294: }
295:
296: $data['text_gdpr'] = sprintf($this->language->get('mail_text_gdpr'), $this->config->get('config_gdpr_limit'));
297: $data['text_a'] = sprintf($this->language->get('mail_text_a'), $this->config->get('config_gdpr_limit'));
298:
299: $data['store_name'] = $store_name;
300: $data['store_url'] = $store_url;
301:
302: if ($this->config->get('config_mail_engine')) {
303: $mail_option = [
304: 'parameter' => $this->config->get('config_mail_parameter'),
305: 'smtp_hostname' => $this->config->get('config_mail_smtp_hostname'),
306: 'smtp_username' => $this->config->get('config_mail_smtp_username'),
307: 'smtp_password' => html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'),
308: 'smtp_port' => $this->config->get('config_mail_smtp_port'),
309: 'smtp_timeout' => $this->config->get('config_mail_smtp_timeout')
310: ];
311:
312: $mail = new \Opencart\System\Library\Mail($this->config->get('config_mail_engine'), $mail_option);
313: $mail->setTo($gdpr_info['email']);
314: $mail->setFrom($this->config->get('config_email'));
315: $mail->setSender($store_name);
316: $mail->setSubject($subject);
317: $mail->setHtml($this->load->view('mail/gdpr_approve', $data));
318: $mail->send();
319: }
320: }
321:
322: /**
323: * Deny
324: *
325: * @param array<string, mixed> $gdpr_info
326: *
327: * @throws \Exception
328: *
329: * @return void
330: */
331: public function deny(array $gdpr_info): void {
332: $this->load->model('setting/store');
333:
334: $store_info = $this->model_setting_store->getStore($gdpr_info['store_id']);
335:
336: if ($store_info) {
337: $this->load->model('setting/setting');
338:
339: $store_logo = html_entity_decode($this->model_setting_setting->getValue('config_logo', $store_info['store_id']), ENT_QUOTES, 'UTF-8');
340: $store_name = html_entity_decode($store_info['name'], ENT_QUOTES, 'UTF-8');
341: $store_url = $store_info['url'];
342: } else {
343: $store_logo = html_entity_decode($this->config->get('config_logo'), ENT_QUOTES, 'UTF-8');
344: $store_name = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');
345: $store_url = HTTP_CATALOG;
346: }
347:
348: // Send the email in the correct language
349: $this->load->model('localisation/language');
350:
351: $language_info = $this->model_localisation_language->getLanguage($gdpr_info['language_id']);
352:
353: if ($language_info) {
354: $language_code = $language_info['code'];
355: } else {
356: $language_code = $this->config->get('config_language');
357: }
358:
359: // Load the language for any mails using a different country code and prefixing it so it does not pollute the main data pool.
360: $this->load->language('default', 'mail', $language_code);
361: $this->load->language('mail/gdpr_deny', 'mail', $language_code);
362:
363: // Add language vars to the template folder
364: $results = $this->language->all('mail');
365:
366: foreach ($results as $key => $value) {
367: $data[$key] = $value;
368: }
369:
370: $subject = sprintf($this->language->get('mail_text_subject'), $store_name);
371:
372: $this->load->model('tool/image');
373:
374: if (is_file(DIR_IMAGE . $store_logo)) {
375: $data['logo'] = $store_url . 'image/' . $store_logo;
376: } else {
377: $data['logo'] = '';
378: }
379:
380: $data['text_request'] = $this->language->get('mail_text_' . $gdpr_info['action']);
381:
382: $this->load->model('customer/customer');
383:
384: $customer_info = $this->model_customer_customer->getCustomerByEmail($gdpr_info['email']);
385:
386: if ($customer_info) {
387: $data['text_hello'] = sprintf($this->language->get('mail_text_hello'), html_entity_decode($customer_info['firstname'], ENT_QUOTES, 'UTF-8'));
388: } else {
389: $data['text_hello'] = sprintf($this->language->get('mail_text_hello'), $this->language->get('mail_text_user'));
390: }
391:
392: $data['store_name'] = $store_name;
393: $data['store_url'] = $store_url;
394: $data['contact'] = $store_url . 'index.php?route=information/contact';
395:
396: if ($this->config->get('config_mail_engine')) {
397: $mail_option = [
398: 'parameter' => $this->config->get('config_mail_parameter'),
399: 'smtp_hostname' => $this->config->get('config_mail_smtp_hostname'),
400: 'smtp_username' => $this->config->get('config_mail_smtp_username'),
401: 'smtp_password' => html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'),
402: 'smtp_port' => $this->config->get('config_mail_smtp_port'),
403: 'smtp_timeout' => $this->config->get('config_mail_smtp_timeout')
404: ];
405:
406: $mail = new \Opencart\System\Library\Mail($this->config->get('config_mail_engine'), $mail_option);
407: $mail->setTo($gdpr_info['email']);
408: $mail->setFrom($this->config->get('config_email'));
409: $mail->setSender($store_name);
410: $mail->setSubject($subject);
411: $mail->setHtml($this->load->view('mail/gdpr_deny', $data));
412: $mail->send();
413: }
414: }
415:
416: /**
417: * Remove
418: *
419: * @param array<string, mixed> $gdpr_info
420: *
421: * @throws \Exception
422: *
423: * @return void
424: */
425: public function remove(array $gdpr_info): void {
426: $this->load->model('setting/store');
427:
428: $store_info = $this->model_setting_store->getStore($gdpr_info['store_id']);
429:
430: if ($store_info) {
431: $this->load->model('setting/setting');
432:
433: $store_logo = html_entity_decode($this->model_setting_setting->getValue('config_logo', $store_info['store_id']), ENT_QUOTES, 'UTF-8');
434: $store_name = html_entity_decode($store_info['name'], ENT_QUOTES, 'UTF-8');
435: $store_url = $store_info['url'];
436: } else {
437: $store_logo = html_entity_decode($this->config->get('config_logo'), ENT_QUOTES, 'UTF-8');
438: $store_name = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');
439: $store_url = HTTP_CATALOG;
440: }
441:
442: // Send the email in the correct language
443: $this->load->model('localisation/language');
444:
445: $language_info = $this->model_localisation_language->getLanguage($gdpr_info['language_id']);
446:
447: if ($language_info) {
448: $language_code = $language_info['code'];
449: } else {
450: $language_code = $this->config->get('config_language');
451: }
452:
453: // Load the language for any mails using a different country code and prefixing it so it does not pollute the main data pool.
454: $this->load->language('default', 'mail', $language_code);
455: $this->load->language('mail/gdpr_delete', 'mail', $language_code);
456:
457: // Add language vars to the template folder
458: $results = $this->language->all('mail');
459:
460: foreach ($results as $key => $value) {
461: $data[$key] = $value;
462: }
463:
464: $subject = sprintf($this->language->get('mail_text_subject'), $store_name);
465:
466: $this->load->model('tool/image');
467:
468: if (is_file(DIR_IMAGE . $store_logo)) {
469: $data['logo'] = $store_url . 'image/' . $store_logo;
470: } else {
471: $data['logo'] = '';
472: }
473:
474: $this->load->model('customer/customer');
475:
476: $customer_info = $this->model_customer_customer->getCustomerByEmail($gdpr_info['email']);
477:
478: if ($customer_info) {
479: $data['text_hello'] = sprintf($this->language->get('mail_text_hello'), html_entity_decode($customer_info['firstname'], ENT_QUOTES, 'UTF-8'));
480: } else {
481: $data['text_hello'] = sprintf($this->language->get('mail_text_hello'), $this->language->get('mail_text_user'));
482: }
483:
484: $data['store_name'] = $store_name;
485: $data['store_url'] = $store_url;
486: $data['contact'] = $store_url . 'index.php?route=information/contact';
487:
488: if ($this->config->get('config_mail_engine')) {
489: $mail_option = [
490: 'parameter' => $this->config->get('config_mail_parameter'),
491: 'smtp_hostname' => $this->config->get('config_mail_smtp_hostname'),
492: 'smtp_username' => $this->config->get('config_mail_smtp_username'),
493: 'smtp_password' => html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'),
494: 'smtp_port' => $this->config->get('config_mail_smtp_port'),
495: 'smtp_timeout' => $this->config->get('config_mail_smtp_timeout')
496: ];
497:
498: $mail = new \Opencart\System\Library\Mail($this->config->get('config_mail_engine'), $mail_option);
499: $mail->setTo($gdpr_info['email']);
500: $mail->setFrom($this->config->get('config_email'));
501: $mail->setSender($store_name);
502: $mail->setSubject($subject);
503: $mail->setHtml($this->load->view('mail/gdpr_delete', $data));
504: $mail->send();
505: }
506: }
507: }
508: