diff options
Diffstat (limited to 'public/admin/model/extension/payment/securetrading_pp.php')
-rw-r--r-- | public/admin/model/extension/payment/securetrading_pp.php | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/public/admin/model/extension/payment/securetrading_pp.php b/public/admin/model/extension/payment/securetrading_pp.php new file mode 100644 index 0000000..2e21b3a --- /dev/null +++ b/public/admin/model/extension/payment/securetrading_pp.php @@ -0,0 +1,208 @@ +<?php +class ModelExtensionPaymentSecureTradingPp extends Model { + public function install() { + $this->db->query(" + CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "securetrading_pp_order` ( + `securetrading_pp_order_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_id` INT(11) NOT NULL, + `transaction_reference` varchar(127) DEFAULT NULL, + `created` DATETIME NOT NULL, + `modified` DATETIME NOT NULL, + `release_status` INT(1) DEFAULT NULL, + `void_status` INT(1) DEFAULT NULL, + `settle_type` INT(1) DEFAULT NULL, + `rebate_status` INT(1) DEFAULT NULL, + `currency_code` CHAR(3) NOT NULL, + `total` DECIMAL( 10, 2 ) NOT NULL, + PRIMARY KEY (`securetrading_pp_order_id`) + ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); + + $this->db->query(" + CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "securetrading_pp_order_transaction` ( + `securetrading_pp_order_transaction_id` INT(11) NOT NULL AUTO_INCREMENT, + `securetrading_pp_order_id` INT(11) NOT NULL, + `created` DATETIME NOT NULL, + `type` ENUM('auth', 'payment', 'rebate', 'reversed') DEFAULT NULL, + `amount` DECIMAL( 10, 2 ) NOT NULL, + PRIMARY KEY (`securetrading_pp_order_transaction_id`) + ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); + } + + public function uninstall() { + $this->db->query("DROP TABLE IF EXISTS " . DB_PREFIX . "securetrading_pp_order"); + $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "securetrading_pp_order_transaction`;"); + } + + public function void($order_id) { + $securetrading_pp_order = $this->getOrder($order_id); + + if (!empty($securetrading_pp_order) && $securetrading_pp_order['release_status'] == 0) { + + $requestblock_xml = new SimpleXMLElement('<requestblock></requestblock>'); + $requestblock_xml->addAttribute('version', '3.67'); + $requestblock_xml->addChild('alias', $this->config->get('payment_securetrading_pp_webservice_username')); + + $request_node = $requestblock_xml->addChild('request'); + $request_node->addAttribute('type', 'TRANSACTIONUPDATE'); + + $filter_node = $request_node->addChild('filter'); + $filter_node->addChild('sitereference', $this->config->get('payment_securetrading_pp_site_reference')); + $filter_node->addChild('transactionreference', $securetrading_pp_order['transaction_reference']); + + $request_node->addChild('updates')->addChild('settlement')->addChild('settlestatus', 3); + + return $this->call($requestblock_xml->asXML()); + } else { + return false; + } + } + + public function updateVoidStatus($securetrading_pp_order_id, $status) { + $this->db->query("UPDATE `" . DB_PREFIX . "securetrading_pp_order` SET `void_status` = '" . (int)$status . "' WHERE `securetrading_pp_order_id` = '" . (int)$securetrading_pp_order_id . "'"); + } + + public function release($order_id, $amount) { + $securetrading_pp_order = $this->getOrder($order_id); + $total_released = $this->getTotalReleased($securetrading_pp_order['securetrading_pp_order_id']); + + if (!empty($securetrading_pp_order) && $securetrading_pp_order['release_status'] == 0 && $total_released <= $amount) { + + $requestblock_xml = new SimpleXMLElement('<requestblock></requestblock>'); + $requestblock_xml->addAttribute('version', '3.67'); + $requestblock_xml->addChild('alias', $this->config->get('payment_securetrading_pp_webservice_username')); + + $request_node = $requestblock_xml->addChild('request'); + $request_node->addAttribute('type', 'TRANSACTIONUPDATE'); + + $filter_node = $request_node->addChild('filter'); + $filter_node->addChild('sitereference', $this->config->get('payment_securetrading_pp_site_reference')); + $filter_node->addChild('transactionreference', $securetrading_pp_order['transaction_reference']); + + $settlement_node = $request_node->addChild('updates')->addChild('settlement'); + $settlement_node->addChild('settlestatus', 0); + $settlement_node->addChild('settlemainamount', $amount)->addAttribute('currencycode', $securetrading_pp_order['currency_code']); + + return $this->call($requestblock_xml->asXML()); + } else { + return false; + } + } + + public function updateReleaseStatus($securetrading_pp_order_id, $status) { + $this->db->query("UPDATE `" . DB_PREFIX . "securetrading_pp_order` SET `release_status` = '" . (int)$status . "' WHERE `securetrading_pp_order_id` = '" . (int)$securetrading_pp_order_id . "'"); + } + + public function updateForRebate($securetrading_pp_order_id, $order_ref) { + $this->db->query("UPDATE `" . DB_PREFIX . "securetrading_pp_order` SET `order_ref_previous` = '_multisettle_" . $this->db->escape($order_ref) . "' WHERE `securetrading_pp_order_id` = '" . (int)$securetrading_pp_order_id . "' LIMIT 1"); + } + + public function rebate($order_id, $refunded_amount) { + $securetrading_pp_order = $this->getOrder($order_id); + + if (!empty($securetrading_pp_order) && $securetrading_pp_order['rebate_status'] != 1) { + + $requestblock_xml = new SimpleXMLElement('<requestblock></requestblock>'); + $requestblock_xml->addAttribute('version', '3.67'); + $requestblock_xml->addChild('alias', $this->config->get('payment_securetrading_pp_webservice_username')); + + $request_node = $requestblock_xml->addChild('request'); + $request_node->addAttribute('type', 'REFUND'); + + $request_node->addChild('merchant')->addChild('orderreference', $order_id); + + $operation_node = $request_node->addChild('operation'); + $operation_node->addChild('accounttypedescription', 'ECOM'); + $operation_node->addChild('parenttransactionreference', $securetrading_pp_order['transaction_reference']); + $operation_node->addChild('sitereference', $this->config->get('payment_securetrading_pp_site_reference')); + + $billing_node = $request_node->addChild('billing'); + $billing_node->addAttribute('currencycode', $securetrading_pp_order['currency_code']); + $billing_node->addChild('amount', str_replace('.', '', $refunded_amount)); + + return $this->call($requestblock_xml->asXML()); + } else { + return false; + } + } + + public function getOrder($order_id) { + $qry = $this->db->query("SELECT * FROM `" . DB_PREFIX . "securetrading_pp_order` WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1"); + + if ($qry->num_rows) { + $order = $qry->row; + $order['transactions'] = $this->getTransactions($order['securetrading_pp_order_id']); + + return $order; + } else { + return false; + } + } + + private function getTransactions($securetrading_pp_order_id) { + $qry = $this->db->query("SELECT * FROM `" . DB_PREFIX . "securetrading_pp_order_transaction` WHERE `securetrading_pp_order_id` = '" . (int)$securetrading_pp_order_id . "'"); + + if ($qry->num_rows) { + return $qry->rows; + } else { + return false; + } + } + + public function addTransaction($securetrading_pp_order_id, $type, $total) { + $this->db->query("INSERT INTO `" . DB_PREFIX . "securetrading_pp_order_transaction` SET `securetrading_pp_order_id` = '" . (int)$securetrading_pp_order_id . "', `created` = now(), `type` = '" . $this->db->escape($type) . "', `amount` = '" . (double)$total . "'"); + } + + public function getTotalReleased($securetrading_pp_order_id) { + $query = $this->db->query("SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . "securetrading_pp_order_transaction` WHERE `securetrading_pp_order_id` = '" . (int)$securetrading_pp_order_id . "' AND (`type` = 'payment' OR `type` = 'rebate')"); + + return (double)$query->row['total']; + } + + public function getTotalRebated($securetrading_pp_order_id) { + $query = $this->db->query("SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . "securetrading_pp_order_transaction` WHERE `securetrading_pp_order_id` = '" . (int)$securetrading_pp_order_id . "' AND 'rebate'"); + + return (double)$query->row['total']; + } + + public function increaseRefundedAmount($order_id, $amount) { + $this->db->query("UPDATE " . DB_PREFIX . "securetrading_pp_order SET refunded = refunded + " . (double)$amount . " WHERE order_id = " . (int)$order_id); + } + + public function call($data) { + $ch = curl_init(); + + $defaults = array( + CURLOPT_POST => 1, + CURLOPT_HEADER => 0, + CURLOPT_SSL_VERIFYPEER => 0, + CURLOPT_URL => 'https://webservices.securetrading.net/xml/', + CURLOPT_FRESH_CONNECT => 1, + CURLOPT_RETURNTRANSFER => 1, + CURLOPT_FORBID_REUSE => 1, + CURLOPT_TIMEOUT => 15, + CURLOPT_HTTPHEADER => array( + 'User-Agent: OpenCart - Secure Trading PP', + 'Content-Length: ' . strlen($data), + 'Authorization: Basic ' . base64_encode($this->config->get('payment_securetrading_pp_webservice_username') . ':' . $this->config->get('payment_securetrading_pp_webservice_password')), + ), + CURLOPT_POSTFIELDS => $data, + ); + + curl_setopt_array($ch, $defaults); + + $response = curl_exec($ch); + + if ($response === false) { + $this->log->write('Secure Trading PP CURL Error: (' . curl_errno($ch) . ') ' . curl_error($ch)); + } + + curl_close($ch); + + return $response; + } + + public function logger($message) { + $log = new Log('securetrading_pp.log'); + $log->write($message); + } +}
\ No newline at end of file |