diff options
Diffstat (limited to 'public/system/library/openbay/fba.php')
-rw-r--r-- | public/system/library/openbay/fba.php | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/public/system/library/openbay/fba.php b/public/system/library/openbay/fba.php new file mode 100644 index 0000000..aded084 --- /dev/null +++ b/public/system/library/openbay/fba.php @@ -0,0 +1,305 @@ +<?php +namespace openbay; + +final class fba { + private $api_key; + private $api_account_id; + private $encryption_key; + private $encryption_iv; + private $url = 'https://api.openbaypro.io/'; + private $registry; + + private $logging = 1; + private $logging_verbose = 1; + private $max_log_size = 50; + + /** + * Status IDs = + * 0 = new + * 1 = error + * 2 = held + * 3 = shipped + * 4 = cancelled + */ + + /** + * Type IDs = + * 0 = new + * 1 = shipping + * 2 = cancel + */ + + public function __construct($registry) { + $this->registry = $registry; + + $this->api_key = $this->config->get('openbay_fba_api_key'); + $this->api_account_id = $this->config->get('openbay_fba_api_account_id'); + $this->logging = $this->config->get('openbay_fba_debug_log'); + + $this->setEncryptionKey($this->config->get('openbay_fba_encryption_key')); + $this->setEncryptionIv($this->config->get('openbay_fba_encryption_iv')); + + if ($this->logging == 1) { + $this->setLogger(); + } + } + + public function __get($name) { + return $this->registry->get($name); + } + + public function getEncryptionKey() { + return $this->encryption_key; + } + + public function setEncryptionKey($key) { + $this->encryption_key = $key; + } + + public function getEncryptionIv() { + return $this->encryption_iv; + } + + public function setEncryptionIv($encryption_iv) { + $this->encryption_iv = $encryption_iv; + } + + public function setApiKey($api_key) { + $this->api_key = $api_key; + } + + public function setAccountId($api_account_id) { + $this->api_account_id = $api_account_id; + } + + public function call($uri, $data = array(), $request_type = 'GET') { + $this->log("Request: " . $request_type . " : " . $this->url . $uri); + + $headers = array(); + $headers[] = 'X-Auth-Token: ' . $this->api_key; + $headers[] = 'X-Account-ID: ' . $this->api_account_id; + $headers[] = 'X-Endpoint-Version: 2'; + $headers[] = 'Content-Type: application/json'; + + $defaults = array( + CURLOPT_HEADER => 0, + CURLOPT_HTTPHEADER => $headers, + CURLOPT_URL => $this->url . $uri, + CURLOPT_USERAGENT => "OpenBay Pro for Fulfillment by Amazon/OpenCart", + CURLOPT_FRESH_CONNECT => 1, + CURLOPT_RETURNTRANSFER => 1, + CURLOPT_FORBID_REUSE => 1, + CURLOPT_TIMEOUT => 30, + CURLOPT_SSL_VERIFYPEER => 0, + CURLOPT_SSL_VERIFYHOST => 0, + ); + + if ($this->logging_verbose == 1) { + $defaults[CURLOPT_VERBOSE] = 1; + $defaults[CURLOPT_STDERR] = fopen(DIR_LOGS . 'fba_verbose.log', "a+"); + } + + if ($request_type == "POST") { + $this->log('Request body:'); + $this->log(print_r($data, true)); + $defaults[CURLOPT_POST] = json_encode($data); + $defaults[CURLOPT_POSTFIELDS] = json_encode($data); + } else { + $defaults[CURLOPT_CUSTOMREQUEST] = "GET"; + } + + $curl = curl_init(); + + curl_setopt_array($curl, $defaults); + + $result = curl_exec($curl); + + if (!$result) { + $this->log('call() - Curl Failed ' . curl_error($curl) . ' ' . curl_errno($curl)); + + $response = array('error' => true, 'error_messages' => array(curl_error($curl) . ' ' . curl_errno($curl)), 'body' => null, 'response_http' => 0); + } else { + $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + $this->log("Response: " . $http_code . " : " . strlen($result) . " bytes"); + + $encoding = mb_detect_encoding($result); + + if ($encoding == 'UTF-8') { + $result = preg_replace('/[^(\x20-\x7F)]*/', '', $result); + } + + $result_parsed = json_decode($result, 1); + + $this->log('Raw json response:'); + $this->log($result); + + $this->log('Parsed response:'); + $this->log(print_r($result_parsed, true)); + + $response = array( + 'error' => false, + 'error_messages' => array(), + 'body' => (isset($result_parsed['result']) ? $result_parsed['result'] : ''), + 'response_http' => $http_code + ); + + if (isset($result_parsed['errors']) && !empty($result_parsed['errors'])) { + $response['error'] = true; + $response['error_messages'] = $result_parsed['errors']; + } + } + + curl_close($curl); + + return $response; + } + + public function getServerUrl() { + return $this->url; + } + + public function validate() { + if ($this->config->get('openbay_fba_api_account_id') && $this->config->get('openbay_fba_api_key') && $this->config->get('openbay_fba_encryption_key') && $this->config->get('openbay_fba_encryption_iv')) { + return true; + } else { + return false; + } + } + + private function setLogger() { + if(file_exists(DIR_LOGS . 'fulfillment_by_amazon.log')) { + if(filesize(DIR_LOGS . 'fulfillment_by_amazon.log') > ($this->max_log_size * 1000000)) { + rename(DIR_LOGS . 'fulfillment_by_amazon.log', DIR_LOGS . '_fulfillment_by_amazon_' . date('Y-m-d_H-i-s') . '.log'); + } + } + + $this->logger = new \Log('fulfillment_by_amazon.log'); + } + + public function log($data) { + if ($this->logging == 1) { + if (function_exists('getmypid')) { + $process_id = getmypid(); + $data = $process_id . ' - ' . $data; + } + + $this->logger->write($data); + } + } + + public function createFBAOrderID($order_id) { + $this->db->query("INSERT INTO `" . DB_PREFIX . "fba_order` SET `order_id` = '" . (int)$order_id . "', `status` = 0, `created` = now()"); + + return $this->db->getLastId(); + } + + public function updateFBAOrderStatus($order_id, $status_id) { + $this->db->query("UPDATE `" . DB_PREFIX . "fba_order` SET `status` = '" . (int)$status_id . "' WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1"); + } + + public function updateFBAOrderRef($order_id, $ref) { + $this->db->query("UPDATE `" . DB_PREFIX . "fba_order` SET `fba_order_fulfillment_ref` = '" . $this->db->escape($ref) . "' WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1"); + } + + public function updateFBAOrderFulfillmentID($order_id, $fba_order_fulfillment_id) { + $this->db->query("UPDATE `" . DB_PREFIX . "fba_order` SET `fba_order_fulfillment_id` = '" . (int)$fba_order_fulfillment_id . "' WHERE `order_id` = '" . (int)$order_id . "'"); + } + + public function createFBAFulfillmentID($order_id, $type) { + $this->db->query("INSERT INTO `" . DB_PREFIX . "fba_order_fulfillment` SET `created` = now(), `order_id` = '" . (int)$order_id . "', `type` = '" . (int)$type . "'"); + + $id = $this->db->getLastId(); + + $this->db->query("UPDATE `" . DB_PREFIX . "fba_order` SET `fba_order_fulfillment_id` = '" . (int)$id . "' WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1"); + + return $id; + } + + public function populateFBAFulfillment($request_body, $response_body, $header_code, $fba_order_fulfillment_id) { + $this->db->query(" + UPDATE `" . DB_PREFIX . "fba_order_fulfillment` + SET + `request_body` = '" . $this->db->escape($request_body) . "', + `response_body` = '" . $this->db->escape($response_body) . "', + `response_header_code` = '" . (int)$header_code . "' + WHERE + `fba_order_fulfillment_id` = '" . (int)$fba_order_fulfillment_id . "' + "); + + $insert_id = $this->db->getLastId(); + + return $insert_id; + } + + public function getFBAOrders($filter) { + $sql = ""; + + // start date filter + if (isset($filter['filter_start'])) { + $sql .= " AND `created` >= '".$filter['filter_start']."'"; + } + // end date filter + if (isset($filter['filter_end'])) { + $sql .= " AND `created` <= '".$filter['filter_end']."'"; + } + // status filter + if (isset($filter['filter_status'])) { + $sql .= " AND `status` = '".$filter['filter_status']."'"; + } + + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "fba_order` WHERE 1 ".$sql." ORDER BY `created` DESC"); + + if ($query->num_rows == 0) { + return false; + } else { + return $query->rows; + } + } + + public function getFBAOrder($order_id) { + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "fba_order` WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1"); + + if ($query->num_rows == 0) { + return false; + } else { + $fba_order = $query->row; + $fba_order['fulfillments'] = $this->getFBAOrderFulfillments($order_id); + + return $fba_order; + } + } + + public function getFBAOrderByRef($ref) { + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "fba_order` WHERE `fba_order_fulfillment_ref` = '" . $this->db->escape($ref) . "' LIMIT 1"); + + if ($query->num_rows == 0) { + return false; + } else { + $fba_order = $query->row; + $fba_order['fulfillments'] = $fba_order['order_id']; + + return $fba_order; + } + } + + public function getFBAOrderFulfillments($order_id) { + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "fba_order_fulfillment` WHERE `order_id` = '" . (int)$order_id . "' ORDER BY `created` DESC"); + + if ($query->num_rows == 0) { + return false; + } else { + return $query->rows; + } + } + + public function hasOrderFBAItems($order_id) { + $query = $this->db->query("SELECT COUNT(*) AS `total` FROM `" . DB_PREFIX . "order_product` `op` LEFT JOIN `" . DB_PREFIX . "product` `p` ON `op`.`product_id` = `p`.`product_id` WHERE `p`.`location` = 'FBA' AND `op`.`order_id` = '".(int)$order_id."'"); + + if ($query->num_rows == 0) { + return false; + } else { + return $query->row['total']; + } + } +} |