/admin/controller/payment/pp_express.php

https://gitlab.com/reclamare/mao · PHP · 1137 lines · 904 code · 214 blank · 19 comment · 195 complexity · 182133f08a2421b80a5b43b862322aad MD5 · raw file

  1. <?php
  2. class ControllerPaymentPPExpress extends Controller {
  3. private $error = array();
  4. public function index() {
  5. $this->load->language('payment/pp_express');
  6. $this->document->setTitle($this->language->get('heading_title'));
  7. $this->load->model('setting/setting');
  8. $this->load->model('extension/extension');
  9. $this->load->model('payment/pp_express');
  10. if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
  11. unset($this->request->post['pp_express_module']);
  12. $this->model_setting_setting->editSetting('pp_express', $this->request->post);
  13. $this->session->data['success'] = $this->language->get('text_success');
  14. $this->response->redirect($this->url->link('extension/payment', 'token=' . $this->session->data['token'], 'SSL'));
  15. }
  16. $data['heading_title'] = $this->language->get('heading_title');
  17. $data['text_edit'] = $this->language->get('text_edit');
  18. $data['text_image_manager'] = $this->language->get('text_image_manager');
  19. $data['text_enabled'] = $this->language->get('text_enabled');
  20. $data['text_disabled'] = $this->language->get('text_disabled');
  21. $data['text_all_zones'] = $this->language->get('text_all_zones');
  22. $data['text_yes'] = $this->language->get('text_yes');
  23. $data['text_no'] = $this->language->get('text_no');
  24. $data['text_authorization'] = $this->language->get('text_authorization');
  25. $data['text_sale'] = $this->language->get('text_sale');
  26. $data['text_clear'] = $this->language->get('text_clear');
  27. $data['text_browse'] = $this->language->get('text_browse');
  28. $data['text_ipn'] = $this->language->get('text_ipn');
  29. $data['text_ipn_url'] = HTTPS_CATALOG . 'index.php?route=payment/pp_express/ipn';
  30. $data['text_paypal_join'] = $this->language->get('text_paypal_join');
  31. $data['text_paypal_join_sandbox'] = $this->language->get('text_paypal_join_sandbox');
  32. $data['entry_username'] = $this->language->get('entry_username');
  33. $data['entry_password'] = $this->language->get('entry_password');
  34. $data['entry_signature'] = $this->language->get('entry_signature');
  35. $data['entry_sandbox_username'] = $this->language->get('entry_sandbox_username');
  36. $data['entry_sandbox_password'] = $this->language->get('entry_sandbox_password');
  37. $data['entry_sandbox_signature'] = $this->language->get('entry_sandbox_signature');
  38. $data['entry_test'] = $this->language->get('entry_test');
  39. $data['entry_debug'] = $this->language->get('entry_debug');
  40. $data['entry_method'] = $this->language->get('entry_method');
  41. $data['entry_total'] = $this->language->get('entry_total');
  42. $data['entry_geo_zone'] = $this->language->get('entry_geo_zone');
  43. $data['entry_status'] = $this->language->get('entry_status');
  44. $data['entry_sort_order'] = $this->language->get('entry_sort_order');
  45. $data['entry_icon_sort_order'] = $this->language->get('entry_icon_sort_order');
  46. $data['entry_canceled_reversal_status'] = $this->language->get('entry_canceled_reversal_status');
  47. $data['entry_completed_status'] = $this->language->get('entry_completed_status');
  48. $data['entry_denied_status'] = $this->language->get('entry_denied_status');
  49. $data['entry_expired_status'] = $this->language->get('entry_expired_status');
  50. $data['entry_failed_status'] = $this->language->get('entry_failed_status');
  51. $data['entry_pending_status'] = $this->language->get('entry_pending_status');
  52. $data['entry_processed_status'] = $this->language->get('entry_processed_status');
  53. $data['entry_refunded_status'] = $this->language->get('entry_refunded_status');
  54. $data['entry_reversed_status'] = $this->language->get('entry_reversed_status');
  55. $data['entry_voided_status'] = $this->language->get('entry_voided_status');
  56. $data['entry_currency'] = $this->language->get('entry_currency');
  57. $data['entry_recurring_cancellation'] = $this->language->get('entry_recurring_cancellation');
  58. $data['entry_display_checkout'] = $this->language->get('entry_display_checkout');
  59. $data['entry_allow_notes'] = $this->language->get('entry_allow_notes');
  60. $data['entry_logo'] = $this->language->get('entry_logo');
  61. $data['entry_border_colour'] = $this->language->get('entry_border_colour');
  62. $data['entry_header_colour'] = $this->language->get('entry_header_colour');
  63. $data['entry_page_colour'] = $this->language->get('entry_page_colour');
  64. $data['help_total'] = $this->language->get('help_total');
  65. $data['help_encryption'] = $this->language->get('help_encryption');
  66. $data['help_ipn'] = $this->language->get('help_ipn');
  67. $data['help_currency'] = $this->language->get('help_currency');
  68. $data['help_logo'] = $this->language->get('help_logo');
  69. $data['help_colour'] = $this->language->get('help_colour');
  70. $data['button_save'] = $this->language->get('button_save');
  71. $data['button_cancel'] = $this->language->get('button_cancel');
  72. $data['button_search'] = $this->language->get('button_search');
  73. $data['tab_api'] = $this->language->get('tab_api');
  74. $data['tab_general'] = $this->language->get('tab_general');
  75. $data['tab_order_status'] = $this->language->get('tab_order_status');
  76. $data['tab_checkout'] = $this->language->get('tab_checkout');
  77. if (isset($this->error['warning'])) {
  78. $data['error_warning'] = $this->error['warning'];
  79. } else {
  80. $data['error_warning'] = '';
  81. }
  82. if (isset($this->error['username'])) {
  83. $data['error_username'] = $this->error['username'];
  84. } else {
  85. $data['error_username'] = '';
  86. }
  87. if (isset($this->error['password'])) {
  88. $data['error_password'] = $this->error['password'];
  89. } else {
  90. $data['error_password'] = '';
  91. }
  92. if (isset($this->error['signature'])) {
  93. $data['error_signature'] = $this->error['signature'];
  94. } else {
  95. $data['error_signature'] = '';
  96. }
  97. if (isset($this->error['sandbox_username'])) {
  98. $data['error_sandbox_username'] = $this->error['sandbox_username'];
  99. } else {
  100. $data['error_sandbox_username'] = '';
  101. }
  102. if (isset($this->error['sandbox_password'])) {
  103. $data['error_sandbox_password'] = $this->error['sandbox_password'];
  104. } else {
  105. $data['error_sandbox_password'] = '';
  106. }
  107. if (isset($this->error['sandbox_signature'])) {
  108. $data['error_sandbox_signature'] = $this->error['sandbox_signature'];
  109. } else {
  110. $data['error_sandbox_signature'] = '';
  111. }
  112. if (isset($this->session->data['error_api'])) {
  113. $data['error_warning'] = $this->session->data['error_api'];
  114. unset($this->session->data['error_api']);
  115. }
  116. $data['breadcrumbs'] = array();
  117. $data['breadcrumbs'][] = array(
  118. 'text' => $this->language->get('text_home'),
  119. 'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL'),
  120. );
  121. $data['breadcrumbs'][] = array(
  122. 'text' => $this->language->get('text_payment'),
  123. 'href' => $this->url->link('extension/payment', 'token=' . $this->session->data['token'], 'SSL'),
  124. );
  125. $data['breadcrumbs'][] = array(
  126. 'text' => $this->language->get('heading_title'),
  127. 'href' => $this->url->link('payment/pp_express', 'token=' . $this->session->data['token'], 'SSL'),
  128. );
  129. $data['action'] = $this->url->link('payment/pp_express', 'token=' . $this->session->data['token'], 'SSL');
  130. $data['cancel'] = $this->url->link('extension/payment', 'token=' . $this->session->data['token'], 'SSL');
  131. $data['search'] = $this->url->link('payment/pp_express/search', 'token=' . $this->session->data['token'], 'SSL');
  132. if (isset($this->request->post['pp_express_username'])) {
  133. $data['pp_express_username'] = $this->request->post['pp_express_username'];
  134. } else {
  135. $data['pp_express_username'] = $this->config->get('pp_express_username');
  136. }
  137. if (isset($this->request->post['pp_express_password'])) {
  138. $data['pp_express_password'] = $this->request->post['pp_express_password'];
  139. } else {
  140. $data['pp_express_password'] = $this->config->get('pp_express_password');
  141. }
  142. if (isset($this->request->post['pp_express_signature'])) {
  143. $data['pp_express_signature'] = $this->request->post['pp_express_signature'];
  144. } else {
  145. $data['pp_express_signature'] = $this->config->get('pp_express_signature');
  146. }
  147. if (isset($this->request->post['pp_express_sandbox_username'])) {
  148. $data['pp_express_sandbox_username'] = $this->request->post['pp_express_sandbox_username'];
  149. } else {
  150. $data['pp_express_sandbox_username'] = $this->config->get('pp_express_sandbox_username');
  151. }
  152. if (isset($this->request->post['pp_express_sandbox_password'])) {
  153. $data['pp_express_sandbox_password'] = $this->request->post['pp_express_sandbox_password'];
  154. } else {
  155. $data['pp_express_sandbox_password'] = $this->config->get('pp_express_sandbox_password');
  156. }
  157. if (isset($this->request->post['pp_express_sandbox_signature'])) {
  158. $data['pp_express_sandbox_signature'] = $this->request->post['pp_express_sandbox_signature'];
  159. } else {
  160. $data['pp_express_sandbox_signature'] = $this->config->get('pp_express_sandbox_signature');
  161. }
  162. if (isset($this->request->post['pp_express_test'])) {
  163. $data['pp_express_test'] = $this->request->post['pp_express_test'];
  164. } else {
  165. $data['pp_express_test'] = $this->config->get('pp_express_test');
  166. }
  167. if (isset($this->request->post['pp_express_method'])) {
  168. $data['pp_express_method'] = $this->request->post['pp_express_method'];
  169. } else {
  170. $data['pp_express_method'] = $this->config->get('pp_express_method');
  171. }
  172. if (isset($this->request->post['pp_express_total'])) {
  173. $data['pp_express_total'] = $this->request->post['pp_express_total'];
  174. } else {
  175. $data['pp_express_total'] = $this->config->get('pp_express_total');
  176. }
  177. if (isset($this->request->post['pp_express_debug'])) {
  178. $data['pp_express_debug'] = $this->request->post['pp_express_debug'];
  179. } else {
  180. $data['pp_express_debug'] = $this->config->get('pp_express_debug');
  181. }
  182. if (isset($this->request->post['pp_express_currency'])) {
  183. $data['pp_express_currency'] = $this->request->post['pp_express_currency'];
  184. } else {
  185. $data['pp_express_currency'] = $this->config->get('pp_express_currency');
  186. }
  187. $data['currency_codes'] = $this->model_payment_pp_express->currencyCodes();
  188. $this->load->model('localisation/order_status');
  189. $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses();
  190. if (isset($this->request->post['pp_express_canceled_reversal_status_id'])) {
  191. $data['pp_express_canceled_reversal_status_id'] = $this->request->post['pp_express_canceled_reversal_status_id'];
  192. } else {
  193. $data['pp_express_canceled_reversal_status_id'] = $this->config->get('pp_express_canceled_reversal_status_id');
  194. }
  195. if (isset($this->request->post['pp_express_completed_status_id'])) {
  196. $data['pp_express_completed_status_id'] = $this->request->post['pp_express_completed_status_id'];
  197. } else {
  198. $data['pp_express_completed_status_id'] = $this->config->get('pp_express_completed_status_id');
  199. }
  200. if (isset($this->request->post['pp_express_denied_status_id'])) {
  201. $data['pp_express_denied_status_id'] = $this->request->post['pp_express_denied_status_id'];
  202. } else {
  203. $data['pp_express_denied_status_id'] = $this->config->get('pp_express_denied_status_id');
  204. }
  205. if (isset($this->request->post['pp_express_expired_status_id'])) {
  206. $data['pp_express_expired_status_id'] = $this->request->post['pp_express_expired_status_id'];
  207. } else {
  208. $data['pp_express_expired_status_id'] = $this->config->get('pp_express_expired_status_id');
  209. }
  210. if (isset($this->request->post['pp_express_failed_status_id'])) {
  211. $data['pp_express_failed_status_id'] = $this->request->post['pp_express_failed_status_id'];
  212. } else {
  213. $data['pp_express_failed_status_id'] = $this->config->get('pp_express_failed_status_id');
  214. }
  215. if (isset($this->request->post['pp_express_pending_status_id'])) {
  216. $data['pp_express_pending_status_id'] = $this->request->post['pp_express_pending_status_id'];
  217. } else {
  218. $data['pp_express_pending_status_id'] = $this->config->get('pp_express_pending_status_id');
  219. }
  220. if (isset($this->request->post['pp_express_processed_status_id'])) {
  221. $data['pp_express_processed_status_id'] = $this->request->post['pp_express_processed_status_id'];
  222. } else {
  223. $data['pp_express_processed_status_id'] = $this->config->get('pp_express_processed_status_id');
  224. }
  225. if (isset($this->request->post['pp_express_refunded_status_id'])) {
  226. $data['pp_express_refunded_status_id'] = $this->request->post['pp_express_refunded_status_id'];
  227. } else {
  228. $data['pp_express_refunded_status_id'] = $this->config->get('pp_express_refunded_status_id');
  229. }
  230. if (isset($this->request->post['pp_express_reversed_status_id'])) {
  231. $data['pp_express_reversed_status_id'] = $this->request->post['pp_express_reversed_status_id'];
  232. } else {
  233. $data['pp_express_reversed_status_id'] = $this->config->get('pp_express_reversed_status_id');
  234. }
  235. if (isset($this->request->post['pp_express_voided_status_id'])) {
  236. $data['pp_express_voided_status_id'] = $this->request->post['pp_express_voided_status_id'];
  237. } else {
  238. $data['pp_express_voided_status_id'] = $this->config->get('pp_express_voided_status_id');
  239. }
  240. if (isset($this->request->post['pp_express_allow_note'])) {
  241. $data['pp_express_allow_note'] = $this->request->post['pp_express_allow_note'];
  242. } else {
  243. $data['pp_express_allow_note'] = $this->config->get('pp_express_allow_note');
  244. }
  245. if (isset($this->request->post['pp_express_logo'])) {
  246. $data['pp_express_logo'] = $this->request->post['pp_express_logo'];
  247. } else {
  248. $data['pp_express_logo'] = $this->config->get('pp_express_logo');
  249. }
  250. if (isset($this->request->post['pp_express_page_colour'])) {
  251. $data['pp_express_page_colour'] = str_replace('#', '', $this->request->post['pp_express_page_colour']);
  252. } else {
  253. $data['pp_express_page_colour'] = $this->config->get('pp_express_page_colour');
  254. }
  255. if (isset($this->request->post['pp_express_recurring_cancel_status'])) {
  256. $data['pp_express_recurring_cancel_status'] = $this->request->post['pp_express_recurring_cancel_status'];
  257. } else {
  258. $data['pp_express_recurring_cancel_status'] = $this->config->get('pp_express_recurring_cancel_status');
  259. }
  260. $this->load->model('tool/image');
  261. if (isset($this->request->post['pp_express_logo']) && is_file(DIR_IMAGE . $this->request->post['pp_express_logo'])) {
  262. $data['thumb'] = $this->model_tool_image->resize($this->request->post['pp_express_logo'], 750, 90);
  263. } elseif (is_file(DIR_IMAGE . $this->config->get('pp_express_logo'))) {
  264. $data['thumb'] = $this->model_tool_image->resize($this->config->get('pp_express_logo'), 750, 90);
  265. } else {
  266. $data['thumb'] = $this->model_tool_image->resize('no_image.png', 750, 90);
  267. }
  268. $data['placeholder'] = $this->model_tool_image->resize('no_image.png', 750, 90);
  269. if (isset($this->request->post['pp_express_geo_zone_id'])) {
  270. $data['pp_express_geo_zone_id'] = $this->request->post['pp_express_geo_zone_id'];
  271. } else {
  272. $data['pp_express_geo_zone_id'] = $this->config->get('pp_express_geo_zone_id');
  273. }
  274. $this->load->model('localisation/geo_zone');
  275. $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();
  276. if (isset($this->request->post['pp_express_status'])) {
  277. $data['pp_express_status'] = $this->request->post['pp_express_status'];
  278. } else {
  279. $data['pp_express_status'] = $this->config->get('pp_express_status');
  280. }
  281. if (isset($this->request->post['pp_express_sort_order'])) {
  282. $data['pp_express_sort_order'] = $this->request->post['pp_express_sort_order'];
  283. } else {
  284. $data['pp_express_sort_order'] = $this->config->get('pp_express_sort_order');
  285. }
  286. $this->load->model('localisation/country');
  287. $country = $this->model_localisation_country->getCountry($this->config->get('config_country_id'));
  288. $data['text_paypal_link'] = 'https://www.paypal.com/webapps/merchantboarding/webflow/externalpartnerflow?'
  289. . 'countryCode=' . $country['iso_code_2']
  290. . '&integrationType=F'
  291. . '&merchantId=David111'
  292. . '&displayMode=minibrowser'
  293. . '&partnerId=9PDNYE4RZBVFJ'
  294. . '&productIntentID=addipmt'
  295. . '&receiveCredentials=TRUE'
  296. . '&returnToPartnerUrl=' . base64_encode(html_entity_decode($this->url->link('payment/pp_express/live', 'token=' . $this->session->data['token'], 'SSL')))
  297. . '&subIntegrationType=S';
  298. $data['text_paypal_link_sandbox'] = 'https://www.sandbox.paypal.com/webapps/merchantboarding/webflow/externalpartnerflow?'
  299. . 'countryCode=' . $country['iso_code_2']
  300. . '&integrationType=F'
  301. . '&merchantId=David111'
  302. . '&displayMode=minibrowser'
  303. . '&partnerId=T4E8WSXT43QPJ'
  304. . '&productIntentID=addipmt'
  305. . '&receiveCredentials=TRUE'
  306. . '&returnToPartnerUrl=' . base64_encode(html_entity_decode($this->url->link('payment/pp_express/sandbox', 'token=' . $this->session->data['token'], 'SSL')))
  307. . '&subIntegrationType=S';
  308. $data['token'] = $this->session->data['token'];
  309. $data['header'] = $this->load->controller('common/header');
  310. $data['column_left'] = $this->load->controller('common/column_left');
  311. $data['footer'] = $this->load->controller('common/footer');
  312. $this->response->setOutput($this->load->view('payment/pp_express.tpl', $data));
  313. }
  314. public function imageLogo() {
  315. $this->load->model('tool/image');
  316. if (isset($this->request->get['image'])) {
  317. $this->response->setOutput($this->model_tool_image->resize(html_entity_decode($this->request->get['image'], ENT_QUOTES, 'UTF-8'), 750, 90));
  318. }
  319. }
  320. protected function validate() {
  321. if (!$this->user->hasPermission('modify', 'payment/pp_express')) {
  322. $this->error['warning'] = $this->language->get('error_permission');
  323. }
  324. if ($this->request->post['pp_express_test'] == 1) {
  325. if (!$this->request->post['pp_express_sandbox_username']) {
  326. $this->error['sandbox_username'] = $this->language->get('error_sandbox_username');
  327. }
  328. if (!$this->request->post['pp_express_sandbox_password']) {
  329. $this->error['sandbox_password'] = $this->language->get('error_sandbox_password');
  330. }
  331. if (!$this->request->post['pp_express_sandbox_signature']) {
  332. $this->error['sandbox_signature'] = $this->language->get('error_sandbox_signature');
  333. }
  334. } else {
  335. if (!$this->request->post['pp_express_username']) {
  336. $this->error['username'] = $this->language->get('error_username');
  337. }
  338. if (!$this->request->post['pp_express_password']) {
  339. $this->error['password'] = $this->language->get('error_password');
  340. }
  341. if (!$this->request->post['pp_express_signature']) {
  342. $this->error['signature'] = $this->language->get('error_signature');
  343. }
  344. }
  345. return !$this->error;
  346. }
  347. public function live() {
  348. if (isset($this->request->get['merchantId'])) {
  349. $this->load->language('payment/pp_express');
  350. $this->load->model('payment/pp_express');
  351. $this->load->model('setting/setting');
  352. $token = $this->model_payment_pp_express->getTokens('live');
  353. if (isset($token->access_token)) {
  354. $user_info = $this->model_payment_pp_express->getUserInfo($this->request->get['merchantId'], 'live', $token->access_token);
  355. } else {
  356. $this->session->data['error_api'] = $this->language->get('error_api');
  357. }
  358. if (isset($user_info->api_user_name)) {
  359. $this->model_setting_setting->editSettingValue('pp_express', 'pp_express_username', $user_info->api_user_name);
  360. $this->model_setting_setting->editSettingValue('pp_express', 'pp_express_password', $user_info->api_password);
  361. $this->model_setting_setting->editSettingValue('pp_express', 'pp_express_signature', $user_info->signature);
  362. } else {
  363. $this->session->data['error_api'] = $this->language->get('error_api');
  364. }
  365. }
  366. $this->response->redirect($this->url->link('payment/pp_express', 'token=' . $this->session->data['token'], 'SSL'));
  367. }
  368. public function sandbox() {
  369. if (isset($this->request->get['merchantId'])) {
  370. $this->load->language('payment/pp_express');
  371. $this->load->model('payment/pp_express');
  372. $this->load->model('setting/setting');
  373. $token = $this->model_payment_pp_express->getTokens('sandbox');
  374. if (isset($token->access_token)) {
  375. $user_info = $this->model_payment_pp_express->getUserInfo($this->request->get['merchantId'], 'sandbox', $token->access_token);
  376. } else {
  377. $this->session->data['error_api'] = $this->language->get('error_api_sandbox');
  378. }
  379. if (isset($user_info->api_user_name)) {
  380. $this->model_setting_setting->editSettingValue('pp_express', 'pp_express_sandbox_username', $user_info->api_user_name);
  381. $this->model_setting_setting->editSettingValue('pp_express', 'pp_express_sandbox_password', $user_info->api_password);
  382. $this->model_setting_setting->editSettingValue('pp_express', 'pp_express_sandbox_signature', $user_info->signature);
  383. } else {
  384. $this->session->data['error_api'] = $this->language->get('error_api_sandbox');
  385. }
  386. }
  387. $this->response->redirect($this->url->link('payment/pp_express', 'token=' . $this->session->data['token'], 'SSL'));
  388. }
  389. public function resend() {
  390. $this->load->model('payment/pp_express');
  391. $this->load->language('payment/pp_express');
  392. $json = array();
  393. if (isset($this->request->get['paypal_order_transaction_id'])) {
  394. $transaction = $this->model_payment_pp_express->getFailedTransaction($this->request->get['paypal_order_transaction_id']);
  395. if ($transaction) {
  396. $call_data = json_decode($transaction['call_data'], true);
  397. $result = $this->model_payment_pp_express->call($call_data);
  398. if ($result) {
  399. $parent_transaction = $this->model_payment_pp_express->getLocalTransaction($transaction['parent_transaction_id']);
  400. if ($parent_transaction['amount'] == abs($transaction['amount'])) {
  401. $this->db->query("UPDATE `" . DB_PREFIX . "paypal_order_transaction` SET `payment_status` = 'Refunded' WHERE `transaction_id` = '" . $this->db->escape($transaction['parent_transaction_id']) . "' LIMIT 1");
  402. } else {
  403. $this->db->query("UPDATE `" . DB_PREFIX . "paypal_order_transaction` SET `payment_status` = 'Partially-Refunded' WHERE `transaction_id` = '" . $this->db->escape($transaction['parent_transaction_id']) . "' LIMIT 1");
  404. }
  405. if (isset($result['REFUNDTRANSACTIONID'])) {
  406. $transaction['transaction_id'] = $result['REFUNDTRANSACTIONID'];
  407. } else {
  408. $transaction['transaction_id'] = $result['TRANSACTIONID'];
  409. }
  410. if (isset($result['PAYMENTTYPE'])) {
  411. $transaction['payment_type'] = $result['PAYMENTTYPE'];
  412. } else {
  413. $transaction['payment_type'] = $result['REFUNDSTATUS'];
  414. }
  415. if (isset($result['PAYMENTSTATUS'])) {
  416. $transaction['payment_status'] = $result['PAYMENTSTATUS'];
  417. } else {
  418. $transaction['payment_status'] = 'Refunded';
  419. }
  420. if (isset($result['AMT'])) {
  421. $transaction['amount'] = $result['AMT'];
  422. } else {
  423. $transaction['amount'] = $transaction['amount'];
  424. }
  425. $transaction['pending_reason'] = (isset($result['PENDINGREASON']) ? $result['PENDINGREASON'] : '');
  426. $this->model_payment_pp_express->updateTransaction($transaction);
  427. $json['success'] = $this->language->get('success_transaction_resent');
  428. } else {
  429. $json['error'] = $this->language->get('error_timeout');
  430. }
  431. } else {
  432. $json['error'] = $this->language->get('error_transaction_missing');
  433. }
  434. } else {
  435. $json['error'] = $this->language->get('error_data');
  436. }
  437. $this->response->addHeader('Content-Type: application/json');
  438. $this->response->setOutput(json_encode($json));
  439. }
  440. public function capture() {
  441. $this->load->language('payment/pp_express');
  442. /**
  443. * used to capture authorised payments
  444. *
  445. * capture can be full or partial amounts
  446. */
  447. if (isset($this->request->post['order_id']) && $this->request->post['amount'] > 0 && isset($this->request->post['order_id']) && isset($this->request->post['complete'])) {
  448. $this->load->model('payment/pp_express');
  449. $paypal_order = $this->model_payment_pp_express->getOrder($this->request->post['order_id']);
  450. if ($this->request->post['complete'] == 1) {
  451. $complete = 'Complete';
  452. } else {
  453. $complete = 'NotComplete';
  454. }
  455. $call_data = array();
  456. $call_data['METHOD'] = 'DoCapture';
  457. $call_data['AUTHORIZATIONID'] = $paypal_order['authorization_id'];
  458. $call_data['AMT'] = number_format($this->request->post['amount'], 2);
  459. $call_data['CURRENCYCODE'] = $paypal_order['currency_code'];
  460. $call_data['COMPLETETYPE'] = $complete;
  461. $call_data['MSGSUBID'] = uniqid(mt_rand(), true);
  462. $result = $this->model_payment_pp_express->call($call_data);
  463. $transaction = array(
  464. 'paypal_order_id' => $paypal_order['paypal_order_id'],
  465. 'transaction_id' => '',
  466. 'parent_transaction_id' => $paypal_order['authorization_id'],
  467. 'note' => '',
  468. 'msgsubid' => $call_data['MSGSUBID'],
  469. 'receipt_id' => '',
  470. 'payment_type' => '',
  471. 'payment_status' => '',
  472. 'pending_reason' => '',
  473. 'transaction_entity' => 'payment',
  474. 'amount' => '',
  475. 'debug_data' => json_encode($result)
  476. );
  477. if ($result == false) {
  478. $transaction['amount'] = number_format($this->request->post['amount'], 2);
  479. $paypal_order_transaction_id = $this->model_payment_pp_express->addTransaction($transaction, $call_data);
  480. $json['error'] = true;
  481. $json['failed_transaction']['paypal_order_transaction_id'] = $paypal_order_transaction_id;
  482. $json['failed_transaction']['amount'] = $transaction['amount'];
  483. $json['failed_transaction']['column_date_added'] = date("Y-m-d H:i:s");
  484. $json['msg'] = $this->language->get('error_timeout');
  485. } else if (isset($result['ACK']) && $result['ACK'] != 'Failure' && $result['ACK'] != 'FailureWithWarning') {
  486. $transaction['transaction_id'] = $result['TRANSACTIONID'];
  487. $transaction['payment_type'] = $result['PAYMENTTYPE'];
  488. $transaction['payment_status'] = $result['PAYMENTSTATUS'];
  489. $transaction['pending_reason'] = (isset($result['PENDINGREASON']) ? $result['PENDINGREASON'] : '');
  490. $transaction['amount'] = $result['AMT'];
  491. $this->model_payment_pp_express->addTransaction($transaction);
  492. unset($transaction['debug_data']);
  493. $transaction['date_added'] = date("Y-m-d H:i:s");
  494. $captured = number_format($this->model_payment_pp_express->totalCaptured($paypal_order['paypal_order_id']), 2);
  495. $refunded = number_format($this->model_payment_pp_express->totalRefundedOrder($paypal_order['paypal_order_id']), 2);
  496. $transaction['captured'] = $captured;
  497. $transaction['refunded'] = $refunded;
  498. $transaction['remaining'] = number_format($paypal_order['total'] - $captured, 2);
  499. $transaction['status'] = 0;
  500. if ($transaction['remaining'] == 0.00) {
  501. $transaction['status'] = 1;
  502. $this->model_payment_pp_express->updateOrder('Complete', $this->request->post['order_id']);
  503. }
  504. $transaction['void'] = '';
  505. if ($this->request->post['complete'] == 1 && $transaction['remaining'] > 0) {
  506. $transaction['void'] = array(
  507. 'paypal_order_id' => $paypal_order['paypal_order_id'],
  508. 'transaction_id' => '',
  509. 'parent_transaction_id' => $paypal_order['authorization_id'],
  510. 'note' => '',
  511. 'msgsubid' => '',
  512. 'receipt_id' => '',
  513. 'payment_type' => '',
  514. 'payment_status' => 'Void',
  515. 'pending_reason' => '',
  516. 'amount' => '',
  517. 'debug_data' => 'Voided after capture',
  518. 'transaction_entity' => 'auth',
  519. );
  520. $this->model_payment_pp_express->addTransaction($transaction['void']);
  521. $this->model_payment_pp_express->updateOrder('Complete', $this->request->post['order_id']);
  522. $transaction['void']['date_added'] = date("Y-m-d H:i:s");
  523. $transaction['status'] = 1;
  524. }
  525. $json['data'] = $transaction;
  526. $json['error'] = false;
  527. $json['msg'] = 'Ok';
  528. } else {
  529. $json['error'] = true;
  530. $json['msg'] = (isset($result['L_SHORTMESSAGE0']) ? $result['L_SHORTMESSAGE0'] : 'There was an error');
  531. }
  532. } else {
  533. $json['error'] = true;
  534. $json['msg'] = 'Missing data';
  535. }
  536. $this->response->addHeader('Content-Type: application/json');
  537. $this->response->setOutput(json_encode($json));
  538. }
  539. public function void() {
  540. /**
  541. * used to void an authorised payment
  542. */
  543. if (isset($this->request->post['order_id']) && $this->request->post['order_id'] != '') {
  544. $this->load->model('payment/pp_express');
  545. $paypal_order = $this->model_payment_pp_express->getOrder($this->request->post['order_id']);
  546. $call_data = array();
  547. $call_data['METHOD'] = 'DoVoid';
  548. $call_data['AUTHORIZATIONID'] = $paypal_order['authorization_id'];
  549. $result = $this->model_payment_pp_express->call($call_data);
  550. if ($result['ACK'] != 'Failure' && $result['ACK'] != 'FailureWithWarning') {
  551. $transaction = array(
  552. 'paypal_order_id' => $paypal_order['paypal_order_id'],
  553. 'transaction_id' => '',
  554. 'parent_transaction_id' => $paypal_order['authorization_id'],
  555. 'note' => '',
  556. 'msgsubid' => '',
  557. 'receipt_id' => '',
  558. 'payment_type' => 'void',
  559. 'payment_status' => 'Void',
  560. 'pending_reason' => '',
  561. 'transaction_entity' => 'auth',
  562. 'amount' => '',
  563. 'debug_data' => json_encode($result)
  564. );
  565. $this->model_payment_pp_express->addTransaction($transaction);
  566. $this->model_payment_pp_express->updateOrder('Complete', $this->request->post['order_id']);
  567. unset($transaction['debug_data']);
  568. $transaction['date_added'] = date("Y-m-d H:i:s");
  569. $json['data'] = $transaction;
  570. $json['error'] = false;
  571. $json['msg'] = 'Transaction void';
  572. } else {
  573. $json['error'] = true;
  574. $json['msg'] = (isset($result['L_SHORTMESSAGE0']) ? $result['L_SHORTMESSAGE0'] : 'There was an error');
  575. }
  576. } else {
  577. $json['error'] = true;
  578. $json['msg'] = 'Missing data';
  579. }
  580. $this->response->addHeader('Content-Type: application/json');
  581. $this->response->setOutput(json_encode($json));
  582. }
  583. public function refund() {
  584. $this->load->language('payment/pp_express_refund');
  585. $this->document->setTitle($this->language->get('heading_title'));
  586. $data['heading_title'] = $this->language->get('heading_title');
  587. $data['button_cancel'] = $this->language->get('button_cancel');
  588. $data['entry_transaction_id'] = $this->language->get('entry_transaction_id');
  589. $data['entry_full_refund'] = $this->language->get('entry_full_refund');
  590. $data['entry_amount'] = $this->language->get('entry_amount');
  591. $data['entry_message'] = $this->language->get('entry_message');
  592. $data['button_refund'] = $this->language->get('button_refund');
  593. $data['text_refund'] = $this->language->get('text_refund');
  594. $data['breadcrumbs'] = array();
  595. $data['breadcrumbs'][] = array(
  596. 'text' => $this->language->get('text_home'),
  597. 'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL'),
  598. );
  599. $data['breadcrumbs'][] = array(
  600. 'text' => $this->language->get('text_pp_express'),
  601. 'href' => $this->url->link('payment/pp_express', 'token=' . $this->session->data['token'], 'SSL'),
  602. );
  603. $data['breadcrumbs'][] = array(
  604. 'text' => $this->language->get('heading_title'),
  605. 'href' => $this->url->link('payment/pp_express/refund', 'token=' . $this->session->data['token'], 'SSL'),
  606. );
  607. //button actions
  608. $data['action'] = $this->url->link('payment/pp_express/doRefund', 'token=' . $this->session->data['token'], 'SSL');
  609. $data['cancel'] = $this->url->link('payment/pp_express', 'token=' . $this->session->data['token'], 'SSL');
  610. $data['transaction_id'] = $this->request->get['transaction_id'];
  611. $this->load->model('payment/pp_express');
  612. $pp_transaction = $this->model_payment_pp_express->getTransaction($this->request->get['transaction_id']);
  613. $data['amount_original'] = $pp_transaction['AMT'];
  614. $data['currency_code'] = $pp_transaction['CURRENCYCODE'];
  615. $refunded = number_format($this->model_payment_pp_express->totalRefundedTransaction($this->request->get['transaction_id']), 2);
  616. if ($refunded != 0.00) {
  617. $data['refund_available'] = number_format($data['amount_original'] + $refunded, 2);
  618. $data['attention'] = $this->language->get('text_current_refunds') . ': ' . $data['refund_available'];
  619. } else {
  620. $data['refund_available'] = '';
  621. $data['attention'] = '';
  622. }
  623. $data['token'] = $this->session->data['token'];
  624. if (isset($this->session->data['error'])) {
  625. $data['error'] = $this->session->data['error'];
  626. unset($this->session->data['error']);
  627. } else {
  628. $data['error'] = '';
  629. }
  630. $data['header'] = $this->load->controller('common/header');
  631. $data['column_left'] = $this->load->controller('common/column_left');
  632. $data['footer'] = $this->load->controller('common/footer');
  633. $this->response->setOutput($this->load->view('payment/pp_express_refund.tpl', $data));
  634. }
  635. public function doRefund() {
  636. /**
  637. * used to issue a refund for a captured payment
  638. *
  639. * refund can be full or partial
  640. */
  641. if (isset($this->request->post['transaction_id']) && isset($this->request->post['refund_full'])) {
  642. $this->load->model('payment/pp_express');
  643. $this->load->language('payment/pp_express_refund');
  644. if ($this->request->post['refund_full'] == 0 && $this->request->post['amount'] == 0) {
  645. $this->session->data['error'] = $this->language->get('error_partial_amt');
  646. } else {
  647. $order_id = $this->model_payment_pp_express->getOrderId($this->request->post['transaction_id']);
  648. $paypal_order = $this->model_payment_pp_express->getOrder($order_id);
  649. if ($paypal_order) {
  650. $call_data = array();
  651. $call_data['METHOD'] = 'RefundTransaction';
  652. $call_data['TRANSACTIONID'] = $this->request->post['transaction_id'];
  653. $call_data['NOTE'] = urlencode($this->request->post['refund_message']);
  654. $call_data['MSGSUBID'] = uniqid(mt_rand(), true);
  655. $current_transaction = $this->model_payment_pp_express->getLocalTransaction($this->request->post['transaction_id']);
  656. if ($this->request->post['refund_full'] == 1) {
  657. $call_data['REFUNDTYPE'] = 'Full';
  658. } else {
  659. $call_data['REFUNDTYPE'] = 'Partial';
  660. $call_data['AMT'] = number_format($this->request->post['amount'], 2);
  661. $call_data['CURRENCYCODE'] = $this->request->post['currency_code'];
  662. }
  663. $result = $this->model_payment_pp_express->call($call_data);
  664. $transaction = array(
  665. 'paypal_order_id' => $paypal_order['paypal_order_id'],
  666. 'transaction_id' => '',
  667. 'parent_transaction_id' => $this->request->post['transaction_id'],
  668. 'note' => $this->request->post['refund_message'],
  669. 'msgsubid' => $call_data['MSGSUBID'],
  670. 'receipt_id' => '',
  671. 'payment_type' => '',
  672. 'payment_status' => 'Refunded',
  673. 'transaction_entity' => 'payment',
  674. 'pending_reason' => '',
  675. 'amount' => '-' . (isset($call_data['AMT']) ? $call_data['AMT'] : $current_transaction['amount']),
  676. 'debug_data' => json_encode($result)
  677. );
  678. if ($result == false) {
  679. $transaction['payment_status'] = 'Failed';
  680. $this->model_payment_pp_express->addTransaction($transaction, $call_data);
  681. $this->response->redirect($this->url->link('sale/order/info', 'token=' . $this->session->data['token'] . '&order_id=' . $paypal_order['order_id'], 'SSL'));
  682. } else if ($result['ACK'] != 'Failure' && $result['ACK'] != 'FailureWithWarning') {
  683. $transaction['transaction_id'] = $result['REFUNDTRANSACTIONID'];
  684. $transaction['payment_type'] = $result['REFUNDSTATUS'];
  685. $transaction['pending_reason'] = $result['PENDINGREASON'];
  686. $transaction['amount'] = '-' . $result['GROSSREFUNDAMT'];
  687. $this->model_payment_pp_express->addTransaction($transaction);
  688. //edit transaction to refunded status
  689. if ($result['TOTALREFUNDEDAMOUNT'] == $this->request->post['amount_original']) {
  690. $this->db->query("UPDATE `" . DB_PREFIX . "paypal_order_transaction` SET `payment_status` = 'Refunded' WHERE `transaction_id` = '" . $this->db->escape($this->request->post['transaction_id']) . "' LIMIT 1");
  691. } else {
  692. $this->db->query("UPDATE `" . DB_PREFIX . "paypal_order_transaction` SET `payment_status` = 'Partially-Refunded' WHERE `transaction_id` = '" . $this->db->escape($this->request->post['transaction_id']) . "' LIMIT 1");
  693. }
  694. //redirect back to the order
  695. $this->response->redirect($this->url->link('sale/order/info', 'token=' . $this->session->data['token'] . '&order_id=' . $paypal_order['order_id'], 'SSL'));
  696. } else {
  697. $this->model_payment_pp_express->log(json_encode($result));
  698. $this->session->data['error'] = (isset($result['L_SHORTMESSAGE0']) ? $result['L_SHORTMESSAGE0'] : 'There was an error') . (isset($result['L_LONGMESSAGE0']) ? '<br />' . $result['L_LONGMESSAGE0'] : '');
  699. $this->response->redirect($this->url->link('payment/pp_express/refund', 'token=' . $this->session->data['token'] . '&transaction_id=' . $this->request->post['transaction_id'], 'SSL'));
  700. }
  701. } else {
  702. $this->session->data['error'] = $this->language->get('error_data_missing');
  703. $this->response->redirect($this->url->link('payment/pp_express/refund', 'token=' . $this->session->data['token'] . '&transaction_id=' . $this->request->post['transaction_id'], 'SSL'));
  704. }
  705. }
  706. } else {
  707. $this->session->data['error'] = $this->language->get('error_data');
  708. $this->response->redirect($this->url->link('payment/pp_express/refund', 'token=' . $this->session->data['token'] . '&transaction_id=' . $this->request->post['transaction_id'], 'SSL'));
  709. }
  710. }
  711. public function install() {
  712. $this->load->model('payment/pp_express');
  713. $this->model_payment_pp_express->install();
  714. }
  715. public function uninstall() {
  716. $this->load->model('payment/pp_express');
  717. $this->model_payment_pp_express->uninstall();
  718. }
  719. public function order() {
  720. if ($this->config->get('pp_express_status')) {
  721. $this->load->model('payment/pp_express');
  722. $this->load->language('payment/pp_express_order');
  723. $paypal_order = $this->model_payment_pp_express->getOrder($this->request->get['order_id']);
  724. if ($paypal_order) {
  725. $data['text_payment_info'] = $this->language->get('text_payment_info');
  726. $data['text_capture_status'] = $this->language->get('text_capture_status');
  727. $data['text_amount_auth'] = $this->language->get('text_amount_auth');
  728. $data['button_void'] = $this->language->get('button_void');
  729. $data['button_capture'] = $this->language->get('button_capture');
  730. $data['text_amount_captured'] = $this->language->get('text_amount_captured');
  731. $data['text_amount_refunded'] = $this->language->get('text_amount_refunded');
  732. $data['text_capture_amount'] = $this->language->get('text_capture_amount');
  733. $data['text_complete_capture'] = $this->language->get('text_complete_capture');
  734. $data['text_transactions'] = $this->language->get('text_transactions');
  735. $data['text_complete'] = $this->language->get('text_complete');
  736. $data['text_confirm_void'] = $this->language->get('text_confirm_void');
  737. $data['error_capture_amt'] = $this->language->get('error_capture_amt');
  738. $data['text_view'] = $this->language->get('text_view');
  739. $data['text_refund'] = $this->language->get('text_refund');
  740. $data['text_resend'] = $this->language->get('text_resend');
  741. $data['column_trans_id'] = $this->language->get('column_trans_id');
  742. $data['column_amount'] = $this->language->get('column_amount');
  743. $data['column_type'] = $this->language->get('column_type');
  744. $data['column_status'] = $this->language->get('column_status');
  745. $data['column_pend_reason'] = $this->language->get('column_pend_reason');
  746. $data['column_date_added'] = $this->language->get('column_date_added');
  747. $data['column_action'] = $this->language->get('column_action');
  748. $data['paypal_order'] = $paypal_order;
  749. $data['order_id'] = $this->request->get['order_id'];
  750. $data['token'] = $this->session->data['token'];
  751. $captured = number_format($this->model_payment_pp_express->totalCaptured($data['paypal_order']['paypal_order_id']), 2);
  752. $refunded = number_format($this->model_payment_pp_express->totalRefundedOrder($data['paypal_order']['paypal_order_id']), 2);
  753. $data['paypal_order']['captured'] = $captured;
  754. $data['paypal_order']['refunded'] = $refunded;
  755. $data['paypal_order']['remaining'] = number_format($data['paypal_order']['total'] - $captured, 2);
  756. $captured = number_format($this->model_payment_pp_express->totalCaptured($paypal_order['paypal_order_id']), 2);
  757. $refunded = number_format($this->model_payment_pp_express->totalRefundedOrder($paypal_order['paypal_order_id']), 2);
  758. $data['paypal_order'] = $paypal_order;
  759. $data['paypal_order']['captured'] = $captured;
  760. $data['paypal_order']['refunded'] = $refunded;
  761. $data['paypal_order']['remaining'] = number_format($paypal_order['total'] - $captured, 2);
  762. $data['refund_link'] = $this->url->link('payment/pp_express/refund', 'token=' . $this->session->data['token'], 'SSL');
  763. $data['view_link'] = $this->url->link('payment/pp_express/viewTransaction', 'token=' . $this->session->data['token'], 'SSL');
  764. $data['resend_link'] = $this->url->link('payment/pp_express/resend', 'token=' . $this->session->data['token'], 'SSL');
  765. return $this->load->view('payment/pp_express_order.tpl', $data);
  766. }
  767. }
  768. }
  769. public function search() {
  770. $this->load->language('payment/pp_express_search');
  771. $this->load->model('payment/pp_express');
  772. $this->document->setTitle($this->language->get('heading_title'));
  773. $data['heading_title'] = $this->language->get('heading_title');
  774. $data['button_search'] = $this->language->get('button_search');
  775. $data['button_edit'] = $this->language->get('button_edit');
  776. $data['entry_date'] = $this->language->get('entry_date');
  777. $data['entry_date_start'] = $this->language->get('entry_date_start');
  778. $data['entry_date_end'] = $this->language->get('entry_date_end');
  779. $data['entry_date_to'] = $this->language->get('entry_date_to');
  780. $data['entry_transaction'] = $this->language->get('entry_transaction');
  781. $data['entry_transaction_type'] = $this->language->get('entry_transaction_type');
  782. $data['entry_transaction_status'] = $this->language->get('entry_transaction_status');
  783. $data['entry_email'] = $this->language->get('entry_email');
  784. $data['entry_email_buyer'] = $this->language->get('entry_email_buyer');
  785. $data['entry_email_merchant'] = $this->language->get('entry_email_merchant');
  786. $data['entry_receipt'] = $this->language->get('entry_receipt');
  787. $data['entry_transaction_id'] = $this->language->get('entry_transaction_id');
  788. $data['entry_invoice_no'] = $this->language->get('entry_invoice_no');
  789. $data['entry_auction'] = $this->language->get('entry_auction');
  790. $data['entry_amount'] = $this->language->get('entry_amount');
  791. $data['entry_recurring_id'] = $this->language->get('entry_recurring_id');
  792. $data['text_buyer_info'] = $this->language->get('text_buyer_info');
  793. $data['entry_salutation'] = $this->language->get('entry_salutation');
  794. $data['text_name'] = $this->language->get('text_name');
  795. $data['entry_firstname'] = $this->language->get('entry_firstname');
  796. $data['entry_middlename'] = $this->language->get('entry_middlename');
  797. $data['entry_lastname'] = $this->language->get('entry_lastname');
  798. $data['entry_suffix'] = $this->language->get('entry_suffix');
  799. $data['text_searching'] = $this->language->get('text_searching');
  800. $data['text_view'] = $this->language->get('text_view');
  801. $data['text_format'] = $this->language->get('text_format');
  802. $data['text_date_search'] = $this->language->get('text_date_search');
  803. $data['text_no_results'] = $this->language->get('text_no_results');
  804. $data['entry_status_all'] = $this->language->get('entry_status_all');
  805. $data['entry_status_pending'] = $this->language->get('entry_status_pending');
  806. $data['entry_status_processing'] = $this->language->get('entry_status_processing');
  807. $data['entry_status_success'] = $this->language->get('entry_status_success');
  808. $data['entry_status_denied'] = $this->language->get('entry_status_denied');
  809. $data['entry_status_reversed'] = $this->language->get('entry_status_reversed');
  810. $data['entry_trans_all'] = $this->language->get('entry_trans_all');
  811. $data['entry_trans_sent'] = $this->language->get('entry_trans_sent');
  812. $data['entry_trans_received'] = $this->language->get('entry_trans_received');
  813. $data['entry_trans_masspay'] = $this->language->get('entry_trans_masspay');
  814. $data['entry_trans_money_req'] = $this->language->get('entry_trans_money_req');
  815. $data['entry_trans_funds_add'] = $this->language->get('entry_trans_funds_add');
  816. $data['entry_trans_funds_with'] = $this->language->get('entry_trans_funds_with');
  817. $data['entry_trans_referral'] = $this->language->get('entry_trans_referral');
  818. $data['entry_trans_fee'] = $this->language->get('entry_trans_fee');
  819. $data['entry_trans_subscription'] = $this->language->get('entry_trans_subscription');
  820. $data['entry_trans_dividend'] = $this->language->get('entry_trans_dividend');
  821. $data['entry_trans_billpay'] = $this->language->get('entry_trans_billpay');
  822. $data['entry_trans_refund'] = $this->language->get('entry_trans_refund');
  823. $data['entry_trans_conv'] = $this->language->get('entry_trans_conv');
  824. $data['entry_trans_bal_trans'] = $this->language->get('entry_trans_bal_trans');
  825. $data['entry_trans_reversal'] = $this->language->get('entry_trans_reversal');
  826. $data['entry_trans_shipping'] = $this->language->get('entry_trans_shipping');
  827. $data['entry_trans_bal_affect'] = $this->language->get('entry_trans_bal_affect');
  828. $data['entry_trans_echeque'] = $this->language->get('entry_trans_echeque');
  829. $data['tbl_column_date'] = $this->language->get('tbl_column_date');
  830. $data['tbl_column_type'] = $this->language->get('tbl_column_type');
  831. $data['tbl_column_email'] = $this->language->get('tbl_column_email');
  832. $data['tbl_column_name'] = $this->language->get('tbl_column_name');
  833. $data['tbl_column_transid'] = $this->language->get('tbl_column_transid');
  834. $data['tbl_column_status'] = $this->language->get('tbl_column_status');
  835. $data['tbl_column_currency'] = $this->language->get('tbl_column_currency');
  836. $data['tbl_column_amount'] = $this->language->get('tbl_column_amount');
  837. $data['tbl_column_fee'] = $this->language->get('tbl_column_fee');
  838. $data['tbl_column_netamt'] = $this->language->get('tbl_column_netamt');
  839. $data['tbl_column_action'] = $this->language->get('tbl_column_action');
  840. $data['currency_codes'] = $this->model_payment_pp_express->currencyCodes();
  841. $data['default_currency'] = $this->config->get('pp_express_currency');
  842. $data['breadcrumbs'] = array();
  843. $data['breadcrumbs'][] = array(
  844. 'text' => $this->language->get('text_home'),
  845. 'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL'),
  846. );
  847. $data['breadcrumbs'][] = array(
  848. 'text' => $this->language->get('text_pp_express'),
  849. 'href' => $this->url->link('payment/pp_express', 'token=' . $this->session->data['token'], 'SSL'),
  850. );
  851. $data['breadcrumbs'][] = array(
  852. 'text' => $this->language->get('heading_title'),
  853. 'href' => $this->url->link('payment/pp_express/search', 'token=' . $this->session->data['token'], 'SSL'),
  854. );
  855. $data['token'] = $this->session->data['token'];
  856. $data['date_start'] = date("Y-m-d", strtotime('-30 days'));
  857. $data['date_end'] = date("Y-m-d");
  858. $data['view_link'] = $this->url->link('payment/pp_express/viewTransaction', 'token=' . $this->session->data['token'], 'SSL');
  859. $data['header'] = $this->load->controller('common/header');
  860. $data['column_left'] = $this->load->controller('common/column_left');
  861. $data['footer'] = $this->load->controller('common/footer');
  862. $this->response->setOutput($this->load->view('payment/pp_express_search.tpl', $data));
  863. }
  864. public function doSearch() {
  865. /**
  866. * used to search for transactions from a user account
  867. */
  868. if (isset($this->request->post['date_start'])) {
  869. $this->load->model('payment/pp_express');
  870. $call_data = array();
  871. $call_data['METHOD'] = 'TransactionSearch';
  872. $call_data['STARTDATE'] = gmdate($this->request->post['date_start'] . "\TH:i:s\Z");
  873. if (!empty($this->request->post['date_end'])) {
  874. $call_data['ENDDATE'] = gmdate($this->request->post['date_end'] . "\TH:i:s\Z");
  875. }
  876. if (!empty($this->request->post['transaction_class'])) {
  877. $call_data['TRANSACTIONCLASS'] = $this->request->post['transaction_class'];
  878. }
  879. if (!empty($this->request->post['status'])) {
  880. $call_data['STATUS'] = $this->request->post['status'];
  881. }
  882. if (!empty($this->request->post['buyer_email'])) {
  883. $call_data['EMAIL'] = $this->request->post['buyer_email'];
  884. }
  885. if (!empty($this->request->post['merchant_email'])) {
  886. $call_data['RECEIVER'] = $this->request->post['merchant_email'];
  887. }
  888. if (!empty($this->request->post['receipt_id'])) {
  889. $call_data['RECEIPTID'] = $this->request->post['receipt_id'];
  890. }
  891. if (!empty($this->request->post['transaction_id'])) {
  892. $call_data['TRANSACTIONID'] = $this->request->post['transaction_id'];
  893. }
  894. if (!empty($this->request->post['invoice_number'])) {
  895. $call_data['INVNUM'] = $this->request->post['invoice_number'];
  896. }
  897. if (!empty($this->request->post['auction_item_number'])) {
  898. $call_data['AUCTIONITEMNUMBER'] = $this->request->post['auction_item_number'];
  899. }
  900. if (!empty($this->request->post['amount'])) {
  901. $call_data['AMT'] = number_format($this->request->post['amount'], 2);
  902. $call_data['CURRENCYCODE'] = $this->request->post['currency_code'];
  903. }
  904. if (!empty($this->request->post['recurring_id'])) {
  905. $call_data['PROFILEID'] = $this->request->post['recurring_id'];
  906. }
  907. if (!empty($this->request->post['name_salutation'])) {
  908. $call_data['SALUTATION'] = $this->request->post['name_salutation'];
  909. }
  910. if (!empty($this->request->post['name_first'])) {
  911. $call_data['FIRSTNAME'] = $this->request->post['name_first'];
  912. }
  913. if (!empty($this->request->post['name_middle'])) {
  914. $call_data['MIDDLENAME'] = $this->request->post['name_middle'];
  915. }
  916. if (!empty($this->request->post['name_last'])) {
  917. $call_data['LASTNAME'] = $this->request->post['name_last'];
  918. }
  919. if (!empty($this->request->post['name_suffix'])) {
  920. $call_data['SUFFIX'] = $this->request->post['name_suffix'];
  921. }
  922. $result = $this->model_payment_pp_express->call($call_data);
  923. if ($result['