1<?php
2class ControllerExtensionPaymentSagepayServer extends Controller {
3	private $error = array();
4
5	public function index() {
6
7		$this->load->language('extension/payment/sagepay_server');
8
9		$this->document->setTitle($this->language->get('heading_title'));
10
11		$this->load->model('setting/setting');
12
13		if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
14			$this->model_setting_setting->editSetting('payment_sagepay_server', $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->error['warning'])) {
22			$data['error_warning'] = $this->error['warning'];
23		} else {
24			$data['error_warning'] = '';
25		}
26
27		if (isset($this->error['vendor'])) {
28			$data['error_vendor'] = $this->error['vendor'];
29		} else {
30			$data['error_vendor'] = '';
31		}
32
33		$data['breadcrumbs'] = array();
34
35		$data['breadcrumbs'][] = array(
36			'text' => $this->language->get('text_home'),
37			'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
38		);
39
40		$data['breadcrumbs'][] = array(
41			'text' => $this->language->get('text_extension'),
42			'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)
43		);
44
45		$data['breadcrumbs'][] = array(
46			'text' => $this->language->get('heading_title'),
47			'href' => $this->url->link('extension/payment/sagepay_server', 'user_token=' . $this->session->data['user_token'], true)
48		);
49
50		$data['action'] = $this->url->link('extension/payment/sagepay_server', 'user_token=' . $this->session->data['user_token'], true);
51
52		$data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true);
53
54		if (isset($this->request->post['payment_sagepay_server_vendor'])) {
55			$data['payment_sagepay_server_vendor'] = $this->request->post['payment_sagepay_server_vendor'];
56		} else {
57			$data['payment_sagepay_server_vendor'] = $this->config->get('payment_sagepay_server_vendor');
58		}
59
60		if (isset($this->request->post['payment_sagepay_server_password'])) {
61			$data['payment_sagepay_server_password'] = $this->request->post['payment_sagepay_server_password'];
62		} else {
63			$data['payment_sagepay_server_password'] = $this->config->get('payment_sagepay_server_password');
64		}
65
66		if (isset($this->request->post['payment_sagepay_server_test'])) {
67			$data['payment_sagepay_server_test'] = $this->request->post['payment_sagepay_server_test'];
68		} else {
69			$data['payment_sagepay_server_test'] = $this->config->get('payment_sagepay_server_test');
70		}
71
72		if (isset($this->request->post['payment_sagepay_server_transaction'])) {
73			$data['payment_sagepay_server_transaction'] = $this->request->post['payment_sagepay_server_transaction'];
74		} else {
75			$data['payment_sagepay_server_transaction'] = $this->config->get('payment_sagepay_server_transaction');
76		}
77
78		if (isset($this->request->post['payment_sagepay_server_total'])) {
79			$data['payment_sagepay_server_total'] = $this->request->post['payment_sagepay_server_total'];
80		} else {
81			$data['payment_sagepay_server_total'] = $this->config->get('payment_sagepay_server_total');
82		}
83
84		if (isset($this->request->post['payment_sagepay_server_card'])) {
85			$data['payment_sagepay_server_card'] = $this->request->post['payment_sagepay_server_card'];
86		} else {
87			$data['payment_sagepay_server_card'] = $this->config->get('payment_sagepay_server_card');
88		}
89
90		if (isset($this->request->post['payment_sagepay_server_order_status_id'])) {
91			$data['payment_sagepay_server_order_status_id'] = $this->request->post['payment_sagepay_server_order_status_id'];
92		} else {
93			$data['payment_sagepay_server_order_status_id'] = $this->config->get('payment_sagepay_server_order_status_id');
94		}
95
96		if (isset($this->request->post['payment_sagepay_server_cron_job_token'])) {
97			$data['payment_sagepay_server_cron_job_token'] = $this->request->post['payment_sagepay_server_cron_job_token'];
98		} elseif ($this->config->get('payment_sagepay_server_cron_job_token')) {
99			$data['payment_sagepay_server_cron_job_token'] = $this->config->get('payment_sagepay_server_cron_job_token');
100		} else {
101			$data['payment_sagepay_server_cron_job_token'] = sha1(uniqid(mt_rand(), 1));
102		}
103
104		$data['sagepay_server_cron_job_url'] = HTTPS_CATALOG . 'index.php?route=extension/payment/sagepay_server/cron&token=' . $data['payment_sagepay_server_cron_job_token'];
105
106		if ($this->config->get('payment_sagepay_server_last_cron_job_run')) {
107			$data['payment_sagepay_server_last_cron_job_run'] = $this->config->get('payment_sagepay_server_last_cron_job_run');
108		} else {
109			$data['payment_sagepay_server_last_cron_job_run'] = '';
110		}
111
112		$this->load->model('localisation/order_status');
113
114		$data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses();
115
116		if (isset($this->request->post['payment_sagepay_server_geo_zone_id'])) {
117			$data['payment_sagepay_server_geo_zone_id'] = $this->request->post['payment_sagepay_server_geo_zone_id'];
118		} else {
119			$data['payment_sagepay_server_geo_zone_id'] = $this->config->get('payment_sagepay_server_geo_zone_id');
120		}
121
122		$this->load->model('localisation/geo_zone');
123
124		$data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();
125
126		if (isset($this->request->post['payment_sagepay_server_status'])) {
127			$data['payment_sagepay_server_status'] = $this->request->post['payment_sagepay_server_status'];
128		} else {
129			$data['payment_sagepay_server_status'] = $this->config->get('payment_sagepay_server_status');
130		}
131
132		if (isset($this->request->post['payment_sagepay_server_debug'])) {
133			$data['payment_sagepay_server_debug'] = $this->request->post['payment_sagepay_server_debug'];
134		} else {
135			$data['payment_sagepay_server_debug'] = $this->config->get('payment_sagepay_server_debug');
136		}
137
138		if (isset($this->request->post['payment_sagepay_server_sort_order'])) {
139			$data['payment_sagepay_server_sort_order'] = $this->request->post['payment_sagepay_server_sort_order'];
140		} else {
141			$data['payment_sagepay_server_sort_order'] = $this->config->get('payment_sagepay_server_sort_order');
142		}
143
144		$data['header'] = $this->load->controller('common/header');
145		$data['column_left'] = $this->load->controller('common/column_left');
146		$data['footer'] = $this->load->controller('common/footer');
147
148		$this->response->setOutput($this->load->view('extension/payment/sagepay_server', $data));
149	}
150
151	public function install() {
152		$this->load->model('extension/payment/sagepay_server');
153		$this->model_extension_payment_sagepay_server->install();
154	}
155
156	public function uninstall() {
157		$this->load->model('extension/payment/sagepay_server');
158		$this->model_extension_payment_sagepay_server->uninstall();
159	}
160
161	public function order() {
162		if ($this->config->get('payment_sagepay_server_status')) {
163			$this->load->model('extension/payment/sagepay_server');
164
165			$sagepay_server_order = $this->model_extension_payment_sagepay_server->getOrder($this->request->get['order_id']);
166
167			if (!empty($sagepay_server_order)) {
168				$this->load->language('extension/payment/sagepay_server');
169
170				$sagepay_server_order['total_released'] = $this->model_extension_payment_sagepay_server->getTotalReleased($sagepay_server_order['sagepay_server_order_id']);
171
172				$sagepay_server_order['total_formatted'] = $this->currency->format($sagepay_server_order['total'], $sagepay_server_order['currency_code'], false, false);
173				$sagepay_server_order['total_released_formatted'] = $this->currency->format($sagepay_server_order['total_released'], $sagepay_server_order['currency_code'], false, false);
174
175				$data['sagepay_server_order'] = $sagepay_server_order;
176
177				$data['auto_settle'] = $sagepay_server_order['settle_type'];
178
179				$data['order_id'] = (int)$this->request->get['order_id'];
180
181				$data['user_token'] = $this->session->data['user_token'];
182
183				return $this->load->view('extension/payment/sagepay_server_order', $data);
184			}
185		}
186	}
187
188	public function void() {
189		$this->load->language('extension/payment/sagepay_server');
190		$json = array();
191
192		if (isset($this->request->post['order_id']) && $this->request->post['order_id'] != '') {
193			$this->load->model('extension/payment/sagepay_server');
194
195			$sagepay_server_order = $this->model_extension_payment_sagepay_server->getOrder($this->request->post['order_id']);
196
197			$void_response = $this->model_extension_payment_sagepay_server->void($this->request->post['order_id']);
198
199			$this->model_extension_payment_sagepay_server->logger('Void result', $void_response);
200
201			if ($void_response['Status'] == 'OK') {
202				$this->model_extension_payment_sagepay_server->addTransaction($sagepay_server_order['sagepay_server_order_id'], 'void', 0.00);
203				$this->model_extension_payment_sagepay_server->updateVoidStatus($sagepay_server_order['sagepay_server_order_id'], 1);
204
205				$json['msg'] = $this->language->get('text_void_ok');
206
207				$json['data'] = array();
208				$json['data']['date_added'] = date("Y-m-d H:i:s");
209				$json['error'] = false;
210			} else {
211				$json['error'] = true;
212				$json['msg'] = isset($void_response['StatuesDetail']) && !empty($void_response['StatuesDetail']) ? (string)$void_response['StatuesDetail'] : 'Unable to void';
213			}
214		} else {
215			$json['error'] = true;
216			$json['msg'] = 'Missing data';
217		}
218
219		$this->response->addHeader('Content-Type: application/json');
220		$this->response->setOutput(json_encode($json));
221	}
222
223	public function release() {
224		$this->load->language('extension/payment/sagepay_server');
225		$json = array();
226
227		if (isset($this->request->post['order_id']) && $this->request->post['order_id'] != '' && isset($this->request->post['amount']) && $this->request->post['amount'] > 0) {
228			$this->load->model('extension/payment/sagepay_server');
229
230			$sagepay_server_order = $this->model_extension_payment_sagepay_server->getOrder($this->request->post['order_id']);
231
232			$release_response = $this->model_extension_payment_sagepay_server->release($this->request->post['order_id'], $this->request->post['amount']);
233
234			$this->model_extension_payment_sagepay_server->logger('Release result', $release_response);
235
236			if ($release_response['Status'] == 'OK') {
237				$this->model_extension_payment_sagepay_server->addTransaction($sagepay_server_order['sagepay_server_order_id'], 'payment', $this->request->post['amount']);
238
239				$total_released = $this->model_extension_payment_sagepay_server->getTotalReleased($sagepay_server_order['sagepay_server_order_id']);
240
241				if ($total_released >= $sagepay_server_order['total'] || $sagepay_server_order['settle_type'] == 0) {
242					$this->model_extension_payment_sagepay_server->updateReleaseStatus($sagepay_server_order['sagepay_server_order_id'], 1);
243					$release_status = 1;
244					$json['msg'] = $this->language->get('text_release_ok_order');
245				} else {
246					$release_status = 0;
247					$json['msg'] = $this->language->get('text_release_ok');
248				}
249
250				$json['data'] = array();
251				$json['data']['date_added'] = date("Y-m-d H:i:s");
252				$json['data']['amount'] = $this->request->post['amount'];
253				$json['data']['release_status'] = $release_status;
254				$json['data']['total'] = (float)$total_released;
255				$json['error'] = false;
256			} else {
257				$json['error'] = true;
258				$json['msg'] = isset($release_response['StatusDetail']) && !empty($release_response['StatusDetail']) ? (string)$release_response['StatusDetail'] : 'Unable to release';
259			}
260		} else {
261			$json['error'] = true;
262			$json['msg'] = $this->language->get('error_data_missing');
263		}
264
265		$this->response->addHeader('Content-Type: application/json');
266		$this->response->setOutput(json_encode($json));
267	}
268
269	public function rebate() {
270		$this->load->language('extension/payment/sagepay_server');
271		$json = array();
272
273		if (isset($this->request->post['order_id']) && !empty($this->request->post['order_id'])) {
274			$this->load->model('extension/payment/sagepay_server');
275
276			$sagepay_server_order = $this->model_extension_payment_sagepay_server->getOrder($this->request->post['order_id']);
277
278			$rebate_response = $this->model_extension_payment_sagepay_server->rebate($this->request->post['order_id'], $this->request->post['amount']);
279
280			$this->model_extension_payment_sagepay_server->logger('Rebate result', $rebate_response);
281
282			if ($rebate_response['Status'] == 'OK') {
283				$this->model_extension_payment_sagepay_server->addTransaction($sagepay_server_order['sagepay_server_order_id'], 'rebate', $this->request->post['amount'] * -1);
284
285				$total_rebated = $this->model_extension_payment_sagepay_server->getTotalRebated($sagepay_server_order['sagepay_server_order_id']);
286				$total_released = $this->model_extension_payment_sagepay_server->getTotalReleased($sagepay_server_order['sagepay_server_order_id']);
287
288				if ($total_released <= 0 && $sagepay_server_order['release_status'] == 1) {
289					$this->model_extension_payment_sagepay_server->updateRebateStatus($sagepay_server_order['sagepay_server_order_id'], 1);
290					$rebate_status = 1;
291					$json['msg'] = $this->language->get('text_rebate_ok_order');
292				} else {
293					$rebate_status = 0;
294					$json['msg'] = $this->language->get('text_rebate_ok');
295				}
296
297				$json['data'] = array();
298				$json['data']['date_added'] = date("Y-m-d H:i:s");
299				$json['data']['amount'] = $this->request->post['amount'] * -1;
300				$json['data']['total_released'] = (float)$total_released;
301				$json['data']['total_rebated'] = (float)$total_rebated;
302				$json['data']['rebate_status'] = $rebate_status;
303				$json['error'] = false;
304			} else {
305				$json['error'] = true;
306				$json['msg'] = isset($rebate_response['StatusDetail']) && !empty($rebate_response['StatusDetail']) ? (string)$rebate_response['StatusDetail'] : 'Unable to rebate';
307			}
308		} else {
309			$json['error'] = true;
310			$json['msg'] = 'Missing data';
311		}
312
313		$this->response->addHeader('Content-Type: application/json');
314		$this->response->setOutput(json_encode($json));
315	}
316
317	protected function validate() {
318		if (!$this->user->hasPermission('modify', 'extension/payment/sagepay_server')) {
319			$this->error['warning'] = $this->language->get('error_permission');
320		}
321
322		if (!$this->request->post['payment_sagepay_server_vendor']) {
323			$this->error['vendor'] = $this->language->get('error_vendor');
324		}
325
326		return !$this->error;
327	}
328}