Files
2026-03-31 20:48:16 -04:00

92 lines
3.0 KiB
PHP

<?php
if (!defined('ABSPATH')) exit;
class Fusion_WooDoo_API_Client {
private string $odoo_url;
private string $api_key;
public function __construct() {
$this->odoo_url = rtrim(get_option('fusion_woodoo_odoo_url', ''), '/');
$this->api_key = get_option('fusion_woodoo_api_key', '');
}
/**
* Make a POST request to an Odoo endpoint.
*
* @param string $endpoint e.g. '/woo/api/order/status'
* @param array $data
* @return array{success: bool, data: mixed, error: string}
*/
public function request(string $endpoint, array $data = []): array {
if (empty($this->odoo_url) || empty($this->api_key)) {
return ['success' => false, 'data' => null, 'error' => 'Odoo URL or API key not configured.'];
}
$url = $this->odoo_url . $endpoint;
$response = wp_remote_post($url, [
'timeout' => 15,
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $this->api_key,
],
'body' => wp_json_encode($data),
'data_format' => 'body',
]);
if (is_wp_error($response)) {
return ['success' => false, 'data' => null, 'error' => $response->get_error_message()];
}
$code = wp_remote_retrieve_response_code($response);
$body = json_decode(wp_remote_retrieve_body($response), true);
if ($code >= 200 && $code < 300) {
return ['success' => true, 'data' => $body, 'error' => ''];
}
$error_msg = $body['message'] ?? $body['error'] ?? 'Unexpected response from Odoo (HTTP ' . $code . ').';
return ['success' => false, 'data' => $body, 'error' => $error_msg];
}
/**
* Test connectivity to Odoo.
*/
public function test_connection(): array {
return $this->request('/woo/api/order/status', ['ping' => true]);
}
/**
* Get order status from Odoo.
*
* @param int|string $order_id WooCommerce order ID
*/
public function get_order_status(int|string $order_id): array {
return $this->request('/woo/api/order/status', ['order_id' => $order_id]);
}
/**
* Submit a return request to Odoo.
*
* @param int|string $order_id
* @param array $items [['product_id' => ..., 'qty' => ...], ...]
* @param string $reason
*/
public function submit_return(int|string $order_id, array $items, string $reason): array {
return $this->request('/woo/api/return/create', [
'order_id' => $order_id,
'items' => $items,
'reason' => $reason,
]);
}
/**
* Fetch existing returns for a customer.
*
* @param int|string $customer_id WooCommerce user ID
*/
public function get_returns(int|string $customer_id): array {
return $this->request('/woo/api/return/list', ['customer_id' => $customer_id]);
}
}