shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

pp_pro_iframe.php (34599B)


      1 <?php
      2 class ControllerExtensionPaymentPPProIframe extends Controller {
      3 	private $error = array();
      4 
      5 	public function index() {
      6 		$this->load->language('extension/payment/pp_pro_iframe');
      7 
      8 		$this->document->setTitle($this->language->get('heading_title'));
      9 
     10 		$this->load->model('setting/setting');
     11 
     12 		if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
     13 			$this->model_setting_setting->editSetting('payment_pp_pro_iframe', $this->request->post);
     14 
     15 			$this->session->data['success'] = $this->language->get('text_success');
     16 
     17 			$this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true));
     18 		} else {
     19 			$data['error'] = @$this->error;
     20 		}
     21 
     22 		if (isset($this->error['warning'])) {
     23 			$data['error_warning'] = $this->error['warning'];
     24 		} else {
     25 			$data['error_warning'] = '';
     26 		}
     27 
     28 		$data['breadcrumbs'] = array();
     29 
     30 		$data['breadcrumbs'][] = array(
     31 			'text' => $this->language->get('text_home'),
     32 			'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
     33 		);
     34 
     35 		$data['breadcrumbs'][] = array(
     36 			'text' => $this->language->get('text_extension'),
     37 			'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)
     38 		);
     39 
     40 		$data['breadcrumbs'][] = array(
     41 			'text' => $this->language->get('heading_title'),
     42 			'href' => $this->url->link('extension/payment/pp_pro_iframe', 'user_token=' . $this->session->data['user_token'], true)
     43 		);
     44 
     45 		$data['action'] = $this->url->link('extension/payment/pp_pro_iframe', 'user_token=' . $this->session->data['user_token'], true);
     46 
     47 		$data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true);
     48 
     49 		if (isset($this->request->post['payment_pp_pro_iframe_sig'])) {
     50 			$data['payment_pp_pro_iframe_sig'] = $this->request->post['payment_pp_pro_iframe_sig'];
     51 		} else {
     52 			$data['payment_pp_pro_iframe_sig'] = $this->config->get('payment_pp_pro_iframe_sig');
     53 		}
     54 
     55 		if (isset($this->request->post['payment_pp_pro_iframe_user'])) {
     56 			$data['payment_pp_pro_iframe_user'] = $this->request->post['payment_pp_pro_iframe_user'];
     57 		} else {
     58 			$data['payment_pp_pro_iframe_user'] = $this->config->get('payment_pp_pro_iframe_user');
     59 		}
     60 
     61 		if (isset($this->request->post['payment_pp_pro_iframe_password'])) {
     62 			$data['payment_pp_pro_iframe_password'] = $this->request->post['payment_pp_pro_iframe_password'];
     63 		} else {
     64 			$data['payment_pp_pro_iframe_password'] = $this->config->get('payment_pp_pro_iframe_password');
     65 		}
     66 
     67 		if (isset($this->request->post['payment_pp_pro_iframe_transaction_method'])) {
     68 			$data['payment_pp_pro_iframe_transaction_method'] = $this->request->post['payment_pp_pro_iframe_transaction_method'];
     69 		} else {
     70 			$data['payment_pp_pro_iframe_transaction_method'] = $this->config->get('payment_pp_pro_iframe_transaction_method');
     71 		}
     72 
     73 		if (isset($this->request->post['payment_pp_pro_iframe_test'])) {
     74 			$data['payment_pp_pro_iframe_test'] = $this->request->post['payment_pp_pro_iframe_test'];
     75 		} else {
     76 			$data['payment_pp_pro_iframe_test'] = $this->config->get('payment_pp_pro_iframe_test');
     77 		}
     78 
     79 		if (isset($this->request->post['payment_pp_pro_iframe_total'])) {
     80 			$data['payment_pp_pro_iframe_total'] = $this->request->post['payment_pp_pro_iframe_total'];
     81 		} else {
     82 			$data['payment_pp_pro_iframe_total'] = $this->config->get('payment_pp_pro_iframe_total');
     83 		}
     84 
     85 		$this->load->model('localisation/order_status');
     86 		$data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses();
     87 
     88 		if (isset($this->request->post['payment_pp_pro_iframe_canceled_reversal_status_id'])) {
     89 			$data['payment_pp_pro_iframe_canceled_reversal_status_id'] = $this->request->post['payment_pp_pro_iframe_canceled_reversal_status_id'];
     90 		} else {
     91 			$data['payment_pp_pro_iframe_canceled_reversal_status_id'] = $this->config->get('payment_pp_pro_iframe_canceled_reversal_status_id');
     92 		}
     93 
     94 		if (isset($this->request->post['payment_pp_pro_iframe_completed_status_id'])) {
     95 			$data['payment_pp_pro_iframe_completed_status_id'] = $this->request->post['payment_pp_pro_iframe_completed_status_id'];
     96 		} else {
     97 			$data['payment_pp_pro_iframe_completed_status_id'] = $this->config->get('payment_pp_pro_iframe_completed_status_id');
     98 		}
     99 
    100 		if (isset($this->request->post['payment_pp_pro_iframe_denied_status_id'])) {
    101 			$data['payment_pp_pro_iframe_denied_status_id'] = $this->request->post['payment_pp_pro_iframe_denied_status_id'];
    102 		} else {
    103 			$data['payment_pp_pro_iframe_denied_status_id'] = $this->config->get('payment_pp_pro_iframe_denied_status_id');
    104 		}
    105 
    106 		if (isset($this->request->post['payment_pp_pro_iframe_expired_status_id'])) {
    107 			$data['payment_pp_pro_iframe_expired_status_id'] = $this->request->post['payment_pp_pro_iframe_expired_status_id'];
    108 		} else {
    109 			$data['payment_pp_pro_iframe_expired_status_id'] = $this->config->get('payment_pp_pro_iframe_expired_status_id');
    110 		}
    111 
    112 		if (isset($this->request->post['payment_pp_pro_iframe_failed_status_id'])) {
    113 			$data['payment_pp_pro_iframe_failed_status_id'] = $this->request->post['payment_pp_pro_iframe_failed_status_id'];
    114 		} else {
    115 			$data['payment_pp_pro_iframe_failed_status_id'] = $this->config->get('payment_pp_pro_iframe_failed_status_id');
    116 		}
    117 
    118 		if (isset($this->request->post['payment_pp_pro_iframe_pending_status_id'])) {
    119 			$data['payment_pp_pro_iframe_pending_status_id'] = $this->request->post['payment_pp_pro_iframe_pending_status_id'];
    120 		} else {
    121 			$data['payment_pp_pro_iframe_pending_status_id'] = $this->config->get('payment_pp_pro_iframe_pending_status_id');
    122 		}
    123 
    124 		if (isset($this->request->post['payment_pp_pro_iframe_processed_status_id'])) {
    125 			$data['payment_pp_pro_iframe_processed_status_id'] = $this->request->post['payment_pp_pro_iframe_processed_status_id'];
    126 		} else {
    127 			$data['payment_pp_pro_iframe_processed_status_id'] = $this->config->get('payment_pp_pro_iframe_processed_status_id');
    128 		}
    129 
    130 		if (isset($this->request->post['payment_pp_pro_iframe_processed_status_id'])) {
    131 			$data['payment_pp_pro_iframe_processed_status_id'] = $this->request->post['payment_pp_pro_iframe_processed_status_id'];
    132 		} else {
    133 			$data['payment_pp_pro_iframe_processed_status_id'] = $this->config->get('payment_pp_pro_iframe_processed_status_id');
    134 		}
    135 
    136 		if (isset($this->request->post['payment_pp_pro_iframe_reversed_status_id'])) {
    137 			$data['payment_pp_pro_iframe_reversed_status_id'] = $this->request->post['payment_pp_pro_iframe_reversed_status_id'];
    138 		} else {
    139 			$data['payment_pp_pro_iframe_reversed_status_id'] = $this->config->get('payment_pp_pro_iframe_reversed_status_id');
    140 		}
    141 
    142 		if (isset($this->request->post['payment_pp_pro_iframe_voided_status_id'])) {
    143 			$data['payment_pp_pro_iframe_voided_status_id'] = $this->request->post['payment_pp_pro_iframe_voided_status_id'];
    144 		} else {
    145 			$data['payment_pp_pro_iframe_voided_status_id'] = $this->config->get('payment_pp_pro_iframe_voided_status_id');
    146 		}
    147 
    148 		if (isset($this->request->post['payment_pp_pro_iframe_geo_zone_id'])) {
    149 			$data['payment_pp_pro_iframe_geo_zone_id'] = $this->request->post['payment_pp_pro_iframe_geo_zone_id'];
    150 		} else {
    151 			$data['payment_pp_pro_iframe_geo_zone_id'] = $this->config->get('payment_pp_pro_iframe_geo_zone_id');
    152 		}
    153 
    154 		$this->load->model('localisation/geo_zone');
    155 
    156 		$data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();
    157 
    158 		if (isset($this->request->post['payment_pp_pro_iframe_status'])) {
    159 			$data['payment_pp_pro_iframe_status'] = $this->request->post['payment_pp_pro_iframe_status'];
    160 		} else {
    161 			$data['payment_pp_pro_iframe_status'] = $this->config->get('payment_pp_pro_iframe_status');
    162 		}
    163 
    164 		if (isset($this->request->post['payment_pp_pro_iframe_sort_order'])) {
    165 			$data['payment_pp_pro_iframe_sort_order'] = $this->request->post['payment_pp_pro_iframe_sort_order'];
    166 		} else {
    167 			$data['payment_pp_pro_iframe_sort_order'] = $this->config->get('payment_pp_pro_iframe_sort_order');
    168 		}
    169 
    170 		if (isset($this->request->post['payment_pp_pro_iframe_checkout_method'])) {
    171 			$data['payment_pp_pro_iframe_checkout_method'] = $this->request->post['payment_pp_pro_iframe_checkout_method'];
    172 		} else {
    173 			$data['payment_pp_pro_iframe_checkout_method'] = $this->config->get('payment_pp_pro_iframe_checkout_method');
    174 		}
    175 
    176 		if (isset($this->request->post['payment_pp_pro_iframe_debug'])) {
    177 			$data['payment_pp_pro_iframe_debug'] = $this->request->post['payment_pp_pro_iframe_debug'];
    178 		} else {
    179 			$data['payment_pp_pro_iframe_debug'] = $this->config->get('payment_pp_pro_iframe_debug');
    180 		}
    181 
    182 		$data['ipn_url'] = HTTPS_CATALOG . 'index.php?route=extension/payment/pp_pro_iframe/notify';
    183 
    184 		$data['header'] = $this->load->controller('common/header');
    185 		$data['column_left'] = $this->load->controller('common/column_left');
    186 		$data['footer'] = $this->load->controller('common/footer');
    187 
    188 		$this->response->setOutput($this->load->view('extension/payment/pp_pro_iframe', $data));
    189 	}
    190 
    191 	public function install() {
    192 		$this->load->model('extension/payment/pp_pro_iframe');
    193 
    194 		$this->model_extension_payment_pp_pro_iframe->install();
    195 	}
    196 
    197 	public function uninstall() {
    198 		$this->load->model('extension/payment/pp_pro_iframe');
    199 
    200 		$this->model_extension_payment_pp_pro_iframe->uninstall();
    201 	}
    202 
    203 	protected function validate() {
    204 		if (!$this->user->hasPermission('modify', 'extension/payment/pp_pro_iframe')) {
    205 			$this->error['warning'] = $this->language->get('error_permission');
    206 		}
    207 
    208 		if (!$this->request->post['payment_pp_pro_iframe_sig']) {
    209 			$this->error['sig'] = $this->language->get('error_sig');
    210 		}
    211 
    212 		if (!$this->request->post['payment_pp_pro_iframe_user']) {
    213 			$this->error['user'] = $this->language->get('error_user');
    214 		}
    215 
    216 		if (!$this->request->post['payment_pp_pro_iframe_password']) {
    217 			$this->error['password'] = $this->language->get('error_password');
    218 		}
    219 
    220 		return !$this->error;
    221 	}
    222 
    223 	public function order() {
    224 		$this->load->model('extension/payment/pp_pro_iframe');
    225 		$this->load->language('extension/payment/pp_pro_iframe');
    226 
    227 		$paypal_order = $this->model_extension_payment_pp_pro_iframe->getOrder($this->request->get['order_id']);
    228 
    229 		if ($paypal_order) {
    230 			$data['paypal_order'] = $paypal_order;
    231 			
    232 			$data['user_token'] = $this->session->data['user_token'];
    233 
    234 			$data['order_id'] = $this->request->get['order_id'];
    235 
    236 			$captured = number_format($this->model_extension_payment_pp_pro_iframe->getTotalCaptured($data['paypal_order']['paypal_iframe_order_id']), 2);
    237 			$refunded = number_format($this->model_extension_payment_pp_pro_iframe->getTotalRefunded($data['paypal_order']['paypal_iframe_order_id']), 2);
    238 
    239 			$data['paypal_order']['captured'] = $captured;
    240 			$data['paypal_order']['refunded'] = $refunded;
    241 			$data['paypal_order']['remaining'] = number_format($data['paypal_order']['total'] - $captured, 2);
    242 
    243 			$data['transactions'] = array();
    244 
    245 			$data['view_link'] = $this->url->link('extension/payment/pp_pro_iframe/info', 'user_token=' . $this->session->data['user_token'], true);
    246 			$data['refund_link'] = $this->url->link('extension/payment/pp_pro_iframe/refund', 'user_token=' . $this->session->data['user_token'], true);
    247 			$data['resend_link'] = $this->url->link('extension/payment/pp_pro_iframe/resend', 'user_token=' . $this->session->data['user_token'], true);
    248 
    249 			$captured = number_format($this->model_extension_payment_pp_pro_iframe->getTotalCaptured($paypal_order['paypal_iframe_order_id']), 2);
    250 			$refunded = number_format($this->model_extension_payment_pp_pro_iframe->getTotalRefunded($paypal_order['paypal_iframe_order_id']), 2);
    251 
    252 			$data['paypal_order'] = $paypal_order;
    253 
    254 			$data['paypal_order']['captured'] = $captured;
    255 			$data['paypal_order']['refunded'] = $refunded;
    256 			$data['paypal_order']['remaining'] = number_format($paypal_order['total'] - $captured, 2);
    257 
    258 			foreach ($paypal_order['transactions'] as $transaction) {
    259 				$data['transactions'][] = array(
    260 					'paypal_iframe_order_transaction_id' => $transaction['paypal_iframe_order_transaction_id'],
    261 					'transaction_id' => $transaction['transaction_id'],
    262 					'amount' => $transaction['amount'],
    263 					'date_added' => $transaction['date_added'],
    264 					'payment_type' => $transaction['payment_type'],
    265 					'payment_status' => $transaction['payment_status'],
    266 					'pending_reason' => $transaction['pending_reason'],
    267 					'view' => $this->url->link('extension/payment/pp_pro_iframe/info', 'user_token=' . $this->session->data['user_token'] . "&transaction_id=" . $transaction['transaction_id'] . '&order_id=' . $this->request->get['order_id'], true),
    268 					'refund' => $this->url->link('extension/payment/pp_pro_iframe/refund', 'user_token=' . $this->session->data['user_token'] . "&transaction_id=" . $transaction['transaction_id'] . "&order_id=" . $this->request->get['order_id'], true),
    269 					'resend' => $this->url->link('extension/payment/pp_pro_iframe/resend', 'user_token=' . $this->session->data['user_token'] . "&paypal_iframe_order_transaction_id=" . $transaction['paypal_iframe_order_transaction_id'], true),
    270 				);
    271 			}
    272 
    273 			$data['reauthorise_link'] = $this->url->link('extension/payment/pp_pro_iframe/reauthorise', 'user_token=' . $this->session->data['user_token'], true);
    274 
    275 			return $this->load->view('extension/payment/pp_pro_iframe_order', $data);
    276 		}
    277 	}
    278 
    279 	public function refund() {
    280 		$this->load->language('extension/payment/pp_pro_iframe');
    281 		$this->load->model('extension/payment/pp_pro_iframe');
    282 
    283 		$this->document->setTitle($this->language->get('text_refund'));
    284 
    285 		$data['breadcrumbs'] = array();
    286 
    287 		$data['breadcrumbs'][] = array(
    288 			'text' => $this->language->get('text_home'),
    289 			'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
    290 		);
    291 
    292 		$data['breadcrumbs'][] = array(
    293 			'text' => $this->language->get('heading_title'),
    294 			'href' => $this->url->link('extension/payment/pp_pro_iframe', 'user_token=' . $this->session->data['user_token'], true)
    295 		);
    296 
    297 		$data['breadcrumbs'][] = array(
    298 			'text' => $this->language->get('text_refund'),
    299 			'href' => $this->url->link('extension/payment/pp_pro_iframe/refund', 'user_token=' . $this->session->data['user_token'], true)
    300 		);
    301 
    302 		//button actions
    303 		$data['action'] = $this->url->link('extension/payment/pp_pro_iframe/doRefund', 'user_token=' . $this->session->data['user_token'], true);
    304 
    305 		if (isset($this->request->get['order_id'])) {
    306 			$data['cancel'] = $this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $this->request->get['order_id'], true);
    307 		} else {
    308 			$data['cancel'] = '';
    309 		}
    310 
    311 		$data['transaction_id'] = $this->request->get['transaction_id'];
    312 
    313 		$pp_transaction = $this->model_extension_payment_pp_pro_iframe->getTransaction($this->request->get['transaction_id']);
    314 
    315 		$data['amount_original'] = $pp_transaction['AMT'];
    316 		$data['currency_code'] = $pp_transaction['CURRENCYCODE'];
    317 
    318 		$refunded = number_format($this->model_extension_payment_pp_pro_iframe->getTotalRefundedTransaction($this->request->get['transaction_id']), 2);
    319 
    320 		if ($refunded != 0.00) {
    321 			$data['refund_available'] = number_format($data['amount_original'] + $refunded, 2);
    322 			$data['attention'] = $this->language->get('text_current_refunds') . ': ' . $data['refund_available'];
    323 		} else {
    324 			$data['refund_available'] = '';
    325 			$data['attention'] = '';
    326 		}
    327 
    328 		$data['user_token'] = $this->session->data['user_token'];
    329 
    330 		if (isset($this->session->data['error'])) {
    331 			$data['error'] = $this->session->data['error'];
    332 			unset($this->session->data['error']);
    333 		} else {
    334 			$data['error'] = '';
    335 		}
    336 
    337 		$data['header'] = $this->load->controller('common/header');
    338 		$data['column_left'] = $this->load->controller('common/column_left');
    339 		$data['footer'] = $this->load->controller('common/footer');
    340 
    341 		$this->response->setOutput($this->load->view('extension/payment/pp_pro_iframe_refund', $data));
    342 	}
    343 
    344 	public function doRefund() {
    345 		/**
    346 		 * used to issue a refund for a captured payment
    347 		 *
    348 		 * refund can be full or partial
    349 		 */
    350 		if (isset($this->request->post['transaction_id']) && isset($this->request->post['refund_full'])) {
    351 
    352 			$this->load->model('extension/payment/pp_pro_iframe');
    353 			$this->load->language('extension/payment/pp_pro_iframe');
    354 
    355 			if ($this->request->post['refund_full'] == 0 && $this->request->post['amount'] == 0) {
    356 				$this->session->data['error'] = $this->language->get('error_capture');
    357 				$this->response->redirect($this->url->link('extension/payment/pp_pro_iframe/refund', 'user_token=' . $this->session->data['user_token'] . '&transaction_id=' . $this->request->post['transaction_id'], true));
    358 			} else {
    359 				$order_id = $this->model_extension_payment_pp_pro_iframe->getOrderId($this->request->post['transaction_id']);
    360 				$paypal_order = $this->model_extension_payment_pp_pro_iframe->getOrder($order_id);
    361 
    362 				if ($paypal_order) {
    363 					$call_data = array();
    364 					$call_data['METHOD'] = 'RefundTransaction';
    365 					$call_data['TRANSACTIONID'] = $this->request->post['transaction_id'];
    366 					$call_data['NOTE'] = urlencode($this->request->post['refund_message']);
    367 					$call_data['MSGSUBID'] = uniqid(mt_rand(), true);
    368 
    369 					$current_transaction = $this->model_extension_payment_pp_pro_iframe->getLocalTransaction($this->request->post['transaction_id']);
    370 
    371 					if ($this->request->post['refund_full'] == 1) {
    372 						$call_data['REFUNDTYPE'] = 'Full';
    373 					} else {
    374 						$call_data['REFUNDTYPE'] = 'Partial';
    375 						$call_data['AMT'] = number_format($this->request->post['amount'], 2);
    376 						$call_data['CURRENCYCODE'] = $this->request->post['currency_code'];
    377 					}
    378 
    379 					$result = $this->model_extension_payment_pp_pro_iframe->call($call_data);
    380 
    381 					$transaction = array(
    382 						'paypal_iframe_order_id' => $paypal_order['paypal_iframe_order_id'],
    383 						'transaction_id' => '',
    384 						'parent_id' => $this->request->post['transaction_id'],
    385 						'note' => $this->request->post['refund_message'],
    386 						'msgsubid' => $call_data['MSGSUBID'],
    387 						'receipt_id' => '',
    388 						'payment_type' => '',
    389 						'payment_status' => 'Refunded',
    390 						'transaction_entity' => 'payment',
    391 						'pending_reason' => '',
    392 						'amount' => '-' . (isset($call_data['AMT']) ? $call_data['AMT'] : $current_transaction['amount']),
    393 						'debug_data' => json_encode($result)
    394 					);
    395 
    396 					if ($result == false) {
    397 						$transaction['payment_status'] = 'Failed';
    398 						$this->model_extension_payment_pp_pro_iframe->addTransaction($transaction, $call_data);
    399 						$this->response->redirect($this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $paypal_order['order_id'], true));
    400 					} else if ($result['ACK'] != 'Failure' && $result['ACK'] != 'FailureWithWarning') {
    401 
    402 						$transaction['transaction_id'] = $result['REFUNDTRANSACTIONID'];
    403 						$transaction['payment_type'] = $result['REFUNDSTATUS'];
    404 						$transaction['pending_reason'] = $result['PENDINGREASON'];
    405 						$transaction['amount'] = '-' . $result['GROSSREFUNDAMT'];
    406 
    407 						$this->model_extension_payment_pp_pro_iframe->addTransaction($transaction);
    408 
    409 						if ($result['TOTALREFUNDEDAMOUNT'] == $this->request->post['amount_original']) {
    410 							$this->model_extension_payment_pp_pro_iframe->updateRefundTransaction($this->request->post['transaction_id'], 'Refunded');
    411 						} else {
    412 							$this->model_extension_payment_pp_pro_iframe->updateRefundTransaction($this->request->post['transaction_id'], 'Partially-Refunded');
    413 						}
    414 
    415 						//redirect back to the order
    416 						$this->response->redirect($this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $paypal_order['order_id'], true));
    417 					} else {
    418 						if ($this->config->get('payment_pp_pro_iframe_debug')) {
    419 							$log = new Log('pp_pro_iframe.log');
    420 							$log->write(json_encode($result));
    421 						}
    422 
    423 						$this->session->data['error'] = (isset($result['L_SHORTMESSAGE0']) ? $result['L_SHORTMESSAGE0'] : 'There was an error') . (isset($result['L_LONGMESSAGE0']) ? '<br />' . $result['L_LONGMESSAGE0'] : '');
    424 						$this->response->redirect($this->url->link('extension/payment/pp_pro_iframe/refund', 'user_token=' . $this->session->data['user_token'] . '&transaction_id=' . $this->request->post['transaction_id'], true));
    425 					}
    426 				} else {
    427 					$this->session->data['error'] = $this->language->get('error_data_missing');
    428 					$this->response->redirect($this->url->link('extension/payment/pp_pro_iframe/refund', 'user_token=' . $this->session->data['user_token'] . '&transaction_id=' . $this->request->post['transaction_id'], true));
    429 				}
    430 			}
    431 		} else {
    432 			$this->session->data['error'] = $this->language->get('error_data');
    433 			$this->response->redirect($this->url->link('extension/payment/pp_pro_iframe/refund', 'user_token=' . $this->session->data['user_token'] . '&transaction_id=' . $this->request->post['transaction_id'], true));
    434 		}
    435 	}
    436 
    437 	public function reauthorise() {
    438 		$this->load->language('extension/payment/pp_pro_iframe');
    439 		$this->load->model('extension/payment/pp_pro_iframe');
    440 
    441 		$json = array();
    442 
    443 		if (isset($this->request->post['order_id'])) {
    444 			$paypal_order = $this->model_extension_payment_pp_pro_iframe->getOrder($this->request->post['order_id']);
    445 
    446 			$call_data = array();
    447 			$call_data['METHOD'] = 'DoReauthorization';
    448 			$call_data['AUTHORIZATIONID'] = $paypal_order['authorization_id'];
    449 			$call_data['AMT'] = number_format($paypal_order['total'], 2);
    450 			$call_data['CURRENCYCODE'] = $paypal_order['currency_code'];
    451 
    452 			$result = $this->model_extension_payment_pp_pro_iframe->call($call_data);
    453 
    454 			if ($result['ACK'] != 'Failure' && $result['ACK'] != 'FailureWithWarning') {
    455 				$this->model_extension_payment_pp_pro_iframe->updateAuthorizationId($paypal_order['paypal_iframe_order_id'], $result['AUTHORIZATIONID']);
    456 
    457 				$transaction = array(
    458 					'paypal_iframe_order_id' => $paypal_order['paypal_iframe_order_id'],
    459 					'transaction_id' => '',
    460 					'parent_id' => $paypal_order['authorization_id'],
    461 					'note' => '',
    462 					'msgsubid' => '',
    463 					'receipt_id' => '',
    464 					'payment_type' => 'instant',
    465 					'payment_status' => $result['PAYMENTSTATUS'],
    466 					'transaction_entity' => 'auth',
    467 					'pending_reason' => $result['PENDINGREASON'],
    468 					'amount' => '-' . '',
    469 					'debug_data' => json_encode($result)
    470 				);
    471 
    472 				$this->model_extension_payment_pp_pro_iframe->addTransaction($transaction);
    473 
    474 				$transaction['date_added'] = date("Y-m-d H:i:s");
    475 
    476 				$json['data'] = $transaction;
    477 				$json['error'] = false;
    478 				$json['msg'] = 'Ok';
    479 			} else {
    480 				$json['error'] = true;
    481 				$json['msg'] = (isset($result['L_SHORTMESSAGE0']) ? $result['L_SHORTMESSAGE0'] : $this->language->get('error_general'));
    482 			}
    483 		} else {
    484 			$json['error'] = true;
    485 			$json['msg'] = $this->language->get('error_missing_data');
    486 		}
    487 
    488 		$this->response->addHeader('Content-Type: application/json');
    489 		$this->response->setOutput(json_encode($json));
    490 	}
    491 
    492 	public function info() {
    493 		$this->load->model('extension/payment/pp_pro_iframe');
    494 		$this->load->language('extension/payment/pp_pro_iframe');
    495  
    496 		$data['breadcrumbs'] = array();
    497 
    498 		$data['breadcrumbs'][] = array(
    499 			'text' => $this->language->get('text_home'),
    500 			'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
    501 		);
    502 
    503 		$data['breadcrumbs'][] = array(
    504 			'text' => $this->language->get('heading_title'),
    505 			'href' => $this->url->link('extension/payment/pp_pro_iframe', 'user_token=' . $this->session->data['user_token'], true)
    506 		);
    507 
    508 		$data['breadcrumbs'][] = array(
    509 			'text' => $this->language->get('text_transaction'),
    510 			'href' => $this->url->link('extension/payment/pp_pro_iframe/info', 'user_token=' . $this->session->data['user_token'] . '&transaction_id=' . $this->request->get['transaction_id'], true)
    511 		);
    512 
    513 		$transaction = $this->model_extension_payment_pp_pro_iframe->getTransaction($this->request->get['transaction_id']);
    514 		$transaction = array_map('urldecode', $transaction);
    515 
    516 		$data['transaction'] = $transaction;
    517 		$data['view_link'] = $this->url->link('extension/payment/pp_pro_iframe/info', 'user_token=' . $this->session->data['user_token'], true);
    518 		$data['user_token'] = $this->session->data['user_token'];
    519 
    520 		$this->document->setTitle($this->language->get('text_transaction'));
    521 
    522 		if (isset($this->request->get['order_id'])) {
    523 			$data['back'] = $this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $this->request->get['order_id'], true);
    524 		} else {
    525 			$data['back'] = '';
    526 		}
    527 
    528 		$data['header'] = $this->load->controller('common/header');
    529 		$data['column_left'] = $this->load->controller('common/column_left');
    530 		$data['footer'] = $this->load->controller('common/footer');
    531 
    532 		$this->response->setOutput($this->load->view('extension/payment/pp_pro_iframe_transaction', $data));
    533 	}
    534 
    535 	public function capture() {
    536 		$this->load->language('extension/payment/pp_pro_iframe');
    537 		/*
    538 		 * used to capture authorised payments
    539 		 * capture can be full or partial amounts
    540 		 */
    541 		if (isset($this->request->post['order_id']) && $this->request->post['amount'] > 0 && isset($this->request->post['order_id']) && isset($this->request->post['complete'])) {
    542 
    543 			$this->load->model('extension/payment/pp_pro_iframe');
    544 
    545 			$paypal_order = $this->model_extension_payment_pp_pro_iframe->getOrder($this->request->post['order_id']);
    546 
    547 			if ($this->request->post['complete'] == 1) {
    548 				$complete = 'Complete';
    549 			} else {
    550 				$complete = 'NotComplete';
    551 			}
    552 
    553 			$call_data = array();
    554 			$call_data['METHOD'] = 'DoCapture';
    555 			$call_data['AUTHORIZATIONID'] = $paypal_order['authorization_id'];
    556 			$call_data['AMT'] = number_format($this->request->post['amount'], 2);
    557 			$call_data['CURRENCYCODE'] = $paypal_order['currency_code'];
    558 			$call_data['COMPLETETYPE'] = $complete;
    559 			$call_data['MSGSUBID'] = uniqid(mt_rand(), true);
    560 
    561 			$result = $this->model_extension_payment_pp_pro_iframe->call($call_data);
    562 
    563 			$transaction = array(
    564 				'paypal_iframe_order_id' => $paypal_order['paypal_iframe_order_id'],
    565 				'transaction_id' => '',
    566 				'parent_id' => $paypal_order['authorization_id'],
    567 				'note' => '',
    568 				'msgsubid' => $call_data['MSGSUBID'],
    569 				'receipt_id' => '',
    570 				'payment_type' => '',
    571 				'payment_status' => '',
    572 				'pending_reason' => '',
    573 				'transaction_entity' => 'payment',
    574 				'amount' => '',
    575 				'debug_data' => json_encode($result)
    576 			);
    577 
    578 			if ($result == false) {
    579 				$transaction['amount'] = number_format($this->request->post['amount'], 2);
    580 				$paypal_iframe_order_transaction_id = $this->model_extension_payment_pp_pro_iframe->addTransaction($transaction, $call_data);
    581 
    582 				$json['error'] = true;
    583 
    584 				$json['failed_transaction']['paypal_iframe_order_transaction_id'] = $paypal_iframe_order_transaction_id;
    585 				$json['failed_transaction']['amount'] = $transaction['amount'];
    586 				$json['failed_transaction']['date_added'] = date("Y-m-d H:i:s");
    587 
    588 				$json['msg'] = $this->language->get('error_timeout');
    589 			} else if (isset($result['ACK']) && $result['ACK'] != 'Failure' && $result['ACK'] != 'FailureWithWarning') {
    590 				$transaction['transaction_id'] = $result['TRANSACTIONID'];
    591 				$transaction['payment_type'] = $result['PAYMENTTYPE'];
    592 				$transaction['payment_status'] = $result['PAYMENTSTATUS'];
    593 				$transaction['pending_reason'] = (isset($result['PENDINGREASON']) ? $result['PENDINGREASON'] : '');
    594 				$transaction['amount'] = $result['AMT'];
    595 
    596 				$this->model_extension_payment_pp_pro_iframe->addTransaction($transaction);
    597 
    598 				unset($transaction['debug_data']);
    599 				$transaction['date_added'] = date("Y-m-d H:i:s");
    600 
    601 				$captured = number_format($this->model_extension_payment_pp_pro_iframe->getTotalCaptured($paypal_order['paypal_iframe_order_id']), 2);
    602 				$refunded = number_format($this->model_extension_payment_pp_pro_iframe->getTotalRefunded($paypal_order['paypal_iframe_order_id']), 2);
    603 
    604 				$transaction['captured'] = $captured;
    605 				$transaction['refunded'] = $refunded;
    606 				$transaction['remaining'] = number_format($paypal_order['total'] - $captured, 2);
    607 
    608 				$transaction['status'] = 0;
    609 				if ($transaction['remaining'] == 0.00) {
    610 					$transaction['status'] = 1;
    611 					$this->model_extension_payment_pp_pro_iframe->updateOrder('Complete', $this->request->post['order_id']);
    612 				}
    613 
    614 				$transaction['void'] = '';
    615 
    616 				if ($this->request->post['complete'] == 1 && $transaction['remaining'] > 0) {
    617 					$transaction['void'] = array(
    618 						'paypal_iframe_order_id' => $paypal_order['paypal_iframe_order_id'],
    619 						'transaction_id' => '',
    620 						'parent_id' => $paypal_order['authorization_id'],
    621 						'note' => '',
    622 						'msgsubid' => '',
    623 						'receipt_id' => '',
    624 						'payment_type' => '',
    625 						'payment_status' => 'Void',
    626 						'pending_reason' => '',
    627 						'amount' => '',
    628 						'debug_data' => 'Voided after capture',
    629 						'transaction_entity' => 'auth',
    630 					);
    631 
    632 					$this->model_extension_payment_pp_pro_iframe->addTransaction($transaction['void']);
    633 					$this->model_extension_payment_pp_pro_iframe->updateOrder('Complete', $this->request->post['order_id']);
    634 					$transaction['void']['date_added'] = date("Y-m-d H:i:s");
    635 					$transaction['status'] = 1;
    636 				}
    637 
    638 				$json['data'] = $transaction;
    639 				$json['error'] = false;
    640 				$json['msg'] = 'Ok';
    641 			} else {
    642 				$json['error'] = true;
    643 				$json['msg'] = (isset($result['L_SHORTMESSAGE0']) ? $result['L_SHORTMESSAGE0'] : 'There was an error');
    644 			}
    645 		} else {
    646 			$json['error'] = true;
    647 			$json['msg'] = 'Missing data';
    648 		}
    649 
    650 		$this->response->addHeader('Content-Type: application/json');
    651 		$this->response->setOutput(json_encode($json));
    652 	}
    653 
    654 	public function void() {
    655 		$this->load->language('extension/payment/pp_pro_iframe');
    656 
    657 		if (isset($this->request->post['order_id']) && $this->request->post['order_id'] != '') {
    658 			$this->load->model('extension/payment/pp_pro_iframe');
    659 
    660 			$paypal_order = $this->model_extension_payment_pp_pro_iframe->getOrder($this->request->post['order_id']);
    661 
    662 			$call_data = array();
    663 			$call_data['METHOD'] = 'DoVoid';
    664 			$call_data['AUTHORIZATIONID'] = $paypal_order['authorization_id'];
    665 
    666 			$result = $this->model_extension_payment_pp_pro_iframe->call($call_data);
    667 
    668 			if ($result['ACK'] != 'Failure' && $result['ACK'] != 'FailureWithWarning') {
    669 				$transaction = array(
    670 					'paypal_iframe_order_id' => $paypal_order['paypal_iframe_order_id'],
    671 					'transaction_id' => '',
    672 					'parent_id' => $paypal_order['authorization_id'],
    673 					'note' => '',
    674 					'msgsubid' => '',
    675 					'receipt_id' => '',
    676 					'payment_type' => 'void',
    677 					'payment_status' => 'Void',
    678 					'pending_reason' => '',
    679 					'transaction_entity' => 'auth',
    680 					'amount' => '',
    681 					'debug_data' => json_encode($result)
    682 				);
    683 
    684 				$this->model_extension_payment_pp_pro_iframe->addTransaction($transaction);
    685 				$this->model_extension_payment_pp_pro_iframe->updateOrder('Complete', $this->request->post['order_id']);
    686 
    687 				unset($transaction['debug_data']);
    688 				$transaction['date_added'] = date("Y-m-d H:i:s");
    689 
    690 				$json['data'] = $transaction;
    691 				$json['error'] = false;
    692 				$json['msg'] = 'Transaction void';
    693 			} else {
    694 				$json['error'] = true;
    695 				$json['msg'] = (isset($result['L_SHORTMESSAGE0']) ? $result['L_SHORTMESSAGE0'] : $this->language->get('error_general'));
    696 			}
    697 		} else {
    698 			$json['error'] = true;
    699 			$json['msg'] = $this->language->get('error_missing_data');
    700 		}
    701 
    702 		$this->response->addHeader('Content-Type: application/json');
    703 		$this->response->setOutput(json_encode($json));
    704 	}
    705 
    706 	public function resend() {
    707 		$this->load->model('extension/payment/pp_pro_iframe');
    708 		$this->load->language('extension/payment/pp_pro_iframe');
    709 
    710 		$json = array();
    711 
    712 		if (isset($this->request->get['paypal_iframe_order_transaction_id'])) {
    713 			$transaction = $this->model_extension_payment_pp_pro_iframe->getFailedTransaction($this->request->get['paypal_iframe_order_transaction_id']);
    714 
    715 			if ($transaction) {
    716 				$call_data = json_decode($transaction['call_data'], true);
    717 
    718 				$result = $this->model_extension_payment_pp_pro_iframe->call($call_data);
    719 
    720 				if ($result) {
    721 					$parent_transaction = $this->model_extension_payment_pp_pro_iframe->getLocalTransaction($transaction['parent_id']);
    722 
    723 					if ($parent_transaction['amount'] == abs($transaction['amount'])) {
    724 						$this->model_extension_payment_pp_pro_iframe->updateRefundTransaction($transaction['parent_id'], 'Refunded');
    725 					} else {
    726 						$this->model_extension_payment_pp_pro_iframe->updateRefundTransaction($transaction['parent_id'], 'Partially-Refunded');
    727 					}
    728 
    729 					if (isset($result['REFUNDTRANSACTIONID'])) {
    730 						$transaction['transaction_id'] = $result['REFUNDTRANSACTIONID'];
    731 					} else {
    732 						$transaction['transaction_id'] = $result['TRANSACTIONID'];
    733 					}
    734 
    735 					if (isset($result['PAYMENTTYPE'])) {
    736 						$transaction['payment_type'] = $result['PAYMENTTYPE'];
    737 					} else {
    738 						$transaction['payment_type'] = $result['REFUNDSTATUS'];
    739 					}
    740 
    741 					if (isset($result['PAYMENTSTATUS'])) {
    742 						$transaction['payment_status'] = $result['PAYMENTSTATUS'];
    743 					} else {
    744 						$transaction['payment_status'] = 'Refunded';
    745 					}
    746 
    747 					if (isset($result['AMT'])) {
    748 						$transaction['amount'] = $result['AMT'];
    749 					} else {
    750 						$transaction['amount'] = $transaction['amount'];
    751 					}
    752 
    753 					$transaction['pending_reason'] = (isset($result['PENDINGREASON']) ? $result['PENDINGREASON'] : '');
    754 
    755 					$this->model_extension_payment_pp_pro_iframe->updateTransaction($transaction);
    756 
    757 					$json['success'] = $this->language->get('success_transaction_resent');
    758 				} else {
    759 					$json['error'] = $this->language->get('error_timeout');
    760 				}
    761 			} else {
    762 				$json['error'] = $this->language->get('error_transaction_missing');
    763 			}
    764 		} else {
    765 			$json['error'] = $this->language->get('error_missing_data');
    766 		}
    767 
    768 		$this->response->addHeader('Content-Type: application/json');
    769 		$this->response->setOutput(json_encode($json));
    770 	}
    771 }