From 8769606a4bb81293caf65fcd14cc39231cb48de7 Mon Sep 17 00:00:00 2001 From: Almira Krdzic Date: Wed, 17 Oct 2018 00:36:19 +0200 Subject: [PATCH] Implement shop search and refactor --- .../class-wiaas-admin-cl-customers.php | 14 ++- .../admin-cl/class-wiaas-admin-cl-orders.php | 11 ++ .../includes/admin/class-wiaas-admin-cl.php | 24 +++- .../class-wiaas-admin-order-projects.php | 14 --- .../admin/class-wiaas-admin-organization.php | 2 +- .../includes/api/class-wiaas-cart-api.php | 1 - .../includes/api/class-wiaas-package-api.php | 77 ------------ .../api/class-wiaas-rest-customer.php | 4 +- ...lass-wiaas-wc- package-api-integration.php | 118 ++++++++++++++++++ .../wiaas/includes/class-wiaas-api.php | 3 +- .../wiaas/includes/class-wiaas-cart.php | 71 +++++++---- .../wiaas/includes/class-wiaas-checkout.php | 11 -- .../wiaas/includes/class-wiaas-data-store.php | 11 -- .../plugins/wiaas/includes/class-wiaas-db.php | 11 ++ .../wiaas/includes/class-wiaas-order.php | 43 ++++++- .../wiaas/includes/class-wiaas-package.php | 4 +- .../wiaas/includes/class-wiaas-shop.php | 108 +++++++++++++--- .../class-wiaas-shop-db.php} | 2 +- .../includes/user/class-wiaas-customer.php | 12 ++ .../user/class-wiaas-user-organization.php | 4 +- backend/app/plugins/wiaas/wiaas.php | 2 +- .../coMarket/coMarketPackageDetailsActions.js | 2 +- .../coMarket/coMarketPackagesActions.js | 7 +- .../components/CoMarketCatalogSelect.jsx | 5 +- 24 files changed, 379 insertions(+), 182 deletions(-) delete mode 100644 backend/app/plugins/wiaas/includes/api/class-wiaas-package-api.php create mode 100644 backend/app/plugins/wiaas/includes/api/class-wiaas-wc- package-api-integration.php delete mode 100644 backend/app/plugins/wiaas/includes/class-wiaas-data-store.php create mode 100644 backend/app/plugins/wiaas/includes/class-wiaas-db.php rename backend/app/plugins/wiaas/includes/{data-stores/class-wiaas-shop-data-store.php => db/class-wiaas-shop-db.php} (99%) diff --git a/backend/app/plugins/wiaas/includes/admin/admin-cl/class-wiaas-admin-cl-customers.php b/backend/app/plugins/wiaas/includes/admin/admin-cl/class-wiaas-admin-cl-customers.php index 790e8f9..106edc2 100644 --- a/backend/app/plugins/wiaas/includes/admin/admin-cl/class-wiaas-admin-cl-customers.php +++ b/backend/app/plugins/wiaas/includes/admin/admin-cl/class-wiaas-admin-cl-customers.php @@ -7,6 +7,9 @@ class Wiaas_Admin_CL_Shop { add_action( 'admin_menu', array( __CLASS__, 'add_customers_page' ), 9 ); } + /** + * Add customer menu page for commercial lead + */ public static function add_customers_page() { add_menu_page( __( 'Customers', 'wiaas' ), @@ -18,10 +21,9 @@ class Wiaas_Admin_CL_Shop { '66.0' ); } - public static function output_orders() { - - } - + /** + * Render content for customer menu page + */ public static function output_customers() { $organization_id = wiaas_get_current_user_organization_id(); @@ -52,13 +54,13 @@ class Wiaas_Admin_CL_Shop { $customer_id = absint($_POST['customer_order_type']['customer_id']); $order_type = sanitize_key($_POST['customer_order_type']['order_type']); - Wiaas_Shop_Data_Store::update_shop_customer_order_type( + Wiaas_Shop::update_shop_customer_order_type( $organization_id, $customer_id, $order_type); } - $customers = Wiaas_Shop_Data_Store::get_shop_customers($organization_id); + $customers = Wiaas_Shop::get_shop_customers($organization_id); require 'views/html-admin-cl-customers-page.php'; } diff --git a/backend/app/plugins/wiaas/includes/admin/admin-cl/class-wiaas-admin-cl-orders.php b/backend/app/plugins/wiaas/includes/admin/admin-cl/class-wiaas-admin-cl-orders.php index 702f1e8..2b0f8bb 100644 --- a/backend/app/plugins/wiaas/includes/admin/admin-cl/class-wiaas-admin-cl-orders.php +++ b/backend/app/plugins/wiaas/includes/admin/admin-cl/class-wiaas-admin-cl-orders.php @@ -15,6 +15,17 @@ class Wiaas_Admin_CL_Orders { add_filter( 'manage_edit-shop_order_sortable_columns', array( __CLASS__, 'define_sortable_columns_for_list_table_orders' ) ); add_action('manage_shop_order_posts_custom_column', array(__CLASS__, 'render_columns_for_list_table_orders'), 999, 2); + + //add_filter('wc_order_types', array(__CLASS__, ''), 999, 32); + } + + public static function hide_order_customers_search( $order_types, $for ) { + + if ($for === 'order-meta-boxes') { + return array(); + } + + return $order_types; } public static function remove_bulk_actions_for_list_table_orders() { diff --git a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-cl.php b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-cl.php index c270634..807acf4 100644 --- a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-cl.php +++ b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-cl.php @@ -7,15 +7,29 @@ if ( ! defined( 'ABSPATH' ) ) { class Wiaas_Admin_CL { public static function init() { - require_once dirname( __FILE__ ) . '/admin-cl/class-wiaas-admin-cl-packages.php'; - require_once dirname( __FILE__ ) . '/admin-cl/class-wiaas-admin-cl-customers.php'; + add_action('init', array(__CLASS__, 'init_admin_cl')); + } - require_once dirname( __FILE__ ) . '/admin-cl/class-wiaas-admin-cl-orders.php'; + public static function init_admin_cl() { - require_once dirname( __FILE__ ) . '/admin-cl/class-wiaas-admin-cl-packages-list.php'; + $current_user = wp_get_current_user(); - require_once dirname( __FILE__ ) . '/admin-cl/wiaas-admin-cl-packages-ajax.php'; + $role = $current_user->roles[0]; + + $is_cl = $role === 'commercial_lead'; + + if ($is_cl) { + require_once dirname( __FILE__ ) . '/admin-cl/class-wiaas-admin-cl-packages.php'; + + require_once dirname( __FILE__ ) . '/admin-cl/class-wiaas-admin-cl-customers.php'; + + require_once dirname( __FILE__ ) . '/admin-cl/class-wiaas-admin-cl-orders.php'; + + require_once dirname( __FILE__ ) . '/admin-cl/class-wiaas-admin-cl-packages-list.php'; + + require_once dirname( __FILE__ ) . '/admin-cl/wiaas-admin-cl-packages-ajax.php'; + } } } diff --git a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-order-projects.php b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-order-projects.php index 4658164..df001f6 100644 --- a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-order-projects.php +++ b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-order-projects.php @@ -6,7 +6,6 @@ class Wiaas_Admin_Order_Projects { // Add admin page and subpage since woocommerce orders have custom menu page // so this will not be automatic add_filter('admin_menu', array(__CLASS__, 'add_admin_page')); - add_action( 'parent_file', array(__CLASS__, 'highlight_order_projects_parent_menu') ); // Add is available fields to create and edit forms add_action( 'shop_order_project_add_form_fields', array( __CLASS__, 'add_is_available_field' ) ); @@ -33,19 +32,6 @@ class Wiaas_Admin_Order_Projects { ); } - /** - * Correctly highlight parent menu page when order projects submenu is selected - * @param $parent_file - * - * @return string - */ - public static function highlight_order_projects_parent_menu($parent_file) { - if ( get_current_screen()->taxonomy == 'shop_order_project' ) { - $parent_file = 'woocommerce'; - } - return $parent_file; - } - /** * Add is available field to order project creation form */ diff --git a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-organization.php b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-organization.php index 9326143..f50c13f 100644 --- a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-organization.php +++ b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-organization.php @@ -69,7 +69,7 @@ class Wiaas_Admin_Organization { $id = absint(str_replace('term_', '', $id)); $customers = wp_list_pluck( - Wiaas_Shop_Data_Store::get_shop_customers($id), + Wiaas_Shop::get_shop_customers($id), 'customer_id'); return $customers; diff --git a/backend/app/plugins/wiaas/includes/api/class-wiaas-cart-api.php b/backend/app/plugins/wiaas/includes/api/class-wiaas-cart-api.php index d145758..004410b 100644 --- a/backend/app/plugins/wiaas/includes/api/class-wiaas-cart-api.php +++ b/backend/app/plugins/wiaas/includes/api/class-wiaas-cart-api.php @@ -218,7 +218,6 @@ class Wiaas_Cart_API { public static function get_cart_items() { return rest_ensure_response(array( 'items' => Wiaas_Cart::get_cart_packages(), - 'raw' => WC()->cart->get_cart_contents(), )); } diff --git a/backend/app/plugins/wiaas/includes/api/class-wiaas-package-api.php b/backend/app/plugins/wiaas/includes/api/class-wiaas-package-api.php deleted file mode 100644 index a09e089..0000000 --- a/backend/app/plugins/wiaas/includes/api/class-wiaas-package-api.php +++ /dev/null @@ -1,77 +0,0 @@ - 400 ) - ); - } - } - - return null; - } - - /** - * Filter woocommerce REST API query so only valid wiaas packages are returned to the customer - * - * @param $args - * @param $request - * - * @return mixed - */ - public static function filter_packages($args, $request) { - - if ( empty($query['tax_query']) ){ - $query['tax_query'] = array(); - } - - // Retrieve only packages with available package status - $query['tax_query'][] = array( - 'taxonomy' => 'package_status', - 'field' => 'name', - 'terms' => Wiaas_Package_Status::AVAILABLE - ); - - - $commercial_lead_id = absint($request['cl_id']); - - $customer_id = wiaas_get_current_user_organization_id(); - - $pay_types = array_keys(Wiaas_Package_Pricing::get_available_pay_types()); - - $price_search_terms = array(); - foreach ($pay_types as $pay_type) { - $price_search_terms[] = '_' . $commercial_lead_id . '_' . $pay_type . '_default'; - $price_search_terms[] = '_' . $commercial_lead_id . '_' . $pay_type . '_customer_' . $customer_id; - } - - $args['tax_query'][] = array( - 'taxonomy' => '_wiaas_shop_prices', - 'terms' => $price_search_terms, - 'field' => 'slug' - ); - - return $args; - } -} - -Wiaas_Package_API::init(); \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-customer.php b/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-customer.php index e4e9001..79bffe7 100644 --- a/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-customer.php +++ b/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-customer.php @@ -69,9 +69,7 @@ class Wiaas_REST_Customer_API { public static function get_customer_shops() { - $customer_id = wiaas_get_current_user_organization_id(); - - $customer_shops = Wiaas_Shop_Data_Store::get_customer_shops($customer_id); + $customer_shops = Wiaas_Customer::get_customer_shops(); $customer_shops = array_map(function($customer_shop) { return array( diff --git a/backend/app/plugins/wiaas/includes/api/class-wiaas-wc- package-api-integration.php b/backend/app/plugins/wiaas/includes/api/class-wiaas-wc- package-api-integration.php new file mode 100644 index 0000000..abc1073 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/api/class-wiaas-wc- package-api-integration.php @@ -0,0 +1,118 @@ + 400 ) + ); + } + } + + return null; + } + + /** + * Filter woocommerce REST API query so only valid wiaas packages are returned to the customer + * + * @param $args + * @param $request + * + * @return mixed + */ + public static function filter_packages($args, $request) { + + if ( empty($args['tax_query']) ){ + $args['tax_query'] = array(); + } + + // Retrieve only packages with available package status + $args['tax_query'][] = array( + 'taxonomy' => 'package_status', + 'field' => 'name', + 'terms' => Wiaas_Package_Status::AVAILABLE + ); + + /** + * Retrieve packages that satisfy one of two: + * + * 1) Package has at least one visible customer specific price set (for current customer) + * 2) Package has at least one visible default price set and not customer specific prices set (for current customer) + * + * This approach enables us that if package has specific prices set for current customer only those prices + * are taken into account and default ones are ignored. + * Only if package has no specific prices for current customer default prices are taken into account. + * + */ + + $shop_id = absint($request['shop_id']); + $customer_id = wiaas_get_current_user_organization_id(); + + $default_price_search_term = '_' . $shop_id . '_default'; + $customer_visible_price_search_term = '_' . $shop_id . '_customer_' . $customer_id . '_visible'; + $customer_hidden_price_search_term = '_' . $shop_id . '_customer_' . $customer_id . '_hidden'; + + $args['tax_query'][] = array( + 'relation' => 'OR', + array( + 'taxonomy' => '_wiaas_shop_prices', + 'terms' => $customer_visible_price_search_term, + 'field' => 'slug' + ), + array( + array( + 'taxonomy' => '_wiaas_shop_prices', + 'terms' => $default_price_search_term, + 'field' => 'slug' + ), + array( + 'taxonomy' => '_wiaas_shop_prices', + 'terms' => $customer_hidden_price_search_term, + 'field' => 'slug', + 'operator' => 'NOT IN' + ) + ) + ); + + return $args; + } +} + +Wiaas_WC_Package_API_Integration::init(); \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-api.php b/backend/app/plugins/wiaas/includes/class-wiaas-api.php index a394380..8cb4cb5 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-api.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-api.php @@ -43,7 +43,7 @@ class Wiaas_API { include_once dirname( __FILE__ ) . '/api/class-wiaas-order-projects-api.php'; - include_once dirname( __FILE__ ) . '/api/class-wiaas-package-api.php'; + include_once dirname( __FILE__ ) . '/api/class-wiaas-wc- package-api-integration.php'; // API functions include_once dirname( __FILE__ ) . '/api/wiaas-api-functions.php'; @@ -58,7 +58,6 @@ class Wiaas_API { 'Wiass_REST_User_API', 'Wiaas_REST_Customer_API', 'Wiaas_Order_Projects_API', - 'Wiaas_Package_API' ); foreach ( $controllers as $controller ) { diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-cart.php b/backend/app/plugins/wiaas/includes/class-wiaas-cart.php index 1b86e6f..96fb225 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-cart.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-cart.php @@ -26,6 +26,8 @@ class Wiaas_Cart { add_action( 'woocommerce_before_calculate_totals', array( __CLASS__, 'on_calculate_totals' ), 99, 1); add_action( 'woocommerce_cart_loaded_from_session', array( __CLASS__, 'on_calculate_totals' ), 99, 1); + + add_action('woocommerce_checkout_create_order', array(__CLASS__, 'add_additional_order_data'), 99); } /** @@ -114,13 +116,13 @@ class Wiaas_Cart { * * @param int $package_id Package ID of selected package * @param string $price_id Price ID of selected package payment - * @param int $commercial_lead_id Shop owner commercial lead ID + * @param int $shop_owner_id Shop owner commercial lead ID * @param array $addons_ids Array of selected additional packages IDs * @param array $options_ids Array of selected option packages IDs * * @return bool TRUE if all packages are succesfully added to cart, FALSE otherwise */ - public static function add_package_to_cart($package_id, $price_id, $commercial_lead_id, $addons_ids, $options_ids) { + public static function add_package_to_cart($package_id, $price_id, $shop_owner_id, $addons_ids, $options_ids) { // try adding package to cart try { // Check if package is in cart @@ -138,17 +140,28 @@ class Wiaas_Cart { //Check if package is available for adding to cart if (Wiaas_Package_Status::get_package_status($package_id) !== Wiaas_Package_Status::AVAILABLE){ - wc_add_notice('Package cannot be purchased at the moment', 'error'); + wc_add_notice('Package cannot be purchased at the moment!', 'error'); return false; } // Retrieve package country $country = Wiaas_Countries::get_package_country($package); + if (empty($country)) { + wc_add_notice('Package cannot be added do cart!', 'error'); + return false; + } + + // TODO: Add validation that only packages from the same country can be added to cart at the same time + update_user_meta( get_current_user_id(), '_wiaas_cart_items_country', $country); + + // TODO: Add validation that only packages from the same shop can be added to cart at the same time + update_user_meta( get_current_user_id(), '_wiaas_cart_shop_owner_id', $shop_owner_id); + $customer_id = wiaas_get_current_user_organization_id(); // Retrieve package price - $package_prices = Wiaas_Pricing::get_standard_package_customer_prices($package, $customer_id, $commercial_lead_id); + $package_prices = Wiaas_Pricing::get_standard_package_customer_prices($package, $customer_id, $shop_owner_id); $selected_price_index = array_search($price_id, array_column($package_prices, 'id')); @@ -157,9 +170,7 @@ class Wiaas_Cart { '_wiaas_standard_package' => true, '_wiaas_addon_items' => array(), '_wiaas_option_items' => array(), - '_wiaas_currency' => isset($country) ? $country['currency'] : get_woocommerce_currency(), '_wiaas_payment' => $package_prices[$selected_price_index] ? $package_prices[$selected_price_index] : null, - '_wiaas_commercial_lead_id' => $commercial_lead_id, '_wiaas_documents' => array() ); @@ -171,7 +182,7 @@ class Wiaas_Cart { } // Add selected additional packages and options - self::_add_additional_packages_to_cart($cart_item_key, $price_id, $commercial_lead_id, $addons_ids, $options_ids); + self::_add_additional_packages_to_cart($cart_item_key, $price_id, $shop_owner_id, $addons_ids, $options_ids); // Trigger calculation of total prices after additional packages are added WC()->cart->calculate_totals(); @@ -300,12 +311,6 @@ class Wiaas_Cart { if (isset($cart_item['_wiaas_standard_package'])) { $order_item->add_meta_data( '_wiaas_standard_package', $cart_item['_wiaas_standard_package'], true ); } - if (isset($cart_item['_wiaas_currency'])) { - $order_item->add_meta_data( '_wiaas_currency', $cart_item['_wiaas_currency'], true ); - } - if (isset($cart_item['_wiaas_commercial_lead_id'])) { - $order_item->add_meta_data( '_wiaas_commercial_lead_id', $cart_item['_wiaas_commercial_lead_id'], true ); - } // add options metadata if (isset($cart_item['_wiaas_option_items'])) { @@ -383,12 +388,33 @@ class Wiaas_Cart { '_wiaas_option_for', '_wiaas_option_group_name', '_wiaas_standard_package', - '_wiaas_currency', '_wiaas_documents', - '_wiaas_commercial_lead_id' ) ); } + /** + * Sets additional order data form cart after order is successfully created + * + * @param WC_Order $order + * + * @throws WC_Data_Exception + * + */ + public static function add_additional_order_data($order) { + + // set order currency + $country = get_user_meta(get_current_user_id(), '_wiaas_cart_items_country', true); + $currency = empty($country) ? get_woocommerce_currency() : $country['currency']; + + $order->set_currency($currency); + + // set order commercial lead + $shop_owner_id = get_user_meta(get_current_user_id(), '_wiaas_cart_shop_owner_id', true); + $shop_owner_id = absint($shop_owner_id); + + $order->add_meta_data('_wiaas_commercial_lead_id', $shop_owner_id); + } + /** * Calculate total cost for cart item * @@ -456,6 +482,9 @@ class Wiaas_Cart { public static function get_cart_packages() { $items = WC()->cart->get_cart_contents(); + $shop_owner_id = get_user_meta(get_current_user_id(), '_wiaas_cart_shop_owner_id', true); + $shop_owner_id = absint($shop_owner_id); + $package_items = array(); foreach ($items as $key => $item) { @@ -505,8 +534,8 @@ class Wiaas_Cart { 'package_name' => $package->get_title(), 'quantity' => $item['quantity'], - 'commercial_lead_id' => 14, - 'commercial_lead' => 'Coor Service Management', + 'commercial_lead_id' => $shop_owner_id, + 'commercial_lead' => wiaas_get_organization_name($shop_owner_id), 'country' => Wiaas_Countries::get_package_country($package), 'are_additional_available' => true, @@ -641,13 +670,13 @@ class Wiaas_Cart { * * @param string $package_cart_item_key * @param int $price_id - * @param int $commercial_lead_id + * @param int $shop_owner_id * @param array $addons_ids * @param array $options_ids * * @throws Exception if any of the addons or options cannot be added to cart */ - private static function _add_additional_packages_to_cart($package_cart_item_key, $price_id, $commercial_lead_id, $addons_ids, $options_ids) { + private static function _add_additional_packages_to_cart($package_cart_item_key, $price_id, $shop_owner_id, $addons_ids, $options_ids) { $parent_item = WC()->cart->get_cart_item($package_cart_item_key); @@ -669,7 +698,7 @@ class Wiaas_Cart { $addon_package, $parent_item['data'], $customer_id, - $commercial_lead_id + $shop_owner_id ); $selected_price_index = array_search($price_id, array_column($package_prices, 'id')); @@ -706,7 +735,7 @@ class Wiaas_Cart { $option_package, $parent_item['data'], $customer_id, - $commercial_lead_id); + $shop_owner_id); $selected_price_index = array_search($price_id, array_column($package_prices, 'id')); // Retrieve option package group name diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-checkout.php b/backend/app/plugins/wiaas/includes/class-wiaas-checkout.php index affad19..97ea33b 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-checkout.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-checkout.php @@ -83,17 +83,6 @@ class Wiaas_Checkout { * @param array $data */ private static function _add_wiaas_checkout_data($order, $data) { - // save currency - $line_items = $order->get_items(); - - $currency = array_column($line_items, 'wiaas_currency')[0]; - $currency = empty($currency) ? get_woocommerce_currency() : $currency; - $order->set_currency($currency); - - // set order commercial lead - $commercial_lead_id = array_column($line_items, 'wiaas_commercial_lead_id')[0]; - $order->add_meta_data('wiaas_commercial_lead_id', $commercial_lead_id, true); - $order->save_meta_data(); // save additional wiaas order info Wiaas_Order::set_order_vat($order->get_id(), $data['vat']); diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-data-store.php b/backend/app/plugins/wiaas/includes/class-wiaas-data-store.php deleted file mode 100644 index 92b04e1..0000000 --- a/backend/app/plugins/wiaas/includes/class-wiaas-data-store.php +++ /dev/null @@ -1,11 +0,0 @@ - 'edit_shop_order', + 'read_post' => 'read_shop_order', + 'delete_post' => 'delete_shop_order', + 'edit_posts' => 'edit_shop_orders', + 'edit_others_posts' => 'edit_others_shop_orders', + 'publish_posts' => 'publish_shop_orders', + 'read_private_posts' => 'read_private_shop_orders', + 'create_posts' => 'create_shop_orders', // use `create_shop_orders` instead of `edit_shop_orders` + ); + + return $args; + } + public static function update_new_order_comment_date($comment_data, $order_data) { $user = wp_get_current_user(); @@ -45,11 +76,17 @@ class Wiaas_Order { * @param $order_id */ public static function assign_order_to_organization($order_id) { + // assign order to customer organization $customer_id = wiaas_get_current_user_organization_id(); - - $commercial_lead_id = - Wiaas_User_Organization::assign_post_to_organization($order_id, $customer_id); + $order = wc_get_order($order_id); + + // assign order to commercial lead organization + $commercial_lead_id = absint($order->get_meta('_wiaas_commercial_lead_id', true)); + if ($commercial_lead_id) { + Wiaas_User_Organization::assign_post_to_organization($order_id, $commercial_lead_id); + } + } /** diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-package.php b/backend/app/plugins/wiaas/includes/class-wiaas-package.php index 0d6bd36..ff01b36 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-package.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-package.php @@ -94,7 +94,7 @@ class Wiaas_Package { */ private static function _append_additional_packages($data, $package, $request) { $customer_id = wiaas_get_current_user_organization_id(); - $commercial_lead_id = absint($request['cl_id']); + $commercial_lead_id = absint($request['shop_id']); $data['additional_packages'] = array(); $addons = Wiaas_Package_Addon::get_package_addons($package); @@ -142,7 +142,7 @@ class Wiaas_Package { */ private static function _append_package_prices($data, $package, $request) { $customer_id = wiaas_get_current_user_organization_id(); - $commercial_lead_id = absint($request['cl_id']); + $commercial_lead_id = absint($request['shop_id']); $data['prices'] = Wiaas_Pricing::get_standard_package_customer_prices($package, $customer_id, $commercial_lead_id); diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-shop.php b/backend/app/plugins/wiaas/includes/class-wiaas-shop.php index e8b31da..ae412a0 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-shop.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-shop.php @@ -1,5 +1,13 @@ true ))); + $old_terms = self::_get_search_terms_from_cl_extras($owner_id, $old_cl_extras); - $old_terms_names = preg_filter('/^/', '_' . $owner_id . '_', $old_visible_price_types); - - wp_remove_object_terms($package_id, $old_terms_names, '_wiaas_shop_prices'); + wp_remove_object_terms($package_id, $old_terms, '_wiaas_shop_prices'); } - // get visible price types set by shop owner (commercial lead) - $visible_price_types = array_keys(wp_list_filter($cl_extras, array('visible' => true))); - - $new_terms_names = preg_filter('/^/', '_' . $owner_id . '_', $visible_price_types); + $new_terms = self::_get_search_terms_from_cl_extras($owner_id, $cl_extras); // create term for every visible pricing type and link them to package so package can be queried - wp_add_object_terms($package_id, $new_terms_names, '_wiaas_shop_prices'); + wp_add_object_terms($package_id, $new_terms, '_wiaas_shop_prices'); } // PRIVATE + /** + * Each shop will be registered as product attribute. + * This will persist shops information into database. + * Also every attribute has taxonomy associated with it which will enable us to have multiple + * catalogues in one shop + * + * @param int $owner_id + */ private static function _maybe_create_shop($owner_id) { $shop_name = 'wiaas_shop_' . $owner_id; @@ -149,17 +171,24 @@ class Wiaas_Shop { if ($attribute_id === 0) { // create shop attribute - wc_create_attribute(array( 'slug' => $shop_name, 'name' => 'Catalogue' )); + wc_create_attribute(array( 'slug' => $shop_name, 'name' => 'Shop' )); $taxonomy_name = wc_attribute_taxonomy_name($shop_name); + // since attribute taxonomies are registered once on load + // we will register new attribute taxonomy here so default catalogue can be added register_taxonomy($taxonomy_name, array('product')); - // add default catalogue option to shop attribute - wp_insert_term( 'Default', $taxonomy_name); + // add default catalogue option to shop + wp_insert_term( 'Default Catalogue', $taxonomy_name); } } + /** + * Deleted associated attribute for shop. This will effectively remove shop and all of its potential catalogues + * + * @param int $owner_id + */ private static function _maybe_remove_shop($owner_id) { // get corresponding attribute for shop $attribute_id = wc_attribute_taxonomy_id_by_name('wiaas_shop_' . $owner_id); @@ -169,6 +198,55 @@ class Wiaas_Shop { wc_delete_attribute($attribute_id); } } + + /** + * Generate search terms from cl extras + * + * For default prices search term + * `_{owner_id}_default` will be generated if all set prices are visible + * + * For every customer entry search term + * `_{owner_id}_customer_{customer_id}_visible` will be generated if any of the prices is visible or + * `_{owner_id}_customer_{customer_id}_hidden` if all prices are hidden` + * + * @param int $owner_id + * @param array $cl_extras + * + * @return array + */ + private static function _get_search_terms_from_cl_extras($owner_id, $cl_extras) { + // determine if extras are visible grouped by customer and default settings + $cl_extras_per_customer = array(); + $cl_extra_default = false; + + foreach ($cl_extras as $cl_extra_type => $cl_extra) { + // is default + if (strpos($cl_extra_type, '_default') !== false) { + // determine if default cl extra is visible + $cl_extra_default = $cl_extra_default || $cl_extra['visible']; + } + // is customer specific + if (strpos($cl_extra_type, '_customer_') !== false) { + $customer_id = absint(explode('_customer_', $cl_extra_type)[1]); + // determine if customer cl extra is visible + $cl_extras_per_customer[$customer_id] = $cl_extras_per_customer[$customer_id] || $cl_extra['visible']; + } + } + + $terms = array(); + + if ($cl_extra_default) { + $terms[] = '_' . $owner_id . '_default'; + } + + foreach ($cl_extras_per_customer as $customer_id => $visible) { + + $terms[] = '_' . $owner_id . '_customer_' . $customer_id . '_' . + ($visible ? 'visible' : 'hidden'); + } + + return $terms; + } } Wiaas_Shop::init(); diff --git a/backend/app/plugins/wiaas/includes/data-stores/class-wiaas-shop-data-store.php b/backend/app/plugins/wiaas/includes/db/class-wiaas-shop-db.php similarity index 99% rename from backend/app/plugins/wiaas/includes/data-stores/class-wiaas-shop-data-store.php rename to backend/app/plugins/wiaas/includes/db/class-wiaas-shop-db.php index 30f0e3a..9a41f73 100644 --- a/backend/app/plugins/wiaas/includes/data-stores/class-wiaas-shop-data-store.php +++ b/backend/app/plugins/wiaas/includes/db/class-wiaas-shop-db.php @@ -1,6 +1,6 @@ $post_id, 'groups_read' => [$access_group_id] ) ); + Groups_Post_Access::create( array( 'post_id' => $post_id, 'group_id' => $access_group_id ) ); } } diff --git a/backend/app/plugins/wiaas/wiaas.php b/backend/app/plugins/wiaas/wiaas.php index 709ee49..bce0bf8 100644 --- a/backend/app/plugins/wiaas/wiaas.php +++ b/backend/app/plugins/wiaas/wiaas.php @@ -28,7 +28,7 @@ if (is_admin()) { include_once WIAAS_DIR . '/includes/class-wiaas-admin.php'; } -include_once WIAAS_DIR . '/includes/class-wiaas-data-store.php'; +include_once WIAAS_DIR . '/includes/class-wiaas-db.php'; include_once WIAAS_DIR . '/includes/class-wiaas-delivery-process.php'; diff --git a/frontend/src/actions/coMarket/coMarketPackageDetailsActions.js b/frontend/src/actions/coMarket/coMarketPackageDetailsActions.js index a69cb04..4135666 100644 --- a/frontend/src/actions/coMarket/coMarketPackageDetailsActions.js +++ b/frontend/src/actions/coMarket/coMarketPackageDetailsActions.js @@ -42,7 +42,7 @@ export const fetchPackageDetails = (params) => { return dispatch => { dispatch(requestPackageDetails()); return client.fetch({ - url: `${API_SERVER}/wp-json/wc/v2/products/${params.idPackage}?cl_id=${params.shopId}`, + url: `${API_SERVER}/wp-json/wc/v2/products/${params.idPackage}?shop_id=${params.shopId}`, method: 'get' }) .then(response => { diff --git a/frontend/src/actions/coMarket/coMarketPackagesActions.js b/frontend/src/actions/coMarket/coMarketPackagesActions.js index 6371f0b..45b1a6e 100644 --- a/frontend/src/actions/coMarket/coMarketPackagesActions.js +++ b/frontend/src/actions/coMarket/coMarketPackagesActions.js @@ -29,7 +29,7 @@ export const fetchShopPackages = (shop, search) => { let searchParam = search ? '?search=' +search : '' return client.fetch({ - url: `${API_SERVER}/wp-json/wc/v2/products?cl_id=${shop.id}` + searchParam, + url: `${API_SERVER}/wp-json/wc/v2/products?shop_id=${shop.id}` + searchParam, }) .then(response => { if (response.data) { @@ -59,10 +59,11 @@ const generateShopOptions = (shops) => { return shops; } -export const fetchShops = () => { +export const fetchShops = (userId) => { return dispatch => { dispatch(requestShops()); - return client.fetch({url: `${API_SERVER}/wp-json/wiaas/customer/0/shops` }) + + return client.fetch({url: `${API_SERVER}/wp-json/wiaas/customer/${userId}/shops` }) .then(response => { if(response.data){ diff --git a/frontend/src/containers/coMarket/components/CoMarketCatalogSelect.jsx b/frontend/src/containers/coMarket/components/CoMarketCatalogSelect.jsx index bb5351c..4f519cf 100644 --- a/frontend/src/containers/coMarket/components/CoMarketCatalogSelect.jsx +++ b/frontend/src/containers/coMarket/components/CoMarketCatalogSelect.jsx @@ -16,7 +16,7 @@ class CoMarketCatalogSelect extends Component { } componentDidMount() { - this.props.dispatch(fetchShops()); + this.props.dispatch(fetchShops(this.props.userInfo.wiaas_id_user)); if(this.props.shops && this.props.cartItems && this.props.activeModule==='cart'){ const cartShop = this.props.shops.find( shop => { return shop.id===this.props.cartItems[0].idCommercialLead }); @@ -80,7 +80,8 @@ const mapStateToProps = (state) => ({ selectedShop: state.coMarketPackagesReducer.selectedShop, idPackage: state.coMarketReducer.idPackage, cartItems: state.cartReducer.cartItems, - activeSubmodule: state.pageReducer.activeSubmodule + activeSubmodule: state.pageReducer.activeSubmodule, + userInfo: state.auth.userInfo }); export default connect(mapStateToProps)(CoMarketCatalogSelect);