1<?php
2class ControllerExtensionPaymentSecureTradingPp extends Controller {
3	private $error = array();
4
5	public function index() {
6		$this->load->model('setting/setting');
7		$this->load->model('localisation/geo_zone');
8		$this->load->model('localisation/order_status');
9		$this->load->language('extension/payment/securetrading_pp');
10
11		if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
12			$this->request->post['payment_securetrading_pp_site_reference'] = trim($this->request->post['payment_securetrading_pp_site_reference']);
13
14			$this->model_setting_setting->editSetting('payment_securetrading_pp', $this->request->post);
15
16			$this->session->data['success'] = $this->language->get('text_success');
17
18			$this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true));
19		}
20
21		if (isset($this->request->post['payment_securetrading_pp_site_reference'])) {
22			$data['payment_securetrading_pp_site_reference'] = $this->request->post['payment_securetrading_pp_site_reference'];
23		} else {
24			$data['payment_securetrading_pp_site_reference'] = $this->config->get('payment_securetrading_pp_site_reference');
25		}
26
27		if (isset($this->request->post['payment_securetrading_pp_version'])) {
28			$data['payment_securetrading_pp_version'] = $this->request->post['payment_securetrading_pp_version'];
29		} else {
30			$data['payment_securetrading_pp_version'] = $this->config->get('payment_securetrading_pp_version');
31		}
32
33		if (isset($this->request->post['payment_securetrading_pp_username'])) {
34			$data['payment_securetrading_pp_username'] = $this->request->post['payment_securetrading_pp_username'];
35		} else {
36			$data['payment_securetrading_pp_username'] = $this->config->get('payment_securetrading_pp_username');
37		}
38
39		if (isset($this->request->post['payment_securetrading_pp_password'])) {
40			$data['payment_securetrading_pp_password'] = $this->request->post['payment_securetrading_pp_password'];
41		} else {
42			$data['payment_securetrading_pp_password'] = $this->config->get('payment_securetrading_pp_password');
43		}
44
45		if (isset($this->request->post['payment_securetrading_pp_notification_password'])) {
46			$data['payment_securetrading_pp_notification_password'] = $this->request->post['payment_securetrading_pp_notification_password'];
47		} else {
48			$data['payment_securetrading_pp_notification_password'] = $this->config->get('payment_securetrading_pp_notification_password');
49		}
50
51		if (isset($this->request->post['payment_securetrading_pp_site_security_password'])) {
52			$data['payment_securetrading_pp_site_security_password'] = $this->request->post['payment_securetrading_pp_site_security_password'];
53		} else {
54			$data['payment_securetrading_pp_site_security_password'] = $this->config->get('payment_securetrading_pp_site_security_password');
55		}
56
57		if (isset($this->request->post['payment_securetrading_pp_site_security_status'])) {
58			$data['payment_securetrading_pp_site_security_status'] = $this->request->post['payment_securetrading_pp_site_security_status'];
59		} else {
60			$data['payment_securetrading_pp_site_security_status'] = $this->config->get('payment_securetrading_pp_site_security_status');
61		}
62
63		if (isset($this->request->post['payment_securetrading_pp_webservice_username'])) {
64			$data['payment_securetrading_pp_webservice_username'] = $this->request->post['payment_securetrading_pp_webservice_username'];
65		} else {
66			$data['payment_securetrading_pp_webservice_username'] = $this->config->get('payment_securetrading_pp_webservice_username');
67		}
68
69		if (isset($this->request->post['payment_securetrading_pp_webservice_password'])) {
70			$data['payment_securetrading_pp_webservice_password'] = $this->request->post['payment_securetrading_pp_webservice_password'];
71		} else {
72			$data['payment_securetrading_pp_webservice_password'] = $this->config->get('payment_securetrading_pp_webservice_password');
73		}
74
75		if (isset($this->request->post['payment_securetrading_pp_order_status_id'])) {
76			$data['payment_securetrading_pp_order_status_id'] = $this->request->post['payment_securetrading_pp_order_status_id'];
77		} elseif($this->config->get('payment_securetrading_pp_order_status_id') != '') {
78			$data['payment_securetrading_pp_order_status_id'] = $this->config->get('payment_securetrading_pp_order_status_id');
79		} else {
80			$data['payment_securetrading_pp_order_status_id'] = 1;
81		}
82
83		if (isset($this->request->post['payment_securetrading_pp_declined_order_status_id'])) {
84			$data['payment_securetrading_pp_declined_order_status_id'] = $this->request->post['payment_securetrading_pp_declined_order_status_id'];
85		} elseif($this->config->get('payment_securetrading_pp_declined_order_status_id') != '') {
86			$data['payment_securetrading_pp_declined_order_status_id'] = $this->config->get('payment_securetrading_pp_declined_order_status_id');
87		} else {
88			$data['payment_securetrading_pp_declined_order_status_id'] = 8;
89		}
90
91		if (isset($this->request->post['payment_securetrading_pp_refunded_order_status_id'])) {
92			$data['payment_securetrading_pp_refunded_order_status_id'] = $this->request->post['payment_securetrading_pp_refunded_order_status_id'];
93		} elseif($this->config->get('payment_securetrading_pp_refunded_order_status_id') != '') {
94			$data['payment_securetrading_pp_refunded_order_status_id'] = $this->config->get('payment_securetrading_pp_refunded_order_status_id');
95		} else {
96			$data['payment_securetrading_pp_refunded_order_status_id'] = 11;
97		}
98
99		if (isset($this->request->post['payment_securetrading_pp_authorisation_reversed_order_status_id'])) {
100			$data['payment_securetrading_pp_authorisation_reversed_order_status_id'] = $this->request->post['payment_securetrading_pp_authorisation_reversed_order_status_id'];
101		} elseif($this->config->get('payment_securetrading_pp_authorisation_reversed_order_status_id') != '') {
102			$data['payment_securetrading_pp_authorisation_reversed_order_status_id'] = $this->config->get('payment_securetrading_pp_authorisation_reversed_order_status_id');
103		} else {
104			$data['payment_securetrading_pp_authorisation_reversed_order_status_id'] = 12;
105		}
106
107		if (isset($this->request->post['payment_securetrading_pp_settle_status'])) {
108			$data['payment_securetrading_pp_settle_status'] = $this->request->post['payment_securetrading_pp_settle_status'];
109		} else {
110			$data['payment_securetrading_pp_settle_status'] = $this->config->get('payment_securetrading_pp_settle_status');
111		}
112
113		if (isset($this->request->post['payment_securetrading_pp_settle_due_date'])) {
114			$data['payment_securetrading_pp_settle_due_date'] = $this->request->post['payment_securetrading_pp_settle_due_date'];
115		} else {
116			$data['payment_securetrading_pp_settle_due_date'] = $this->config->get('payment_securetrading_pp_settle_due_date');
117		}
118
119		if (isset($this->request->post['payment_securetrading_pp_geo_zone_id'])) {
120			$data['payment_securetrading_pp_geo_zone_id'] = $this->request->post['payment_securetrading_pp_geo_zone_id'];
121		} else {
122			$data['payment_securetrading_pp_geo_zone_id'] = $this->config->get('payment_securetrading_pp_geo_zone_id');
123		}
124
125		if (isset($this->request->post['payment_securetrading_pp_status'])) {
126			$data['payment_securetrading_pp_status'] = $this->request->post['payment_securetrading_pp_status'];
127		} else {
128			$data['payment_securetrading_pp_status'] = $this->config->get('payment_securetrading_pp_status');
129		}
130
131		if (isset($this->request->post['payment_securetrading_pp_sort_order'])) {
132			$data['payment_securetrading_pp_sort_order'] = $this->request->post['payment_securetrading_pp_sort_order'];
133		} else {
134			$data['payment_securetrading_pp_sort_order'] = $this->config->get('payment_securetrading_pp_sort_order');
135		}
136
137		if (isset($this->request->post['payment_securetrading_pp_total'])) {
138			$data['payment_securetrading_pp_total'] = $this->request->post['payment_securetrading_pp_total'];
139		} else {
140			$data['payment_securetrading_pp_total'] = $this->config->get('payment_securetrading_pp_total');
141		}
142
143		if (isset($this->request->post['payment_securetrading_pp_parent_css'])) {
144			$data['payment_securetrading_pp_parent_css'] = $this->request->post['payment_securetrading_pp_parent_css'];
145		} else {
146			$data['payment_securetrading_pp_parent_css'] = $this->config->get('payment_securetrading_pp_parent_css');
147		}
148
149		if (isset($this->request->post['payment_securetrading_pp_child_css'])) {
150			$data['payment_securetrading_pp_child_css'] = $this->request->post['payment_securetrading_pp_child_css'];
151		} else {
152			$data['payment_securetrading_pp_child_css'] = $this->config->get('payment_securetrading_pp_child_css');
153		}
154
155		if (isset($this->request->post['payment_securetrading_pp_cards_accepted'])) {
156			$data['payment_securetrading_pp_cards_accepted'] = $this->request->post['payment_securetrading_pp_cards_accepted'];
157		} else {
158			$data['payment_securetrading_pp_cards_accepted'] = $this->config->get('payment_securetrading_pp_cards_accepted');
159
160			if ($data['payment_securetrading_pp_cards_accepted'] == null) {
161				$data['payment_securetrading_pp_cards_accepted'] = array();
162			}
163		}
164
165		$this->document->setTitle($this->language->get('heading_title'));
166
167		if (isset($this->error['warning'])) {
168			$data['error_warning'] = $this->error['warning'];
169		} else {
170			$data['error_warning'] = '';
171		}
172
173		if (isset($this->error['site_reference'])) {
174			$data['error_site_reference'] = $this->error['site_reference'];
175		} else {
176			$data['error_site_reference'] = '';
177		}
178
179		if (isset($this->error['version'])) {
180			$data['error_version'] = $this->error['version'];
181		} else {
182			$data['error_version'] = '';
183		}
184
185		if (isset($this->error['cards_accepted'])) {
186			$data['error_cards_accepted'] = $this->error['cards_accepted'];
187		} else {
188			$data['error_cards_accepted'] = '';
189		}
190
191		if (isset($this->error['notification_password'])) {
192			$data['error_notification_password'] = $this->error['notification_password'];
193		} else {
194			$data['error_notification_password'] = '';
195		}
196
197		$data['breadcrumbs'] = array();
198
199		$data['breadcrumbs'][] = array(
200			'text' => $this->language->get('text_home'),
201			'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
202		);
203
204		$data['breadcrumbs'][] = array(
205			'text' => $this->language->get('text_extension'),
206			'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)
207		);
208
209		$data['breadcrumbs'][] = array(
210			'text' => $this->language->get('heading_title'),
211			'href' => $this->url->link('extension/payment/securetrading_pp', 'user_token=' . $this->session->data['user_token'], true)
212		);
213
214		$data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();
215		$data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses();
216		$data['cards'] = array(
217			'AMEX' => 'American Express',
218			'VISA' => 'Visa',
219			'DELTA' => 'Visa Debit',
220			'ELECTRON' => 'Visa Electron',
221			'PURCHASING' => 'Visa Purchasing',
222			'VPAY' => 'V Pay',
223			'MASTERCARD' => 'MasterCard',
224			'MASTERCARDDEBIT' => 'MasterCard Debit',
225			'MAESTRO' => 'Maestro',
226			'PAYPAL' => 'PayPal',
227		);
228
229		$data['settlement_statuses'] = array(
230			'0' => $this->language->get('text_pending_settlement'),
231			'1' => $this->language->get('text_pending_settlement_manually_overriden'),
232			'2' => $this->language->get('text_pending_suspended'),
233			'100' => $this->language->get('text_pending_settled'),
234		);
235
236		$data['action'] = $this->url->link('extension/payment/securetrading_pp', 'user_token=' . $this->session->data['user_token'], true);
237
238		$data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true);
239
240		$data['header'] = $this->load->controller('common/header');
241		$data['column_left'] = $this->load->controller('common/column_left');
242		$data['footer'] = $this->load->controller('common/footer');
243
244		$this->response->setOutput($this->load->view('extension/payment/securetrading_pp', $data));
245	}
246
247	public function install() {
248		$this->load->model('extension/payment/securetrading_pp');
249		$this->model_extension_payment_securetrading_pp->install();
250	}
251
252	public function uninstall() {
253		$this->load->model('extension/payment/securetrading_pp');
254		$this->model_extension_payment_securetrading_pp->uninstall();
255	}
256
257	public function order() {
258		if ($this->config->get('payment_securetrading_pp_status')) {
259			$this->load->model('extension/payment/securetrading_pp');
260
261			$securetrading_pp_order = $this->model_extension_payment_securetrading_pp->getOrder($this->request->get['order_id']);
262
263			if (!empty($securetrading_pp_order)) {
264				$this->load->language('extension/payment/securetrading_pp');
265
266				$securetrading_pp_order['total_released'] = $this->model_extension_payment_securetrading_pp->getTotalReleased($securetrading_pp_order['securetrading_pp_order_id']);
267
268				$securetrading_pp_order['total_formatted'] = $this->currency->format($securetrading_pp_order['total'], $securetrading_pp_order['currency_code'], false, false);
269				$securetrading_pp_order['total_released_formatted'] = $this->currency->format($securetrading_pp_order['total_released'], $securetrading_pp_order['currency_code'], false, false);
270
271				$data['securetrading_pp_order'] = $securetrading_pp_order;
272
273				$data['auto_settle'] = $securetrading_pp_order['settle_type'];
274
275				$data['order_id'] = (int)$this->request->get['order_id'];
276
277				$data['user_token'] = $this->session->data['user_token'];
278
279				return $this->load->view('extension/payment/securetrading_pp_order', $data);
280			}
281		}
282	}
283
284	public function void() {
285		$this->load->language('extension/payment/securetrading_pp');
286		$json = array();
287
288		if (isset($this->request->post['order_id']) && $this->request->post['order_id'] != '') {
289			$this->load->model('extension/payment/securetrading_pp');
290
291			$securetrading_pp_order = $this->model_extension_payment_securetrading_pp->getOrder($this->request->post['order_id']);
292
293			$void_response = $this->model_extension_payment_securetrading_pp->void($this->request->post['order_id']);
294
295			$this->model_extension_payment_securetrading_pp->logger('Void result:\r\n' . print_r($void_response, 1));
296
297			if ($void_response !== false) {
298				$response_xml = simplexml_load_string($void_response);
299
300				if ($response_xml->response['type'] == 'ERROR' || (string)$response_xml->response->error->code != '0') {
301					$json['msg'] = (string)$response_xml->response->error->message;
302					$json['error'] = true;
303				} else {
304
305					$this->model_extension_payment_securetrading_pp->addTransaction($securetrading_pp_order['securetrading_pp_order_id'], 'reversed', 0.00);
306					$this->model_extension_payment_securetrading_pp->updateVoidStatus($securetrading_pp_order['securetrading_pp_order_id'], 1);
307
308					$this->data = array(
309						'order_status_id' => $this->config->get('payment_securetrading_pp_authorisation_reversed_order_status_id'),
310						'notify' => false,
311						'comment' => '',
312					);
313
314					$this->load->model('sale/order');
315
316					$this->model_sale_order->addOrderHistory($this->request->post['order_id'], $this->data);
317
318					$json['msg'] = $this->language->get('text_authorisation_reversed');
319					$json['data']['created'] = date("Y-m-d H:i:s");
320					$json['error'] = false;
321				}
322			} else {
323				$json['msg'] = $this->language->get('error_connection');
324				$json['error'] = true;
325			}
326		} else {
327			$json['error'] = true;
328			$json['msg'] = 'Missing data';
329		}
330
331		$this->response->setOutput(json_encode($json));
332	}
333
334	public function release() {
335		$this->load->language('extension/payment/securetrading_pp');
336		$json = array();
337
338		$amount = number_format($this->request->post['amount'], 2);
339
340		if (isset($this->request->post['order_id']) && $this->request->post['order_id'] != '' && isset($amount) && $amount > 0) {
341			$this->load->model('extension/payment/securetrading_pp');
342
343			$securetrading_pp_order = $this->model_extension_payment_securetrading_pp->getOrder($this->request->post['order_id']);
344
345			$release_response = $this->model_extension_payment_securetrading_pp->release($this->request->post['order_id'], $amount);
346
347			$this->model_extension_payment_securetrading_pp->logger('Release result:\r\n' . print_r($release_response, 1));
348
349			if ($release_response !== false) {
350				$response_xml = simplexml_load_string($release_response);
351
352				if ($response_xml->response['type'] == 'ERROR' || (string)$response_xml->response->error->code != '0') {
353					$json['error'] = true;
354					$json['msg'] = (string)$response_xml->response->error->message;
355				} else {
356					$this->model_extension_payment_securetrading_pp->addTransaction($securetrading_pp_order['securetrading_pp_order_id'], 'payment', $amount);
357
358					$total_released = $this->model_extension_payment_securetrading_pp->getTotalReleased($securetrading_pp_order['securetrading_pp_order_id']);
359
360					if ($total_released >= $securetrading_pp_order['total'] || $securetrading_pp_order['settle_type'] == 100) {
361						$this->model_extension_payment_securetrading_pp->updateReleaseStatus($securetrading_pp_order['securetrading_pp_order_id'], 1);
362						$release_status = 1;
363						$json['msg'] = $this->language->get('text_release_ok_order');
364
365						$this->load->model('sale/order');
366
367						$history = array();
368						$history['order_status_id'] = $this->config->get('securetrading_pp_order_status_success_settled_id');
369						$history['comment'] = '';
370						$history['notify'] = '';
371
372						$this->model_sale_order->addOrderHistory($this->request->post['order_id'], $history);
373					} else {
374						$release_status = 0;
375						$json['msg'] = $this->language->get('text_release_ok');
376					}
377
378					$json['data'] = array();
379					$json['data']['created'] = date("Y-m-d H:i:s");
380					$json['data']['amount'] = $amount;
381					$json['data']['release_status'] = $release_status;
382					$json['data']['total'] = (double)$total_released;
383					$json['error'] = false;
384				}
385			} else {
386				$json['error'] = true;
387				$json['msg'] = $this->language->get('error_connection');
388			}
389		} else {
390			$json['error'] = true;
391			$json['msg'] = $this->language->get('error_data_missing');
392		}
393
394		$this->response->setOutput(json_encode($json));
395	}
396
397	public function rebate() {
398		$this->load->language('extension/payment/securetrading_pp');
399		$json = array();
400
401		if (isset($this->request->post['order_id']) && !empty($this->request->post['order_id'])) {
402			$this->load->model('extension/payment/securetrading_pp');
403
404			$securetrading_pp_order = $this->model_extension_payment_securetrading_pp->getOrder($this->request->post['order_id']);
405
406			$amount = number_format($this->request->post['amount'], 2);
407
408			$rebate_response = $this->model_extension_payment_securetrading_pp->rebate($this->request->post['order_id'], $amount);
409
410			$this->model_extension_payment_securetrading_pp->logger('Rebate result:\r\n' . print_r($rebate_response, 1));
411
412			if ($rebate_response !== false) {
413				$response_xml = simplexml_load_string($rebate_response);
414
415				$error_code = (string)$response_xml->response->error->code;
416
417				if ($error_code == '0') {
418
419					$this->model_extension_payment_securetrading_pp->addTransaction($securetrading_pp_order['securetrading_pp_order_id'], 'rebate', $amount * -1);
420
421					$total_rebated = $this->model_extension_payment_securetrading_pp->getTotalRebated($securetrading_pp_order['securetrading_pp_order_id']);
422					$total_released = $this->model_extension_payment_securetrading_pp->getTotalReleased($securetrading_pp_order['securetrading_pp_order_id']);
423
424					if ($total_released <= 0 && $securetrading_pp_order['release_status'] == 1) {
425						$json['status'] = 1;
426						$json['message'] = $this->language->get('text_refund_issued');
427
428						$this->model_extension_payment_securetrading_pp->updateRebateStatus($securetrading_pp_order['securetrading_pp_order_id'], 1);
429						$rebate_status = 1;
430						$json['msg'] = $this->language->get('text_rebate_ok_order');
431
432						$this->load->model('sale/order');
433
434						$history = array();
435						$history['order_status_id'] = $this->config->get('payment_securetrading_pp_refunded_order_status_id');
436						$history['comment'] = '';
437						$history['notify'] = '';
438
439						$this->model_sale_order->addOrderHistory($this->request->post['order_id'], $history);
440					} else {
441						$rebate_status = 0;
442						$json['msg'] = $this->language->get('text_rebate_ok');
443					}
444
445					$json['data'] = array();
446					$json['data']['created'] = date("Y-m-d H:i:s");
447					$json['data']['amount'] = $amount * -1;
448					$json['data']['total_released'] = (double)$total_released;
449					$json['data']['total_rebated'] = (double)$total_rebated;
450					$json['data']['rebate_status'] = $rebate_status;
451					$json['error'] = false;
452				} else {
453					$json['error'] = true;
454					$json['msg'] = (string)$response_xml->response->error->message;
455				}
456			} else {
457				$json['status'] = 0;
458				$json['message'] = $this->language->get('error_connection');
459			}
460		} else {
461			$json['error'] = true;
462			$json['msg'] = 'Missing data';
463		}
464
465		$this->response->setOutput(json_encode($json));
466	}
467
468	protected function validate() {
469		if (!$this->user->hasPermission('modify', 'extension/payment/securetrading_pp')) {
470			$this->error['warning'] = $this->language->get('error_permission');
471		}
472
473		if (!$this->request->post['payment_securetrading_pp_site_reference']) {
474			$this->error['site_reference'] = $this->language->get('error_site_reference');
475		}
476
477		if (!$this->request->post['payment_securetrading_pp_version']) {
478			$this->error['version'] = $this->language->get('error_version');
479		}
480
481		if (empty($this->request->post['payment_securetrading_pp_cards_accepted'])) {
482			$this->error['cards_accepted'] = $this->language->get('error_cards_accepted');
483		}
484
485		if (!$this->request->post['payment_securetrading_pp_notification_password']) {
486			$this->error['notification_password'] = $this->language->get('error_notification_password');
487		}
488
489		return !$this->error;
490	}
491}