Files
old-new-wiaas/backend/app/plugins/wiaas/includes/class-wiaas-order.php
2018-08-26 15:41:08 +02:00

217 lines
5.7 KiB
PHP

<?php
/**
* Class Wiaas_Order
*
* Integrates Woocommerce order with Wiaas order
*/
class Wiaas_Order {
private static $object_order_type = 'shop_order';
public static function init() {
add_action('woocommerce_new_order', array( __CLASS__, 'assign_order_to_organization' ));
add_filter('woocommerce_rest_check_permissions', array( __CLASS__, 'check_order_access'), 10, 4);
add_filter('woocommerce_rest_prepare_shop_order_object', array(__CLASS__, 'transform_rest_order'), 999, 3);
add_filter('woocommerce_rest_orders_prepare_object_query', array( __CLASS__, 'wiaas_prepare_rest_orders_query'), 10, 2);
}
/**
* Assignees order to corresponding user organization when order is created.
*
* @param $order_id
*/
public static function assign_order_to_organization($order_id) {
$user = wp_get_current_user();
Wiaas_User_Organization::assign_post_to_user_organization($order_id, $user->ID);
}
/**
* Checks if current user has access to requested order/{orderId} via woocommerce REST API.
* Endpoint `/orders` is filtered correctly by groups, but endpoint `/orders/{orderId}` will return order even if
* user does not have access to it.
* Groups has general support for this using rest_prepare_{$post_type} but woocommerce api does not
* use this filter anymore. So we will just call the same function just with woocommerce filter.
*
* @param $permission
* @param $context
* @param $object_id
* @param $post_type
* @return bool
*/
public static function check_order_access($permission, $context, $object_id, $post_type) {
if ($post_type === self::$object_order_type && $object_id !== 0) {
return Groups_Post_Access::user_can_read_post($object_id);
}
return $permission;
}
/**
* Handles custom wiaas arguments to woocommerce orders api endpoint `wc/v2/orders`
* @param $args
* @param $request
*
* @return mixed
*/
public static function wiaas_prepare_rest_orders_query($args, $request) {
# Handle wiaas_is_active flag
if (isset($request['wiaas_is_active'])) {
if ($request['wiaas_is_active'] === '1') {
$args['post_status'] = array('wc-open', 'wc-processing');
}
if ($request['wiaas_is_active'] === '0') {
$args['post_status'] = array('wc-completed', 'wc-cancelled');
}
}
return $args;
}
/**
* Apply wiaas custom transformation on retrieved JSON order object
*
* @param $response
* @param $order
* @param $request
*
* @return mixed
*/
public static function transform_rest_order($response, $order, $request) {
$data = $response->get_data();
# apply overrides
$data = self::_append_products_info($data, $order, $request);
$data = self::_append_order_process($data, $order, $request);
$data = self::_append_customer_info($data, $order, $request);
$data = self::_append_commercial_lead_info($data, $order, $request);
$response->set_data($data);
return $response;
}
/**
* PRIVATE
*/
/**
* Appends additional wiaas customer lead info to order json response
* @param $data
* @param $order
* @param $request
*
* @return mixed
*/
private static function _append_commercial_lead_info($data, $order, $request) {
$data['commercial_lead'] = array(
'name' => 'Coor Service Management',
'phone' => '123456789',
'email' => 'rikard@co-ideation.com'
);
return $data;
}
/**
* Appends additional wiaas customer info to order json response
* @param $data
* @param $order
* @param $request
*
* @return mixed
*/
private static function _append_customer_info($data, $order, $request) {
$current_user = wp_get_current_user();
$customer_id = $data['customer_id'];
$customer_user = get_user_by('id', $customer_id);
$data['customer'] = array(
'email' => $customer_user->user_email,
'name' => $customer_user->display_name,
'phone' => '+46 (10) 5595148'
);
$data['is_my_order'] = $customer_id === $current_user->ID;
return $data;
}
/**
* Filters only package product lines and appends additional wiaas products info to order json response
* @param $data
* @param $order
* @param $request
*
* @return mixed
*/
private static function _append_products_info($data, $order, $request) {
$line_items = array();
foreach ($data['line_items'] as $index => $product_line) {
// add only product lines that represent product bundles
if (empty($product_line['bundled_by'])) {
# lock all products to `Purchase` payment type
$product_line['payment_type'] = 'Purchase';
# lock all products to have no service
$product_line['service_price'] = 0;
$product_line['service_contract_period'] = 0;
$product_line['max_contract_period'] = 36;
$product_line['period_unit'] = 'month';
# simplify payment for all products
$product_line['recurring_price'] = 0;
$product_line['pay_period'] = 0;
# collect status from order
if ($data['status'] === 'completed') {
$product_line['status'] = 'production';
} else if ($data['status'] === 'cancelled') {
$product_line['status'] = 'cancelled';
} else {
$product_line['status'] = 'processing';
}
$product_line['short_desc'] = $product_line['status'];
# collect completion data from order
$product_line['date_completed'] = $data['date_completed'];
$line_items[] = $product_line;
}
}
$data['line_items'] = $line_items;
return $data;
}
/**
* Append order delivery process info if single order is requested
* @param $data
* @param $order
* @param $request
*
* @return mixed
*/
private static function _append_order_process($data, $order, $request) {
# if this is response to `/order/[id]`
if (isset($request['id'])) {
$data['delivery-process'] = Wiaas_Delivery_Process::get_order_delivery_process($order->get_id());
}
return $data;
}
}
Wiaas_Order::init();