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 new file mode 100644 index 0000000..28e74b9 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-order-projects.php @@ -0,0 +1,131 @@ +taxonomy == 'shop_order_project' ) { + $parent_file = 'woocommerce'; + } + return $parent_file; + } + + /** + * Add is available field to order project creation form + */ + public static function add_is_available_field() { + ?> +
+ + +
+ + + + + + /> + + + 'GET', + register_rest_route( self::$namespace, '/' . self::$rest_base . '/count', array( + 'methods' => WP_REST_Server::READABLE, 'callback' => array(__CLASS__, 'get_cart_count'), - 'permission_callback' => array( __CLASS__, 'permission_check' ), + 'permission_callback' => 'is_user_logged_in', ) ); - register_rest_route( self::$namespace, 'items', array( - 'methods' => 'GET', - 'callback' => array(__CLASS__, 'get_cart_items'), - 'permission_callback' => array( __CLASS__, 'permission_check' ), + register_rest_route( self::$namespace, '/' . self::$rest_base . '/items', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array(__CLASS__, 'get_cart_items'), + 'permission_callback' => 'is_user_logged_in', + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array(__CLASS__, 'add_package_to_cart'), + 'permission_callback' => 'is_user_logged_in', + 'args' => array( + 'package_id' => array( + 'description' => __( 'Wiaas package ID.', 'wiaas' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + ), + 'price_id' => array( + 'description' => __( 'Selected price ID for Wiaas package.', 'wiaas' ), + 'type' => 'string', + 'enum' => array_keys(Wiaas_Package_Pricing::get_available_pay_types()), + 'sanitize_callback' => 'sanitize_key', + 'validate_callback' => 'rest_validate_request_arg', + ), + 'options_ids' => array( + 'description' => __( 'Wiaas package options IDs.', 'wiaas' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + ) + ), + 'addons_ids' => array( + 'description' => __( 'Wiaas package addons IDs.', 'wiaas' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + ) + ) + ) + ), ) ); - register_rest_route( self::$namespace, 'documents', array( - 'methods' => 'GET', - 'callback' => array(__CLASS__, 'get_cart_documents'), - 'permission_callback' => array( __CLASS__, 'permission_check' ), + register_rest_route( self::$namespace, '/' . self::$rest_base . '/items/(?P[\w-]+)', array( + 'args' => array( + 'key' => array( + 'description' => __( 'Unique key identifier for cart package item.', 'wiaas' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_key', + 'validate_callback' => 'rest_validate_request_arg', + ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array(__CLASS__, 'remove_package_from_cart'), + 'permission_callback' => 'is_user_logged_in', + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array(__CLASS__, 'update_package_quantity'), + 'permission_callback' => 'is_user_logged_in', + 'args' => array( + 'quantity' => array( + 'description' => __( 'New quantity cart package item.', 'wiaas' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + ) + ) + ) ) ); - register_rest_route( self::$namespace, 'add', array( - 'methods' => 'post', - 'callback' => array(__CLASS__, 'add_package_to_cart'), - 'permission_callback' => array( __CLASS__, 'permission_check' ), + register_rest_route( self::$namespace, '/' . self::$rest_base . '/checkout', array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array(__CLASS__, 'checkout'), + 'permission_callback' => 'is_user_logged_in', + 'args' => array( + 'vat' => array( + 'description' => __( 'Vat Code for new order.', 'wiaas' ), + 'type' => 'string', + 'required' => true, + 'sanitize_callback' => 'sanitize_key', + ), + 'company' => array( + 'description' => __( 'Company name for new order.', 'wiaas' ), + 'type' => 'string', + 'required' => true, + 'sanitize_callback' => 'sanitize_key', + ), + 'reference' => array( + 'description' => __( 'Location details for new order.', 'wiaas' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_key', + ), + 'tender' => array( + 'description' => __( 'Invoice reference for new order.', 'wiaas' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_key', + ), + 'project_id' => array( + 'description' => __( 'Order project ID for new order.', 'wiaas' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + ), + 'delivery_address_id' => array( + 'description' => __( 'ID of delivery address for new order.', 'wiaas' ), + 'type' => 'integer', + 'required' => true, + 'sanitize_callback' => 'absint', + ), + 'billing_address_id' => array( + 'description' => __( 'ID of billing address for new order.', 'wiaas' ), + 'type' => 'integer', + 'required' => true, + 'sanitize_callback' => 'absint', + ), + ) ) ); - - register_rest_route( self::$namespace, 'remove', array( - 'methods' => 'post', - 'callback' => array(__CLASS__, 'remove_package_from_cart'), - 'permission_callback' => array( __CLASS__, 'permission_check' ), - ) ); - - register_rest_route( self::$namespace, 'update-quantity', array( - 'methods' => 'post', - 'callback' => array(__CLASS__, 'update_package_quantity'), - 'permission_callback' => array( __CLASS__, 'permission_check' ), - ) ); - - register_rest_route( self::$namespace, 'place-order', array( - 'methods' => 'post', - 'callback' => array(__CLASS__, 'place_order'), - 'permission_callback' => array( __CLASS__, 'permission_check' ), - ) ); - } - - public static function permission_check() { - if (!is_user_logged_in()) { - return new WP_Error( 'wiaas_rest_authorization_required', - __( 'Sorry, only authorized users can access!', 'wiaas' ), - array( 'status' => rest_authorization_required_code() ) ); - } - return true; } /** * Get cart count - * TODO: This implementation is temporary to enable flow trough basic checkout process and should be changed * @return WP_REST_Response */ public static function get_cart_count() { - $items = WC()->cart->get_cart_contents(); - - $count = 0; - - foreach ($items as $key => $item) { - if (isset($item['_wiaas_standard_package'])) { - $count++; - } - } - - return new WP_REST_Response(array( - 'count' => $count, + return rest_ensure_response(array( + 'count' => Wiaas_Cart::get_cart_packages_count(), )); } /** * Get cart items - * TODO: This implementation is temporary to enable flow trough basic checkout process and should be changed + * * @return WP_REST_Response */ public static function get_cart_items() { - $items = WC()->cart->get_cart_contents(); - - $result = array(); - - foreach ($items as $key => $item) { - if (!isset($item['_wiaas_standard_package'])) { - continue; - } - - $package = wc_get_product($item['product_id']); - - // Retrieve package addons - $addon_cart_items = wiaas_get_cart_item_addons($item); - $additional_packages = array(); - - foreach ($addon_cart_items as $addon_cart_item) { - $additional_package = wc_get_product($addon_cart_item['product_id']); - $additional_packages[] = array( - 'idAdditionalPackage' => $additional_package->get_id(), - 'packageName' => $additional_package->get_title(), - 'prices' => array( - 'fixedExtra' => $addon_cart_item['_wiaas_payment']['fixed_extra'], - 'recurrentExtra' => $addon_cart_item['_wiaas_payment']['recurrent_extra'], - 'servicesExtra' => $addon_cart_item['_wiaas_payment']['services_extra'], - ) - ); - } - - // Retrieve package options - $option_cart_items = wiaas_get_cart_item_options($item); - $package_options = array(); - foreach ($option_cart_items as $option_cart_item) { - $option_package = wc_get_product($option_cart_item['product_id']); - $package_options[] = array( - 'idOptionPackage' => $option_package->get_id(), - 'groupName' => $option_cart_item['_wiaas_option_group_name'], - 'packageName' => $option_package->get_title(), - 'prices' => array( - 'fixedExtra' => $option_cart_item['_wiaas_payment']['fixed_extra'], - 'recurrentExtra' => $option_cart_item['_wiaas_payment']['recurrent_extra'], - 'servicesExtra' => $option_cart_item['_wiaas_payment']['services_extra'], - ) - ); - } - - $totalPrices = Wiaas_Cart::get_cart_item_total($item); - - $country = Wiaas_Countries::get_package_country($package); + return rest_ensure_response(array( + 'items' => Wiaas_Cart::get_cart_packages(), + )); + } - $result[] = array( - 'idPackage' => $item['product_id'], - 'key' => $item['key'], - 'packageName' => $package->get_title(), - 'additionalPackages' => $additional_packages, - 'areAdditionalAvailable' => true, - 'areOptionsAvailable' => true, - 'bids' => array(), - 'commercialLead' => 'Coor Service Management', - 'country' => array( - 'currency' => $country['currency'] - ), - 'options' => $package_options, - 'quantity' => $item['quantity'], + /** + * @param WP_REST_Request $request Request data. + * + * @return WP_REST_Response + */ + public static function add_package_to_cart($request) { - 'idPayType' => $item['_wiaas_payment']['id'], - 'payType' => $item['_wiaas_payment']['payment_type'], - 'periodUnit' => $item['_wiaas_payment']['period_unit'], - 'idPrice' => $item['_wiaas_payment']['id'], - 'fixedPrice' => $item['_wiaas_payment']['fixed_extra'], - 'recurrentPrice' => $item['_wiaas_payment']['recurrent_extra'], - 'servicesPrice' => $item['_wiaas_payment']['services_extra'], - - 'totalPrices' => array( - 'fixedPrice' => $totalPrices['fixed_extra'], - 'recurrentPrice' => $totalPrices['recurrent_extra'], - 'servicesPrice' => $totalPrices['services_extra'], - ), - - 'status' => 'available', - 'idCommercialLead' => 14, - ); - } - return new WP_REST_Response( - array( - 'cartItems' => $result, - 'items' => $items, - 'totalPrice' => '' - ) + $success = Wiaas_Cart::add_package_to_cart( + $request['package_id'], + $request['price_id'], + $request['addons_ids'], + $request['options_ids'] ); + + if ($success) { + return wiaas_api_notice('PACKAGE_ADDED', 'success'); + } + + return wiaas_api_notice('PACKAGE_ALREADY_IN_CART', 'error'); } /** - * Get cart documents - * TODO: This implementation is temporary to enable flow trough basic checkout process and should be changed + * @param WP_REST_Request $request Request data. + * * @return WP_REST_Response */ - public static function get_cart_documents() { - return new WP_REST_Response(array( - 'areFilesUploaded' => true, - 'templates' => array(), - 'uploaded' => array() - )); - } + public static function remove_package_from_cart($request) { - /** - * Add package to cart - * TODO: This implementation is temporary to enable flow trough basic checkout process and should be changed - * @return WP_REST_Response - * @throws Exception - */ - public static function add_package_to_cart() { - $package_id = $_POST['package_id']; - - $success = WC()->cart->add_to_cart($package_id, 1, 0, array(), array( - '_wiaas_standard_package' => true - )); + $success = Wiaas_Cart::remove_package_from_cart($request['key']); if ($success) { - return new WP_REST_Response(array( - 'messages' => array( - array( - 'code' => 'success', - 'message' => 'PACKAGE_ADDED' - ) - ) - )); + return wiaas_api_notice('PACKAGE_REMOVED_FROM_CART', 'success'); } - return new WP_REST_Response(array( - 'messages' => array( - array( - 'code' => 'error', - 'message' => 'PACKAGE_ALREADY_IN_CART' - ) - ) - )); - } - - /* - * Remove package from cart - * TODO: This implementation is temporary to enable flow trough basic checkout process and should be changed - */ - public static function remove_package_from_cart() { - $package_cart_key = $_POST['package_item_key']; - - $success = WC()->cart->remove_cart_item($package_cart_key); - - if ($success) { - return new WP_REST_Response(array( - 'messages' => array( - array( - 'code' => 'success', - 'message' => 'PACKAGE_REMOVED_FROM_CART' - ) - ) - )); - } - - return new WP_REST_Response(array( - 'messages' => array( - array( - 'code' => 'error', - 'message' => 'INVALID_PACKAGE_FOR_REMOVE' - ) - ) - )); + return wiaas_api_notice('INVALID_PACKAGE_FOR_REMOVE', 'error'); } /** * Update package quantity in cart - * TODO: This implementation is temporary to enable flow trough basic checkout process and should be changed * @return WP_REST_Response */ - public static function update_package_quantity() { - $package_item_key = $_POST['package_item_key']; - $new_quantity = $_POST['quantity']; + public static function update_package_quantity($request) { - $success = WC()->cart->set_quantity($package_item_key, $new_quantity, true); + $success = Wiaas_Cart::update_package_quantity($request['key'], $request['quantity']); if ($success) { - return new WP_REST_Response(array( - 'messages' => array( - array( - 'code' => 'success', - 'message' => 'QUANTITY_UPDATED' - ) - ) - )); + return wiaas_api_notice('QUANTITY_UPDATED', 'success'); } - return new WP_REST_Response(array( - 'messages' => array( - array( - 'code' => 'error', - 'message' => 'QUANTITY_NOT_UPDATED' - ) - ) - )); + return wiaas_api_notice('QUANTITY_NOT_UPDATED', 'error'); } + /** - * Placing order as part of checkout process - * TODO: This implementation is temporary to enable flow trough basic checkout process and should be changed + * @param WP_REST_Request $request Request data. + * * @return WP_REST_Response - * @throws Exception */ - public static function place_order() { + public static function checkout($request) { - $details = $_POST['details']; - $vat_code = $_POST['vat']; - $company_name = $_POST['companyName']; - $delivery_address = $_POST['delivery']; - $billing_address = $_POST['billing']; + Wiaas_Checkout::process_checkout($request->get_body_params()); - $order_id = WC()->checkout()->create_order(array()); - $order = wc_get_order( $order_id ); - - // set order currency - $line_items = $order->get_items(); - foreach ($line_items as $line_item) { - if (isset($line_item['wiaas_currency'])) { - $order->set_currency($line_item['wiaas_currency']); - break; - } - } - - $order->set_shipping_city($delivery_address['city']); - $order->set_shipping_country($delivery_address['countryName']); - $order->set_shipping_address_1($delivery_address['detailedAddress']); - $order->set_shipping_postcode($delivery_address['zipCode']); - - $order->set_billing_city($billing_address['city']); - $order->set_billing_country($billing_address['countryName']); - $order->set_billing_address_1($billing_address['detailedAddress']); - $order->set_billing_postcode($billing_address['zipCode']); - $order->set_billing_first_name($billing_address['firstName']); - $order->set_billing_last_name($billing_address['lastName']); - - $order->payment_complete(); - - - add_post_meta($order_id, '_wiaas_vat_code', $vat_code); - add_post_meta($order_id, '_wiaas_company_name', $company_name); - add_post_meta($order_id, '_wiaas_project_id', $details['idProject']); - add_post_meta($order_id, '_wiaas_reference', $details['reference']); - add_post_meta($order_id, '_wiaas_tender', $details['tender']); - - // $order->get_li - - WC()->cart->empty_cart( true ); - - return new WP_REST_Response(array( - 'messages' => array( - array( - 'code' => 'success', - 'message' => 'ORDER_PLACED' - ) - ), - 'details' => $details - )); + return wiaas_api_notice('ORDER_PLACED', 'success'); } } \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/api/class-wiaas-order-projects-api.php b/backend/app/plugins/wiaas/includes/api/class-wiaas-order-projects-api.php new file mode 100644 index 0000000..f5a3f73 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/api/class-wiaas-order-projects-api.php @@ -0,0 +1,83 @@ + WP_REST_Server::READABLE, + 'callback' => array( __CLASS__, 'get_order_projects' ), + 'permission_callback' => 'is_user_logged_in', + 'args' => array(), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( __CLASS__, 'create_order_project' ), + 'permission_callback' => 'is_user_logged_in', + 'args' => array( + 'name' => array( + 'type' => 'string', + 'description' => __( 'Order project name.', 'wiaas' ), + 'required' => true, + 'sanitize_callback' => 'sanitize_title', + 'validate_callback' => function($param, $request, $key) { + if ($param === '') { + return new WP_Error( + 'rest_invalid_param', + 'Order project name cannot be empty!' + ); + } + if (strlen($param) > 100) { + return new WP_Error( + 'rest_invalid_param', + 'Order project name cannot be longer than 100 characters!' + ); + } + }, + ), + ), + ) + ) ); + } + + + /** + * Retrieves available order projects + * + * @return WP_REST_Response + */ + public static function get_order_projects() { + $projects = Wiaas_Order_Project::get_available_order_projects(); + + return rest_ensure_response($projects); + } + + /** + * Creates new available order project + * + * @param WP_REST_Request $request Request data. + * + * @return WP_REST_Response + */ + public static function create_order_project($request) { + $name = $request['name']; + + $success = Wiaas_Order_Project::add_order_project($name); + if ($success) { + return wiaas_api_notice('PROJECT_ADDED', 'success'); + } + + return wiaas_api_notice('INVALID_DATA', 'error'); + } + +} \ 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 487e8b8..fbf7c0e 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 @@ -62,10 +62,10 @@ class Wiaas_REST_Customer_API { $new_address = json_decode($params['profile_address']); if (!Wiaas_Customer::update_customer_profile_addresses($customer_id, $new_address)){ - return self::generate_wiaas_response('PROFILE_ADDRESS_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('PROFILE_ADDRESS_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); } - return self::generate_wiaas_response('PROFILE_ADDRESS_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('PROFILE_ADDRESS_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); } public static function delete_customer_profile_address(WP_REST_Request $request){ @@ -73,10 +73,10 @@ class Wiaas_REST_Customer_API { $address_id = $request['address_id']; if (!Wiaas_Customer::delete_customer_profile_address($customer_id, $address_id)){ - return self::generate_wiaas_response('ADDRESS_ERROR', 'error', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('ADDRESS_ERROR', 'error', Wiaas_Customer::get_customer_info($customer_id)); } - return self::generate_wiaas_response('ADDRESS_REMOVED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('ADDRESS_REMOVED', 'success', Wiaas_Customer::get_customer_info($customer_id)); } public static function update_customer_billing_addresses(WP_REST_Request $request){ @@ -85,10 +85,10 @@ class Wiaas_REST_Customer_API { $new_address = json_decode($params['billing_address']); if (!Wiaas_Customer::update_customer_billing_addresses($customer_id, $new_address)){ - return self::generate_wiaas_response('BILLING_ADDRESS_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('BILLING_ADDRESS_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); } - return self::generate_wiaas_response('BILLING_ADDRESS_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('BILLING_ADDRESS_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); } @@ -97,10 +97,10 @@ class Wiaas_REST_Customer_API { $address_id = $request['address_id']; if (!Wiaas_Customer::delete_customer_billing_address($customer_id, $address_id)){ - return self::generate_wiaas_response('ADDRESS_ERROR', 'error', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('ADDRESS_ERROR', 'error', Wiaas_Customer::get_customer_info($customer_id)); } - return self::generate_wiaas_response('ADDRESS_REMOVED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('ADDRESS_REMOVED', 'success', Wiaas_Customer::get_customer_info($customer_id)); } public static function update_customer_personal_info(WP_REST_Request $request){ @@ -113,18 +113,18 @@ class Wiaas_REST_Customer_API { $name = $first_name . ' ' . $last_name; if (!is_string($name) || strlen($name) === 1){ - return self::generate_wiaas_response('ADD_NAME', 'error', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('ADD_NAME', 'error', Wiaas_Customer::get_customer_info($customer_id)); } if (!is_string($phone) || strlen($phone) < 1){ - return self::generate_wiaas_response('ADD_PHONE_NUMBER', 'error', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('ADD_PHONE_NUMBER', 'error', Wiaas_Customer::get_customer_info($customer_id)); } if (!Wiaas_Customer::update_customer_profile_info($customer_id, $first_name, $last_name, $phone)){ - return self::generate_wiaas_response('PROFILE_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('PROFILE_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); } - return self::generate_wiaas_response('PROFILE_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('PROFILE_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); } public static function update_customer_company_info(WP_REST_Request $request){ @@ -136,38 +136,18 @@ class Wiaas_REST_Customer_API { if (!is_string($company_name) || strlen($company_name) < 1){ - return self::generate_wiaas_response('ADD_COMPANY_NAME', 'error', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('ADD_COMPANY_NAME', 'error', Wiaas_Customer::get_customer_info($customer_id)); } if (!is_string($vat_code) || strlen($vat_code) < 1){ - return self::generate_wiaas_response('ADD_VAT', 'error', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('ADD_VAT', 'error', Wiaas_Customer::get_customer_info($customer_id)); } if (!Wiaas_Customer::update_customer_company_info($customer_id, $company_name, $vat_code)){ - return self::generate_wiaas_response('COMPANY_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); + return wiaas_api_notice('COMPANY_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); } - return self::generate_wiaas_response('COMPANY_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); - - + return wiaas_api_notice('COMPANY_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); } - - - - private static function generate_wiaas_response($message, $code, $data = NULL){ - $response = array( - 'messages' => [ - array( - 'code' => $code, - 'message' => $message - ) - ], - 'data' => $data - ); - - return new WP_REST_Response($response); - } - - } \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-delivery-process-api.php b/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-delivery-process-api.php index e575199..de409a7 100644 --- a/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-delivery-process-api.php +++ b/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-delivery-process-api.php @@ -93,15 +93,13 @@ class Wiass_REST_Delivery_Process_API { ); } - $response = new WP_REST_Response( $data ); - - return $response; + return rest_ensure_response($data); } public static function get_customer_acceptance(WP_REST_Request $request){ $entry = GFAPI::get_entry($request['entry_id']); if (is_wp_error($entry)){ - return self::generate_error('Customer acceptance entry not found', 404); + return wiaas_api_generate_error('Customer acceptance entry not found', 404); } $acceptance_documents = array(); @@ -130,27 +128,25 @@ class Wiass_REST_Delivery_Process_API { $acceptance_status = ($entry[self::ACCEPTANCE_STATUS_FIELD_ID] === 'accept') ? 1 : -1; } - $result = array( + return rest_ensure_response(array( 'documents' => $acceptance_documents, 'expiration' => $entry[self::EXPIRATION_DATE_FIELD_ID], 'status' => $acceptance_status, 'decline_reason' => $entry[self::DECLINE_REASON_FIELD_ID] - ); - - return new WP_REST_Response($result); + )); } public static function submit_customer_acceptance(WP_REST_Request $request){ $entry = GFAPI::get_entry($request['entry_id']); if (is_wp_error($entry)){ - return self::generate_error('Customer acceptance entry not found', 404); + return wiaas_api_generate_error('Customer acceptance entry not found', 404); } $status = $request['actionType']; $reason = $request['declineReason']; if (!in_array($status, self::ACCEPTABLE_STATUS)){ - return self::generate_wiaas_response('ACCEPTANCE_STATUS_MISSING', 'error'); + return wiaas_api_notice('ACCEPTANCE_STATUS_MISSING', 'error'); } $installation_declined = ($status === self::DECLINE_STATUS_LABEL); @@ -158,25 +154,25 @@ class Wiass_REST_Delivery_Process_API { $uploaded_files = json_decode($entry[self::UPLOADED_FILES_FIELD_ID]); if ($installation_declined && $reason === ''){ - return self::generate_wiaas_response('DECLINE_REASON_EMPTY', 'error'); + return wiaas_api_notice('DECLINE_REASON_EMPTY', 'error'); } if (!$installation_declined && (count($uploaded_files)===0)){ - return self::generate_wiaas_response('ACCEPTANCE_NOT_UPLOADED', 'error'); + return wiaas_api_notice('ACCEPTANCE_NOT_UPLOADED', 'error'); } $entry[self::DECLINE_REASON_FIELD_ID] = $reason; $entry[self::ACCEPTANCE_STATUS_FIELD_ID] = $status; if (!GFAPI::update_entry( $entry )){ - return self::generate_wiaas_response('INTERNAL_SERVER_ERROR', 'error'); + return wiaas_api_notice('INTERNAL_SERVER_ERROR', 'error'); } //Check if step is already completed, to not submit again $gf_api = new Gravity_Flow_API($entry['form_id']); $current_step = $gf_api->get_current_step($entry); if ($current_step->get_name() !== self::USER_INPUT_STEP_NAME){ - return self::generate_wiaas_response('ACCEPTANCE_STATUS_UPDATED', 'success'); + return wiaas_api_notice('ACCEPTANCE_STATUS_UPDATED', 'success'); } if ( $current_step ) { @@ -195,20 +191,20 @@ class Wiass_REST_Delivery_Process_API { if ($installation_declined){ - return self::generate_wiaas_response('INSTALLATION_DECLINED', 'success'); + return wiaas_api_notice('INSTALLATION_DECLINED', 'success'); } - return self::generate_wiaas_response('INSTALLATION_ACCEPTED', 'success'); + return wiaas_api_notice('INSTALLATION_ACCEPTED', 'success'); } public static function upload_file(WP_REST_Request $request){ $files = $request->get_file_params(); if (!$files[self::FILE_KEY_NAME]){ - return self::generate_wiaas_response('NO_FILES_UPLOADED', 'error'); + return wiaas_api_notice('NO_FILES_UPLOADED', 'error'); } $entry = GFAPI::get_entry($request['entry_id']); if (is_wp_error($entry)){ - return self::generate_error('Customer acceptance entry not found', 404); + return wiaas_api_generate_error('Customer acceptance entry not found', 404); } $form = GFAPI::get_form($entry['form_id']); @@ -223,12 +219,12 @@ class Wiass_REST_Delivery_Process_API { $file_path_details = pathinfo($file_name); if ( GFCommon::file_name_has_disallowed_extension( $file_name ) ) { - return self::generate_wiaas_response('INVALID_FILE_ACCEPTANCE', 'error'); + return wiaas_api_notice('INVALID_FILE_ACCEPTANCE', 'error'); } $allowed_extensions = ! empty( $upload_file_field->allowedExtensions ) ? GFCommon::clean_extensions( explode( ',', strtolower( $upload_file_field->allowedExtensions ) ) ) : array(); if ( ! empty( $allowed_extensions ) ) { if ( ! GFCommon::match_file_extension( $file_name, $allowed_extensions ) ) { - return self::generate_wiaas_response('INVALID_FILE_ACCEPTANCE', 'error'); + return wiaas_api_notice('INVALID_FILE_ACCEPTANCE', 'error'); } } @@ -236,13 +232,13 @@ class Wiass_REST_Delivery_Process_API { // Bypasses security checks when running unit tests. if ( defined( 'WP_TEST_IN_PROGRESS' ) && WP_TEST_IN_PROGRESS ) { - return self::generate_wiaas_response('FILE_UPLOADED', 'success'); + return wiaas_api_notice('FILE_UPLOADED', 'success'); } if ( move_uploaded_file($files[self::FILE_KEY_NAME]['tmp_name'], $target_path . $new_file_name ) ) { GFFormsModel::set_permissions( $target_path . $new_file_name ); } else { - return self::generate_wiaas_response('INTERNAL_SERVER_ERROR', 'error'); + return wiaas_api_notice('INTERNAL_SERVER_ERROR', 'error'); } //Extract path relative to the root @@ -269,35 +265,9 @@ class Wiass_REST_Delivery_Process_API { $entry[self::UPLOADED_FILES_FIELD_ID] = json_encode($uploaded_files); if (GFAPI::update_entry( $entry )) { - return self::generate_wiaas_response('FILE_UPLOADED','success'); + return wiaas_api_notice('FILE_UPLOADED','success'); } - return self::generate_wiaas_response('NOT_UPLOADED', 'error'); - } - - //Helper function - private static function generate_error($message, $code = 500){ - $error = array( - 'status' => $code, - 'message' => $message, - ); - - $result = new WP_REST_Response($error); - $result->set_status($code); - return $result; - } - - private static function generate_wiaas_response($message, $code, $data = NULL){ - $response = array( - 'messages' => [ - array( - 'code' => $code, - 'message' => $message - ) - ], - 'data' => $data - ); - - return new WP_REST_Response($response); + return wiaas_api_notice('NOT_UPLOADED', 'error'); } } \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-user-api.php b/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-user-api.php index 1615ad5..2b8cf3e 100644 --- a/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-user-api.php +++ b/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-user-api.php @@ -31,7 +31,7 @@ class Wiass_REST_User_API { public static function validate_token() { $user = wp_get_current_user(); - return new WP_REST_Response(array( + return rest_ensure_response(array( 'userInfo' => array( 'wiaas_id_user' => $user->ID, 'wiaas_is_company_admin' => 1, //TODO: don't hardcode this @@ -45,6 +45,6 @@ class Wiass_REST_User_API { public static function get_countries(){ $countries = Wiaas_Countries::get_list_of_countries(); - return new WP_REST_Response($countries); + return rest_ensure_response($countries); } } \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/api/wiaas-api-functions.php b/backend/app/plugins/wiaas/includes/api/wiaas-api-functions.php new file mode 100644 index 0000000..fb34974 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/api/wiaas-api-functions.php @@ -0,0 +1,40 @@ + [ + array( + 'code' => $code, + 'message' => $message + ) + ], + 'data' => $data + )); +} + +/** + * Generate REST API error + * + * @param string $message + * @param int $code + * + * @return WP_REST_Response + */ +function wiaas_api_generate_error($message, $code = 500) { + $response = rest_ensure_response(array( + 'status' => $code, + 'message' => $message, + )); + $response->set_status($code); + return $response; +} \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-admin.php b/backend/app/plugins/wiaas/includes/class-wiaas-admin.php index 6af9d1d..5b688a4 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-admin.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-admin.php @@ -12,6 +12,9 @@ class Wiaas_Admin { require_once dirname(__FILE__) . '/admin/template/class-wiaas-admin-template-selection.php'; require_once dirname(__FILE__) . '/admin/template/class-wiaas-template-products.php'; require_once dirname(__FILE__) . '/admin/template/class-wiaas-template-admin-ajax.php'; + + // Admin order projects interface + require_once dirname(__FILE__) . '/admin/class-wiaas-admin-order-projects.php'; } } diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-api.php b/backend/app/plugins/wiaas/includes/class-wiaas-api.php index 574a7bc..7f5eadf 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-api.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-api.php @@ -41,6 +41,11 @@ class Wiaas_API { #Customer controller include_once dirname( __FILE__ ) . '/api/class-wiaas-rest-customer.php'; + include_once dirname( __FILE__ ) . '/api/class-wiaas-order-projects-api.php'; + + // API functions + include_once dirname( __FILE__ ) . '/api/wiaas-api-functions.php'; + } public static function register_rest_routes() { @@ -49,7 +54,8 @@ class Wiaas_API { 'Wiaas_Cart_API', 'Wiaas_Document_API', 'Wiass_REST_User_API', - 'Wiaas_REST_Customer_API' + 'Wiaas_REST_Customer_API', + 'Wiaas_Order_Projects_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 38147ce..23f28ee 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-cart.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-cart.php @@ -6,7 +6,7 @@ if ( ! defined( 'ABSPATH' ) ) { /** - * TODO: This implementation is temporary and will probably be changed during implementation of currently pending cart task + * Handles Wiaas Cart specific tasks * * Class Wiaas_Cart */ @@ -18,109 +18,140 @@ class Wiaas_Cart { add_filter( 'woocommerce_hidden_order_itemmeta', array( __CLASS__, 'hidden_order_item_meta' ) ); - add_filter( 'woocommerce_add_cart_item_data', array( __CLASS__, 'add_cart_item_data' ), 10, 2 ); - 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 options and addons to cart. - add_action( 'woocommerce_add_to_cart', array( __CLASS__, 'add_additional_packages_to_cart' ), 10, 6 ); } - /** + * Handles adding standard wiaas package to cart along with selected addons and options + * * Extend cart item data with wiaas package payment info and addons and options * * Every package cart item will be extended with its payment info but only standard package type * will be extended with addons and options arrays * - * @param $cart_item_data - * @param $package_id + * @param int $package_id Package ID of selected package + * @param string $price_id Price ID of selected package payment + * @param array $addons_ids Array of selected additional packages IDs + * @param array $options_ids Array of selected option packages IDs * - * @return array + * @return bool TRUE if all packages are succesfully added to cart, FALSE otherwise */ - public static function add_cart_item_data($cart_item_data, $package_id) { + public static function add_package_to_cart($package_id, $price_id, $addons_ids, $options_ids) { + // try adding package to cart + try { + //Check if package exists + $package = wc_get_product( $package_id ); + if (!$package) { + return false; + } - $is_valid = isset( $_POST[ 'price_id' ]) && - WC_Product_Factory::get_product_type( $package_id ) === 'bundle'; + // Retrieve package country + $country = Wiaas_Countries::get_package_country($package); - if (!$is_valid) { - return $cart_item_data; + // Retrieve package price + $package_prices = Wiaas_Pricing::get_standard_package_customer_prices($package); + $selected_price_index = array_search($price_id, array_column($package_prices, 'id')); + + // Initialize additional cart item data for wiaas packages + $wiaas_cart_item_data = array( + '_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 + ); + + $cart_item_key = WC()->cart->add_to_cart($package_id, 1, 0, array(), $wiaas_cart_item_data); + + if (!$cart_item_key) { + return false; + } + + // Add selected additional packages and options + self::_add_additional_packages_to_cart($cart_item_key, $price_id, $addons_ids, $options_ids); + + // Trigger calculation of total prices after additional packages are added + WC()->cart->calculate_totals(); + + return true; + + } catch( Exception $e) { + + error_log($e->getMessage()); + return false; + } + } + + + /** + * Remove given package item key from cart + * + * @param string $package_cart_item_key + * + * @return bool + */ + public static function remove_package_from_cart($package_cart_item_key) { + + $cart_item = WC()->cart->get_cart_item($package_cart_item_key); + + if (!$cart_item) { + return false; } - $package_type = Wiaas_Package_Type::get_package_type($package_id); + $package_addon_item_keys = $cart_item['_wiaas_addon_items']; + $package_option_item_keys = $cart_item['_wiaas_option_items']; - $package = wc_get_product( $package_id ); + $success = WC()->cart->remove_cart_item($package_cart_item_key); - switch ($package_type) { - case 'standard': + if ($success) { + foreach ($package_addon_item_keys as $package_addon_item_key) { + WC()->cart->remove_cart_item($package_addon_item_key); + } - $cart_item['_wiaas_standard_package'] = true; - - // Prepare addons additional data for later use. - if ( ! isset( $cart_item_data['_wiaas_addon_items'] ) ) { - $cart_item_data['_wiaas_addon_items' ] = array(); - } - // Prepare options additional data for later use. - if ( ! isset( $cart_item_data['_wiaas_option_items'] ) ) { - $cart_item_data['_wiaas_option_items' ] = array(); - } - - $country = Wiaas_Countries::get_package_country($package); - if (isset($country)) { - $cart_item_data['_wiaas_currency'] = $country['currency']; - } - - $package_prices = Wiaas_Pricing::get_standard_package_customer_prices($package); - break; - case 'add_on': - $parent_key = $cart_item_data['_wiaas_addon_for']; - $parent_item = WC()->cart->get_cart_item($parent_key); - - $package_prices = Wiaas_Pricing::get_addon_package_customer_price($package, $parent_item['data']); - break; - case 'option': - $parent_key = $cart_item_data['_wiaas_option_for']; - $parent_item = WC()->cart->get_cart_item($parent_key); - - $option_group_name = Wiaas_Package_Option_Groups::get_group_name_for_package_option($parent_item['data'], $package); - $cart_item_data['_wiaas_option_group_name' ] = $option_group_name; - - $package_prices = Wiaas_Pricing::get_option_package_customer_price($package, $parent_item['data']); - break; + foreach ($package_option_item_keys as $package_option_item_key) { + WC()->cart->remove_cart_item($package_option_item_key); + } } - $selected_price_index = array_search($_POST['price_id'], array_column($package_prices, 'id')); - - if (is_numeric($selected_price_index) && isset($package_prices[$selected_price_index])) { - $cart_item_data['_wiaas_payment'] = $package_prices[$selected_price_index]; - } - - return $cart_item_data; + return $success; } /** - * Add selected package options and addons after parent standard package is added to cart + * Update quantity of package in cart + * @param string $package_cart_item_key + * @param int $new_quantity * - * @param $cart_item_key - * @param $package_id - * @param $quantity - * @param $variation_id - * @param $variation - * @param $cart_item_data + * @return bool */ - public static function add_additional_packages_to_cart($cart_item_key, $package_id, $quantity, $variation_id, $variation, $cart_item_data) { + public static function update_package_quantity($package_cart_item_key, $new_quantity) { + $cart_item = WC()->cart->get_cart_item($package_cart_item_key); - remove_action( 'woocommerce_add_to_cart', array( __CLASS__, 'add_additional_packages_to_cart' )); + if (!$cart_item) { + return false; + } - self::_add_options_to_cart($cart_item_key, $package_id, $cart_item_data); + $package_addon_item_keys = $cart_item['_wiaas_addon_items']; + $package_option_item_keys = $cart_item['_wiaas_option_items']; - self::_add_addons_to_cart($cart_item_key, $package_id, $cart_item_data); + $success = WC()->cart->set_quantity($package_cart_item_key, $new_quantity, true); - add_action( 'woocommerce_add_to_cart', array( __CLASS__, 'add_additional_packages_to_cart' ), 10, 6 ); + if ($success) { + foreach ($package_addon_item_keys as $package_addon_item_key) { + WC()->cart->set_quantity($package_addon_item_key, $new_quantity, true); + } + + foreach ($package_option_item_keys as $package_option_item_key) { + WC()->cart->set_quantity($package_option_item_key, $new_quantity, true); + } + } + + return $success; } + /** * Update package cart item with `minimal_fixed_price` as its price * so resulting totals would be sum of these prices @@ -264,72 +295,201 @@ class Wiaas_Cart { ); } + /** + * Retrieves count of wiaas standard packages in cart + * + * @return int Number of wiaas standard packages in cart + */ + public static function get_cart_packages_count() { + $items = WC()->cart->get_cart_contents(); + + return array_reduce($items, function($count, $item) { + if (isset($item['_wiaas_standard_package'])) { + $count++; + } + return $count; + }, 0); + } + + + /** + * Retrieves packages data from cart + * @return array + */ + public static function get_cart_packages() { + $items = WC()->cart->get_cart_contents(); + + $package_items = array(); + + foreach ($items as $key => $item) { + if (!isset($item['_wiaas_standard_package'])) { + continue; + } + + $package = wc_get_product($item['product_id']); + + // Collect additional packages + $additional_packages = array_map( + function($addon_cart_item) { + $additional_package = wc_get_product($addon_cart_item['product_id']); + return array( + 'package_id' => $additional_package->get_id(), + 'package_name' => $additional_package->get_title(), + 'prices' => array( + 'fixed_extra' => $addon_cart_item['_wiaas_payment']['fixed_extra'], + 'recurrent_extra' => $addon_cart_item['_wiaas_payment']['recurrent_extra'], + 'services_extra' => $addon_cart_item['_wiaas_payment']['services_extra'], + ) + ); + }, + wiaas_get_cart_item_addons($item)); + + + // Collect package options + $package_options = array_map( + function($option_cart_item) { + $option_package = wc_get_product($option_cart_item['product_id']); + return array( + 'package_id' => $option_package->get_id(), + 'group_name' => $option_cart_item['_wiaas_option_group_name'], + 'package_name' => $option_package->get_title(), + 'prices' => array( + 'fixed_extra' => $option_cart_item['_wiaas_payment']['fixed_extra'], + 'recurrent_extra' => $option_cart_item['_wiaas_payment']['recurrent_extra'], + 'services_extra' => $option_cart_item['_wiaas_payment']['services_extra'], + ) + ); + }, + wiaas_get_cart_item_options($item)); + + $package_items[] = array( + 'package_id' => $item['product_id'], + 'key' => $item['key'], + 'package_name' => $package->get_title(), + 'quantity' => $item['quantity'], + + 'commercial_lead_id' => 14, + 'commercial_lead' => 'Coor Service Management', + 'country' => Wiaas_Countries::get_package_country($package), + + 'are_additional_available' => true, + 'additional_packages' => $additional_packages, + + 'are_options_available' => true, + 'options' => $package_options, + + 'bids' => array(), + + 'payment_info' => array( + 'id' => $item['_wiaas_payment']['id'], + 'type' => $item['_wiaas_payment']['payment_type'], + 'period_unit' => $item['_wiaas_payment']['period_unit'], + 'fixed_extra' => $item['_wiaas_payment']['fixed_extra'], + 'recurrent_extra' => $item['_wiaas_payment']['recurrent_extra'], + 'services_extra' => $item['_wiaas_payment']['services_extra'], + ), + + 'total_prices' => Wiaas_Cart::get_cart_item_total($item), + + 'status' => 'available', + ); + } + + return $package_items; + } + //PRIVATE - /** - * Add selected package options to cart - * @param $cart_item_key - * @param $package_id - * @param $cart_item_data - * - * @throws Exception - */ - private static function _add_options_to_cart($cart_item_key, $package_id, $cart_item_data) { - $is_option_parent = $_POST['package_id'] = $package_id && isset($cart_item_data['_wiaas_option_items']); - $has_selected_options = isset($_POST['options']) && is_array($_POST['options']); - - if ($is_option_parent && $has_selected_options) { - - $options_ids = $_POST['options']; - - foreach ($options_ids as $option_id) { - $option_package = wc_get_product($option_id); - if (is_object($option_package)) { - - $option_cart_item_key = WC()->cart->add_to_cart($option_id, 1, 0, array(), array( - '_wiaas_option_for' => $cart_item_key - )); - - if ($option_cart_item_key) { - WC()->cart->cart_contents[ $cart_item_key ]['_wiaas_option_items'][] = $option_cart_item_key; - } - } - } - } - } /** - * Add selected package addons to cart + * Add selected package options and addons after parent standard package is added to cart + * + * @param string $package_cart_item_key + * @param int $price_id + * @param array $addons_ids + * @param array $options_ids * - * @param $cart_item_key - * @param $package_id - * @param $cart_item_data - * - * @throws Exception + * @throws Exception if any of the addons or options cannot be added to cart */ - private static function _add_addons_to_cart($cart_item_key, $package_id, $cart_item_data) { + private static function _add_additional_packages_to_cart($package_cart_item_key, $price_id, $addons_ids, $options_ids) { - $is_addon_parent = $_POST['package_id'] = $package_id && isset($cart_item_data['_wiaas_addon_items']); - $has_selected_addons = isset($_POST['addons']) && is_array($_POST['addons']); + $parent_item = WC()->cart->get_cart_item($package_cart_item_key); - if ($is_addon_parent && $has_selected_addons) { - $addons_ids = $_POST['addons']; + $addon_items_keys = array(); + $option_items_keys = array(); - foreach ($addons_ids as $addon_id) { - $addon_package = wc_get_product($addon_id); - if (is_object($addon_package)) { - - $addon_cart_item_key = WC()->cart->add_to_cart($addon_id, 1, 0, array(), array( - '_wiaas_addon_for' => $cart_item_key - )); - - if ($addon_cart_item_key) { - WC()->cart->cart_contents[ $cart_item_key ]['_wiaas_addon_items'][] = $addon_cart_item_key; - } - } + // Try adding package addons to cart + foreach ($addons_ids as $addon_id) { + //Check if addon package exists + $addon_package = wc_get_product($addon_id); + if (!$addon_package) { + throw new Exception( __( 'Sorry, additional package does not exist.', 'wiaas' ) ); } + + // Retrieve addon package price + $package_prices = Wiaas_Pricing::get_addon_package_customer_price($addon_package, $parent_item['data']); + $selected_price_index = array_search($price_id, array_column($package_prices, 'id')); + + // Initialize additional cart item data for wiaas addon packages + $wiaas_addon_cart_item_data = array( + '_wiaas_addon_for' => $package_cart_item_key, + '_wiaas_payment' => $package_prices[$selected_price_index] ? $package_prices[$selected_price_index] : null + ); + + $addon_cart_item_key = WC()->cart->add_to_cart($addon_id, + 1, + 0, + array(), + $wiaas_addon_cart_item_data + ); + + if (!$addon_cart_item_key) { + throw new Exception( __( 'Sorry, additional package could not be added to cart.', 'wiaas' ) ); + } + + $addon_items_keys[] = $addon_cart_item_key; } + + // Try adding package options to cart + foreach ($options_ids as $option_id) { + //Check if option package exists + $option_package = wc_get_product($option_id); + if (!$option_package) { + throw new Exception( __( 'Sorry, option package does not exist.', 'wiaas' ) ); + } + + // Retrieve option package price + $package_prices = Wiaas_Pricing::get_option_package_customer_price($option_package, $parent_item['data']); + $selected_price_index = array_search($price_id, array_column($package_prices, 'id')); + + // Retrieve option package group name + $option_group_name = Wiaas_Package_Option_Groups::get_group_name_for_package_option($parent_item['data'], $option_package); + + + // Initialize additional cart item data for wiaas option packages + $wiaas_option_cart_item_data = array( + '_wiaas_option_for' => $package_cart_item_key, + '_wiaas_payment' => $package_prices[$selected_price_index] ? $package_prices[$selected_price_index] : null, + '_wiaas_option_group_name' => $option_group_name, + ); + + $option_cart_item_key = WC()->cart->add_to_cart($option_id, + 1, + 0, + array(), + $wiaas_option_cart_item_data + ); + + if (!$option_cart_item_key) { + throw new Exception( __( 'Sorry, package option could not be added to cart.', 'wiaas' ) ); + } + + $option_items_keys[] = $option_cart_item_key; + } + + WC()->cart->cart_contents[ $package_cart_item_key ]['_wiaas_addon_items'] = $addon_items_keys; + WC()->cart->cart_contents[ $package_cart_item_key ]['_wiaas_option_items'] = $option_items_keys; } } diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-checkout.php b/backend/app/plugins/wiaas/includes/class-wiaas-checkout.php new file mode 100644 index 0000000..2b0c82c --- /dev/null +++ b/backend/app/plugins/wiaas/includes/class-wiaas-checkout.php @@ -0,0 +1,76 @@ +checkout()->create_order(array()); + $order = wc_get_order( $order_id ); + + // set order currency + $line_items = $order->get_items(); + foreach ($line_items as $line_item) { + if (isset($line_item['wiaas_currency'])) { + $order->set_currency($line_item['wiaas_currency']); + break; + } + } + + $delivery_address = Wiaas_Customer::get_customer_profile_address($customer->ID, $data['delivery_address_id']); + $billing_address = Wiaas_Customer::get_customer_billing_address($customer->ID, $data['billing_address_id']); + + if (isset($delivery_address)) { + $order->set_shipping_city($delivery_address['city']); + $order->set_shipping_country($delivery_address['country_name']); + $order->set_shipping_address_1($delivery_address['detailed_address']); + $order->set_shipping_postcode($delivery_address['zip_code']); + $order->set_shipping_first_name($delivery_address['first_name']); + $order->set_shipping_last_name($delivery_address['last_name']); + } + + if (isset($billing_address)) { + $order->set_billing_city($billing_address['city']); + $order->set_billing_country($billing_address['country_name']); + $order->set_billing_address_1($billing_address['detailed_address']); + $order->set_billing_postcode($billing_address['zip_code']); + $order->set_billing_first_name($billing_address['first_name']); + $order->set_billing_last_name($billing_address['last_name']); + } + + Wiaas_Order::set_order_vat($order_id, $data['vat']); + Wiaas_Order::set_order_company($order_id, $data['company_name']); + Wiaas_Order::set_order_reference($order_id, $data['reference']); + Wiaas_Order::set_order_tender($order_id, $data['tender']); + + if (isset($data['project_id'])) { + Wiaas_Order_Project::set_project_for_order($order_id, $data['project_id']); + } + + $order->payment_complete(); + + WC()->cart->empty_cart( true ); + + return true; + + } catch (Exception $e) { + return false; + } + } +} + +Wiaas_Checkout::init(); diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-order.php b/backend/app/plugins/wiaas/includes/class-wiaas-order.php index 2fd7190..006fa24 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-order.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-order.php @@ -125,6 +125,38 @@ class Wiaas_Order { return $response; } + public static function set_order_vat($order_id, $vat_code) { + add_post_meta($order_id, '_wiaas_vat_code', $vat_code); + } + + public static function get_order_vat($order_id) { + return get_post_meta($order_id, '_wiaas_vat_code', true); + } + + public static function set_order_company($order_id, $company_name) { + add_post_meta($order_id, '_wiaas_company_name', $company_name); + } + + public static function get_order_company($order_id) { + return get_post_meta($order_id, '_wiaas_company_name', true); + } + + public static function set_order_reference($order_id, $reference) { + add_post_meta($order_id, '_wiaas_reference', $reference); + } + + public static function get_order_reference($order_id) { + return get_post_meta($order_id, '_wiaas_reference', true); + } + + public static function set_order_tender($order_id, $tender) { + add_post_meta($order_id, '_wiaas_tender', $tender); + } + + public static function get_order_tender($order_id) { + return get_post_meta($order_id, '_wiaas_tender', true); + } + /** * PRIVATE */ @@ -136,7 +168,12 @@ class Wiaas_Order { * @param $request */ private static function _append_wiaas_order_details($data, $order, $request) { - $data['reference'] = get_post_meta($order->get_id(), '_wiaas_reference', true); + $data['reference'] = self::get_order_reference($order->get_id()); + $data['tender'] = self::get_order_tender($order->get_id()); + $data['vat'] = self::get_order_vat($order->get_id()); + $data['company_name'] = self::get_order_company($order->get_id()); + + $data['project_name'] = Wiaas_Order_Project::get_project_name_for_order($order->get_id()); return $data; } diff --git a/backend/app/plugins/wiaas/includes/order/class-wiaas-order-project.php b/backend/app/plugins/wiaas/includes/order/class-wiaas-order-project.php index 6efaf9c..afc09e3 100644 --- a/backend/app/plugins/wiaas/includes/order/class-wiaas-order-project.php +++ b/backend/app/plugins/wiaas/includes/order/class-wiaas-order-project.php @@ -6,6 +6,9 @@ class Wiaas_Order_Project { add_action('woocommerce_after_register_taxonomy', array(__CLASS__, 'register_order_project_taxonomy')); } + /** + * Register order project taxonomy + */ public static function register_order_project_taxonomy() { $labels = array( 'name' => _x( 'Project', 'taxonomy general name', 'wiaas' ), @@ -33,6 +36,102 @@ class Wiaas_Order_Project { register_taxonomy( 'shop_order_project', array( 'shop_order' ), $args ); } + /** + * Retrieves available order projects + * @return array List of available order projects + */ + public static function get_available_order_projects() { + $all_terms = get_terms(array( + 'taxonomy' => 'shop_order_project', + 'hide_empty' => false + )); + + if (is_wp_error($all_terms)) { + return array(); + } + + $available_terms = array_filter($all_terms, function($term) { + return self::is_order_project_available($term->term_id); + }); + + return array_map(function($term) { + return array( + 'id' => $term->term_id, + 'name' => $term->name + ); + }, $available_terms); + } + + /** + * Retrieves order project name + * @param int $order_id + * + * @return string|null Project name if order is assigned to project, null otherwise + */ + public static function get_project_name_for_order($order_id) { + $terms = wp_get_object_terms($order_id, 'shop_order_project'); + return isset($terms[0]) ? $terms[0]->name : null; + } + + /** + * Assigns giver order to given project + * @param int $order_id + * @param int $project_id + */ + public static function set_project_for_order($order_id, $project_id) { + wp_set_object_terms($order_id, $project_id, 'shop_order_project', false); + } + + /** + * Adds new order project + * @param string $name Order Project name + * @param bool $is_available Flag indicating is order project available + * + * @return bool True on success, False on failure. + */ + public static function add_order_project($name, $is_available = true) { + $result = wp_create_term($name, 'shop_order_project'); + + if (is_wp_error($result)) { + return false; + } + + // save is term available + $id = is_numeric($result) ? $result : $result['term_id']; + self::_save_available_field($id, $is_available); + + return true; + } + + /** + * @param int|WP_Term $project Order project or order project id + * @param bool $is_available + */ + public static function set_is_order_project_available($project, $is_available) { + $project_id = is_numeric($project) ? $project : $project->term_id; + self::_save_available_field($project_id, $is_available); + } + + /** + * Retrieves if order project is available + * @param int|WP_Term $project Order project objects or id of order project + * + * @return bool TRUE if available, FALSE if not available + */ + public static function is_order_project_available($project) { + $project_id = is_numeric($project) ? $project : $project->term_id; + return get_term_meta($project_id, '_wiaas_is_available', true) === 'yes'; + } + + // PRIVATE + + /** + * @param int $id Order project id + * @param bool $is_available + */ + private static function _save_available_field($id, $is_available) { + update_term_meta($id, '_wiaas_is_available', $is_available ? 'yes' : 'no'); + } } Wiaas_Order_Project::init(); \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/user/class-wiaas-customer.php b/backend/app/plugins/wiaas/includes/user/class-wiaas-customer.php index e2c15fc..5117fbc 100644 --- a/backend/app/plugins/wiaas/includes/user/class-wiaas-customer.php +++ b/backend/app/plugins/wiaas/includes/user/class-wiaas-customer.php @@ -34,10 +34,44 @@ class Wiaas_Customer { return get_user_meta($customer_id, 'profile_addresses', true) ?: []; } + /** + * Get customer profile address by id + * + * @param int $customer_id + * @param int $address_id + * + * @return array|null + */ + public static function get_customer_profile_address($customer_id, $address_id) { + $profile_addresses = self::get_customer_profile_addresses($customer_id); + $index = array_search($address_id, array_column($profile_addresses, 'id')); + if (is_numeric($index)) { + return $profile_addresses[$index]; + } + return null; + } + public static function get_customer_billing_addresses($customer_id){ return get_user_meta($customer_id, 'billing_addresses', true) ?: []; } + /** + * Get customer billing address by id + * + * @param int $customer_id + * @param int $address_id + * + * @return array|null + */ + public static function get_customer_billing_address($customer_id, $address_id) { + $billing_addresses = self::get_customer_billing_addresses($customer_id); + $index = array_search($address_id, array_column($billing_addresses, 'id')); + if (is_numeric($index)) { + return $billing_addresses[$index]; + } + return null; + } + public static function get_customer_vat_code($customer_id){ return get_user_meta($customer_id, 'vat_code', true) ?: ''; } diff --git a/backend/app/plugins/wiaas/tests/bootstrap.php b/backend/app/plugins/wiaas/tests/bootstrap.php index 81225a7..c590341 100644 --- a/backend/app/plugins/wiaas/tests/bootstrap.php +++ b/backend/app/plugins/wiaas/tests/bootstrap.php @@ -27,6 +27,7 @@ require $_tests_dir . '/includes/bootstrap.php'; # Require Wiaas Unit Test case class require_once '/tmp/wiaas-backend-test/app/plugins/wiaas/tests/wiaas-unit-test-case.php'; +require_once '/tmp/wiaas-backend-test/app/plugins/wiaas/tests/wiaas-api-unit-test-case.php'; function load_active_plugins_list() { return array( diff --git a/backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-order-project-api.php b/backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-order-project-api.php new file mode 100644 index 0000000..a940bd0 --- /dev/null +++ b/backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-order-project-api.php @@ -0,0 +1,81 @@ +check_endpoint_forbidden_for_guest( + new WP_REST_Request( 'GET', '/wiaas/order-projects') + ); + } + + /** + * @covers Wiaas_Order_Projects_API::get_order_projects() + */ + function test_get_order_projects_as_customer() { + Wiaas_Order_Project::add_order_project('Test Available 1', true); + Wiaas_Order_Project::add_order_project('Test Available 2', true); + + $customer_id = $this->create_new_customer(); + wp_set_current_user($customer_id); + + $data = $this->dispatch_endpoint_request( + new WP_REST_Request( 'GET', '/wiaas/order-projects') + ); + $this->assertNotNull($data); + $this->assertTrue(is_array($data)); + + $this->assertCount(2, $data); + foreach ($data as $project) { + $this->assertArrayHasKey('id', $project); + $this->assertArrayHasKey('name', $project); + + $this->assertContains($project['name'], array( + 'Test Available 1', + 'Test Available 2', + )); + } + } + + /** + * @covers Wiaas_Order_Projects_API::create_order_project() + */ + function test_create_order_project_as_guest() { + $request = new WP_REST_Request( 'POST', '/wiaas/order-projects'); + $request->set_body_params(array( + 'name' => 'Test' + )); + $this->check_endpoint_forbidden_for_guest($request); + } + + /** + * @covers Wiaas_Order_Projects_API::create_order_project() + */ + function test_create_valid_order_project_as_customer() { + $customer_id = $this->create_new_customer(); + wp_set_current_user($customer_id); + + $request = new WP_REST_Request( 'POST', '/wiaas/order-projects'); + $request->set_body_params(array( + 'name' => 'Test Project' + )); + $data = $this->dispatch_endpoint_request($request); + + $this->assertNotNull($data); + $this->assertTrue(is_array($data)); + + $this->assertArrayHasKey('messages', $data); + $this->assertNotEmpty($data['messages']); + + $message = $data['messages'][0]; + $this->assertArrayHasKey('code', $message); + $this->assertEquals('success', $message['code']); + } + +} \ No newline at end of file diff --git a/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-rest-customer-api.php b/backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-rest-customer-api.php similarity index 100% rename from backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-rest-customer-api.php rename to backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-rest-customer-api.php diff --git a/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-rest-delivery-process-api.php b/backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-rest-delivery-process-api.php similarity index 100% rename from backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-rest-delivery-process-api.php rename to backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-rest-delivery-process-api.php diff --git a/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-rest-user-api.php b/backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-rest-user-api.php similarity index 100% rename from backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-rest-user-api.php rename to backend/app/plugins/wiaas/tests/unit-tests/api/test-wiaas-rest-user-api.php diff --git a/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-order-project.php b/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-order-project.php new file mode 100644 index 0000000..5fc6b86 --- /dev/null +++ b/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-order-project.php @@ -0,0 +1,84 @@ +assertInstanceOf(WP_Taxonomy::class, $taxonomy); + } + + /** + * @covers Wiaas_Order_Project::add_order_project() + */ + function test_adding_order_project() { + Wiaas_Order_Project::add_order_project('Test', true); + + $added_order_project = get_term_by('name', 'Test', 'shop_order_project'); + + $this->assertInstanceOf(WP_Term::class, $added_order_project); + $this->assertEquals($added_order_project->name, 'Test'); + + $saved_available_flag = get_term_meta($added_order_project->term_id, '_wiaas_is_available', true); + $this->assertEquals('yes', $saved_available_flag); + + } + + /** + * @covers Wiaas_Order_Project::is_order_project_available() + */ + function test_is_order_project_available() { + Wiaas_Order_Project::add_order_project('Test', true); + $added_order_project = get_term_by('name', 'Test', 'shop_order_project'); + + $this->assertTrue(Wiaas_Order_Project::is_order_project_available($added_order_project)); + + $this->assertTrue(Wiaas_Order_Project::is_order_project_available($added_order_project->term_id)); + } + + /** + * @covers Wiaas_Order_Project::set_is_order_project_available() + */ + function test_set_is_order_project_available() { + Wiaas_Order_Project::add_order_project('Test', true); + $added_order_project = get_term_by('name', 'Test', 'shop_order_project'); + + Wiaas_Order_Project::set_is_order_project_available($added_order_project, false); + $saved_available_flag = get_term_meta($added_order_project->term_id, '_wiaas_is_available', true); + $this->assertEquals('no', $saved_available_flag); + + Wiaas_Order_Project::set_is_order_project_available($added_order_project->term_id, true); + $saved_available_flag = get_term_meta($added_order_project->term_id, '_wiaas_is_available', true); + $this->assertEquals('yes', $saved_available_flag); + } + + /** + * @covers Wiaas_Order_Project::get_available_order_projects() + */ + function test_get_available_order_projects() { + Wiaas_Order_Project::add_order_project('Test Available 1', true); + Wiaas_Order_Project::add_order_project('Test Available 2', true); + Wiaas_Order_Project::add_order_project('Test Available 3', true); + + Wiaas_Order_Project::add_order_project('Test Not Available 1', false); + Wiaas_Order_Project::add_order_project('Test Not Available 2', false); + Wiaas_Order_Project::add_order_project('Test Not Available 3', false); + + $available_projects = Wiaas_Order_Project::get_available_order_projects(); + + $this->assertCount(3, $available_projects); + + foreach ($available_projects as $project) { + $this->assertArrayHasKey('id', $project); + $this->assertArrayHasKey('name', $project); + + $this->assertContains($project['name'], array( + 'Test Available 1', + 'Test Available 2', + 'Test Available 3' + )); + } + } +} \ No newline at end of file diff --git a/backend/app/plugins/wiaas/tests/wiaas-api-unit-test-case.php b/backend/app/plugins/wiaas/tests/wiaas-api-unit-test-case.php new file mode 100644 index 0000000..63b4f10 --- /dev/null +++ b/backend/app/plugins/wiaas/tests/wiaas-api-unit-test-case.php @@ -0,0 +1,63 @@ +server = $wp_rest_server = new \WP_REST_Server; + do_action( 'rest_api_init' ); + } + + /** + * Test that given endpoint is forbidden when accessed as guest + * + * @param WP_REST_Request $request Request to test + */ + function check_endpoint_forbidden_for_guest($request) { + wp_set_current_user(0); + + $response = $this->server->dispatch( $request ); + + $this->assertNotNull($response); + $this->assertInstanceOf('WP_REST_Response',$response); + $this->assertTrue($response->is_error()); + $this->assertEquals($response->get_status(), 401); + + $error_data = $response->as_error(); + $this->assertEquals($error_data->get_error_message(), 'Sorry, you are not allowed to do that.'); + } + + /** + * Handles common action during dispatching of rest request + * + * @param WP_REST_Request $request + * @param int $expected_status_code + * @param bool $is_error_expected + * + * @return mixed Result error when error is expected, result data otherwise + */ + function dispatch_endpoint_request($request, $expected_status_code = 200, $is_error_expected = false) { + $response = $this->server->dispatch( $request ); + + $this->assertNotNull($response); + $this->assertInstanceOf('WP_REST_Response',$response); + $this->assertEquals($response->get_status(), $expected_status_code); + + if ($is_error_expected) { + $this->assertTrue($response->is_error()); + return $response->as_error(); + } + + $this->assertFalse($response->is_error()); + return $response->get_data(); + } +} \ No newline at end of file diff --git a/backend/app/plugins/wiaas/tests/wiaas-unit-test-case.php b/backend/app/plugins/wiaas/tests/wiaas-unit-test-case.php index f763881..14a5b2f 100644 --- a/backend/app/plugins/wiaas/tests/wiaas-unit-test-case.php +++ b/backend/app/plugins/wiaas/tests/wiaas-unit-test-case.php @@ -24,6 +24,8 @@ class Wiaas_Unit_Test_Case extends WP_UnitTestCase { Wiaas_Product_Category::register_product_categories(); Wiaas_Package_Type::register_package_type_taxonomy(); + + Wiaas_Order_Project::register_order_project_taxonomy(); define('WP_TEST_IN_PROGRESS',true); } @@ -85,4 +87,28 @@ class Wiaas_Unit_Test_Case extends WP_UnitTestCase { $package->sync(true); } + + function create_new_customer($login = 'customer_test', $organization_name = 'test-customer-organization') { + $customer_id = wp_insert_user(array( + 'user_login' => $login, + 'user_pass' => 'test', + 'user_email' => $login . '@mail.com', + 'role' => 'customer', + )); + + $organization = get_term_by('name', $organization_name, Wiaas_User_Organization::TAXONOMY_NAME); + if (is_wp_error($organization)) { + $organization = wp_insert_term( + $organization_name, + Wiaas_User_Organization::TAXONOMY_NAME + ); + } + + wp_set_terms_for_user( + $customer_id, + Wiaas_User_Organization::TAXONOMY_NAME, + [$organization_name]); + + return $customer_id; + } } \ No newline at end of file diff --git a/backend/app/plugins/wiaas/wiaas.php b/backend/app/plugins/wiaas/wiaas.php index 96c0250..1576ce5 100644 --- a/backend/app/plugins/wiaas/wiaas.php +++ b/backend/app/plugins/wiaas/wiaas.php @@ -40,6 +40,8 @@ include_once WIAAS_DIR . '/includes/class-wiaas-documents.php'; include_once WIAAS_DIR . '/includes/class-wiaas-cart.php'; +include_once WIAAS_DIR . '/includes/class-wiaas-checkout.php'; + include_once WIAAS_DIR . '/includes/class-wiaas-api.php'; include_once WIAAS_DIR . '/includes/class-wiaas-admin.php'; diff --git a/frontend/src/actions/cart/cartActions.js b/frontend/src/actions/cart/cartActions.js index 1374e02..928235f 100644 --- a/frontend/src/actions/cart/cartActions.js +++ b/frontend/src/actions/cart/cartActions.js @@ -29,6 +29,8 @@ import { cartMessages } from '../../constants/cartConstants'; import {updateMessages} from '../notification/notificationActions'; +import { fromWCCartItems } from '../../helpers/CartHelper'; + const client = new HtmlClient(); export const requestShopCartCount = () => ({type: REQUEST_SHOP_CART_COUNT}); @@ -72,10 +74,13 @@ export const fetchCartItems = (isForSteps = false) => { return dispatch => { dispatch(requestShopCartItems()); return client.fetch({url: `${API_SERVER}/wp-json/wiaas/cart/items`}).then(response => { - if (typeof response.data !== 'undefined' && 'cartItems' in response.data) { - dispatch(receiveShopCartItems(response.data.cartItems)); - dispatch(fetchCartDocuments(response.data.cartItems.map((cartItem) => cartItem.idPackage), isForSteps)); - dispatch(updateOrderTotalPrice(response.data.cartItems)); + if (typeof response.data !== 'undefined' && 'items' in response.data) { + + const cartItems = response.data.items.map(wcCartItem => fromWCCartItems(wcCartItem)); + + dispatch(receiveShopCartItems(cartItems)); + dispatch(fetchCartDocuments(cartItems.map((cartItem) => cartItem.idPackage), isForSteps)); + dispatch(updateOrderTotalPrice(cartItems)); } }).catch(error => { client.onError(error, dispatch); @@ -90,19 +95,14 @@ const updateCartItems = (newItem)=>( ); export const updateQuantity = (cartItem, quantity, updateCartAllItems) => { - const params = { - idPackage: cartItem.idPackage || 0, - package_item_key: cartItem.key, - idCustomerInstance: cartItem.idCustomerInstance || 0, - idPrice: cartItem.idPrice || 0, - quantity - }; return dispatch => { return client.fetch({ - url: `${API_SERVER}/wp-json/wiaas/cart/update-quantity`, + url: `${API_SERVER}/wp-json/wiaas/cart/items/${cartItem.key}`, method: 'post', - data: params + data: { + quantity + } }).then(response => { if (typeof response.data !== 'undefined' && 'messages' in response.data) { const filteredMessages = response.data.messages.filter(message => { @@ -125,11 +125,8 @@ export const updateQuantity = (cartItem, quantity, updateCartAllItems) => { export const removeCartItem = (cartItemKey) => { return dispatch => { return client.fetch({ - url: `${API_SERVER}/wp-json/wiaas/cart/remove`, - method: 'post', - data: { - package_item_key: cartItemKey - } + url: `${API_SERVER}/wp-json/wiaas/cart/items/${cartItemKey}`, + method: 'delete', }).then(response => { if (typeof response.data !== 'undefined' && 'messages' in response.data) { dispatch(updateMessages(response.data.messages, cartMessages)); @@ -269,21 +266,30 @@ export const fetchCartDocuments = (packages, isForSteps = false) => { return dispatch => { dispatch(requestCartDocuments()); - return client.fetch({ - url: `${API_SERVER}/wp-json/wiaas/cart/documents`, - method: 'get', - data: {packages} - }).then(response => { - if (response.data) { - dispatch(receiveCartDocuments(response.data)); - if(isForSteps) { - const whitoutUploadDoc = response.data.templates.length === 0; - dispatch(loadSteps(whitoutUploadDoc)); - } - } - }).catch(error => { - client.onError(error, dispatch); - }); + dispatch(receiveCartDocuments({ + areFilesUploaded: true, + templates: [], + uploaded: [] + })); + if(isForSteps) { + dispatch(loadSteps(true)); + } + + // return client.fetch({ + // url: `${API_SERVER}/wp-json/wiaas/cart/documents`, + // method: 'get', + // data: {packages} + // }).then(response => { + // if (response.data) { + // dispatch(receiveCartDocuments(response.data)); + // if(isForSteps) { + // const whitoutUploadDoc = response.data.templates.length === 0; + // dispatch(loadSteps(whitoutUploadDoc)); + // } + // } + // }).catch(error => { + // client.onError(error, dispatch); + // }); } } @@ -319,9 +325,17 @@ export const placeOrder = (orderInfo) => { const {orderDetails, cartItems} = orderInfo; return dispatch => { return client.fetch({ - url: `${API_SERVER}/wp-json/wiaas/cart/place-order`, + url: `${API_SERVER}/wp-json/wiaas/cart/checkout`, method: 'post', - data: orderDetails + data: { + vat: orderDetails.vatCode, + company: orderDetails.companyName, + reference: orderDetails.details.reference, + tender: orderDetails.details.tender, + project_id: orderDetails.details.idProject, + delivery_address_id: orderDetails.delivery.id, + billing_address_id: orderDetails.billing.id, + } }).then(response => { if (typeof response.data !== 'undefined' && 'messages' in response.data) { dispatch(updateMessages(response.data.messages, cartMessages)); diff --git a/frontend/src/actions/coMarket/coMarketPackageDetailsActions.js b/frontend/src/actions/coMarket/coMarketPackageDetailsActions.js index f67c7a9..198aee5 100644 --- a/frontend/src/actions/coMarket/coMarketPackageDetailsActions.js +++ b/frontend/src/actions/coMarket/coMarketPackageDetailsActions.js @@ -111,13 +111,6 @@ export const addToCart = (addParams) => { addParams.selectedAdditionals, addParams.selectedAgreement); - const params = { - 'package_id': addParams.selectedPackage.id, - 'price_id': addParams.selectedAgreement.idPrice, - 'addons': result.additionalPackages, - 'options': result.optionPackages - }; - if(result.unavailablePackages.length){ const unavailable = result.unavailablePackages.map((unavailable) =>{return unavailable.optionName || unavailable.packageName;}); const message = coMarketMessages.UNAVAILABLE_PACKAGES + ' ' + unavailable.join(); @@ -128,9 +121,14 @@ export const addToCart = (addParams) => { return dispatch => { dispatch(requestAddToCart()); return client.fetch({ - url: `${API_SERVER}/wp-json/wiaas/cart/add`, + url: `${API_SERVER}/wp-json/wiaas/cart/items`, method: 'post', - data: params + data: { + 'package_id': addParams.selectedPackage.id, + 'price_id': addParams.selectedAgreement.idPrice, + 'addons_ids': result.additionalPackages, + 'options_ids': result.optionPackages + }, }) .then(response => { if(response.data && response.data.messages){ diff --git a/frontend/src/actions/orderProjects/orderProjectsActions.js b/frontend/src/actions/orderProjects/orderProjectsActions.js index becc88c..463fdf7 100644 --- a/frontend/src/actions/orderProjects/orderProjectsActions.js +++ b/frontend/src/actions/orderProjects/orderProjectsActions.js @@ -23,8 +23,8 @@ const recieveOrderProjects = (json) => ({ const generateOptions = (orderProjects) => { orderProjects.forEach((orderProject) => { - orderProject.value = orderProject.idProject; - orderProject.label = orderProject.projectName; + orderProject.value = orderProject.id; + orderProject.label = orderProject.name; }); return orderProjects; @@ -34,40 +34,18 @@ export const getOrderProjects = () => { return dispatch => { dispatch(requestOrderProjects()); - dispatch(recieveOrderProjects(generateOptions([ - { - "idProject": 1, - "projectName": "Innovation Center", - "isAvailable": 1 - }, - { - "idProject": 2, - "projectName": "Demo01", - "isAvailable": 1 - }, - { - "idProject": 3, - "projectName": "Kontorsrådet", - "isAvailable": 1 - }, - { - "idProject": 4, - "projectName": "PerProj01", - "isAvailable": 1 - } - ]))); - // return htmlClient.fetch({ - // url: `${API_SERVER}/orderProjects/api/getOrderProjects` - // }) - // .then(response => { - // if (response.data) { - // const orderProjects = generateOptions(response.data); - // dispatch(recieveOrderProjects(orderProjects)); - // } - // }) - // .catch(error => { - // htmlClient.onError(error, dispatch); - // }); + return htmlClient.fetch({ + url: `${API_SERVER}/wp-json/wiaas/order-projects` + }) + .then(response => { + if (response.data) { + const orderProjects = generateOptions(response.data); + dispatch(recieveOrderProjects(orderProjects)); + } + }) + .catch(error => { + htmlClient.onError(error, dispatch); + }); } } @@ -76,13 +54,15 @@ const requestAddProject = () => ({ isLoading: true }); -export const addProject = (projectData) => { +export const addProject = (projectName) => { return dispatch => { dispatch(requestAddProject()); return htmlClient.fetch({ - url: `${API_SERVER}/orderProjects/api/addOrderProject`, + url: `${API_SERVER}/wp-json/wiaas/order-projects`, method: 'post', - data: {projectData: JSON.stringify(projectData)} + data: { + name: projectName + } }) .then(response => { if(response.data && response.data.messages){ diff --git a/frontend/src/containers/cart/CartCustomerDetailsContainer.jsx b/frontend/src/containers/cart/CartCustomerDetailsContainer.jsx index 1cd43bb..b377358 100644 --- a/frontend/src/containers/cart/CartCustomerDetailsContainer.jsx +++ b/frontend/src/containers/cart/CartCustomerDetailsContainer.jsx @@ -87,7 +87,7 @@ class CartCustomerDetailsContainer extends Component { handleProjectChange(project){ const newDetails = this.state.details; - newDetails.idProject = project ? project.idProject : null; + newDetails.idProject = project ? project.id : null; return this.setState({details: newDetails}); } diff --git a/frontend/src/containers/cart/CartReviewOrderContainer.jsx b/frontend/src/containers/cart/CartReviewOrderContainer.jsx index 2eade59..8399e28 100644 --- a/frontend/src/containers/cart/CartReviewOrderContainer.jsx +++ b/frontend/src/containers/cart/CartReviewOrderContainer.jsx @@ -37,10 +37,10 @@ class CartReviewOrderContainer extends Component { getProjectName(idProject){ const selectedProject = this.props.orderProjects.find(orderProject => { - return orderProject.idProject === idProject + return orderProject.id === idProject }); - return selectedProject && selectedProject.projectName ? selectedProject.projectName : '-'; + return selectedProject && selectedProject.name ? selectedProject.name : '-'; } render() { diff --git a/frontend/src/containers/cart/components/AddOrderProject.jsx b/frontend/src/containers/cart/components/AddOrderProject.jsx index e9bf63b..7445ef3 100644 --- a/frontend/src/containers/cart/components/AddOrderProject.jsx +++ b/frontend/src/containers/cart/components/AddOrderProject.jsx @@ -23,7 +23,7 @@ class AddOrderProject extends Component { } onProjectAdd(){ - this.props.dispatch(addProject(this.state)); + this.props.dispatch(addProject(this.state.projectName)); } render() { diff --git a/frontend/src/helpers/CartHelper.js b/frontend/src/helpers/CartHelper.js new file mode 100644 index 0000000..7dfe065 --- /dev/null +++ b/frontend/src/helpers/CartHelper.js @@ -0,0 +1,55 @@ + +export const fromWCCartItems = wcCartItem => { + const paymentInfo = wcCartItem['payment_info'] || {}; + const totalPrices = wcCartItem['total_prices'] || {}; + + return { + idPackage: wcCartItem['package_id'], + key: wcCartItem.key, + packageName: wcCartItem['package_name'], + quantity: wcCartItem.quantity, + + idCommercialLead: wcCartItem['commercial_lead_id'], + commercialLead: wcCartItem['commercial_lead'], + country: wcCartItem.country ? wcCartItem.country : [], + + areAdditionalAvailable: wcCartItem['are_additional_available'], + additionalPackages: wcCartItem['additional_packages'] ? wcCartItem['additional_packages'].map(additionalPackageItem => ({ + idAdditionalPackage: additionalPackageItem['package_id'], + packageName: additionalPackageItem['package_name'], + prices: { + fixedExtra: additionalPackageItem['prices'] ? additionalPackageItem['prices']['fixed_extra'] : 0, + recurrentExtra: additionalPackageItem['prices'] ? additionalPackageItem['prices']['recurrent_extra'] : 0, + servicesExtra: additionalPackageItem['prices'] ? additionalPackageItem['prices']['services_extra'] : 0, + } + })) : [], + + areOptionsAvailable: wcCartItem['are_options_available'], + options: wcCartItem.options ? wcCartItem.options.map(optionPackageItem => ({ + idOptionPackage: optionPackageItem['package_id'], + packageName: optionPackageItem['package_name'], + groupName: optionPackageItem['group_name'], + prices: { + fixedExtra: optionPackageItem['prices'] ? optionPackageItem['prices']['fixed_extra'] : 0, + recurrentExtra: optionPackageItem['prices'] ? optionPackageItem['prices']['recurrent_extra'] : 0, + servicesExtra: optionPackageItem['prices'] ? optionPackageItem['prices']['services_extra'] : 0, + } + })) : [], + + bids: wcCartItem.bids, + + idPayType: paymentInfo.id, + payType: paymentInfo.type, + periodUnit: paymentInfo['period_unit'] || 'month', + idPrice: paymentInfo.id, + fixedPrice: paymentInfo['fixed_extra'] !== undefined ? paymentInfo['fixed_extra'] : 0, + recurrentPrice: paymentInfo['recurrent_extra'] !== undefined ? paymentInfo['recurrent_extra'] : 0, + servicesPrice: paymentInfo['services_extra'] !== undefined ? paymentInfo['services_extra'] : 0, + + totalPrices: { + fixedPrice: totalPrices['fixed_extra'] !== undefined ? totalPrices['fixed_extra'] : 0, + recurrentPrice: totalPrices['recurrent_extra'] !== undefined ? totalPrices['recurrent_extra'] : 0, + servicesPrice: totalPrices['services_extra'] !== undefined ? totalPrices['services_extra'] : 0, + } + }; +}; \ No newline at end of file diff --git a/frontend/src/helpers/HtmlClient.js b/frontend/src/helpers/HtmlClient.js index 0f92822..6b6f58d 100644 --- a/frontend/src/helpers/HtmlClient.js +++ b/frontend/src/helpers/HtmlClient.js @@ -60,6 +60,24 @@ class HtmlClient { } onError(error) { + const response = error.response; + if (response.data) { + switch (response.data.code) { + case 'rest_missing_callback_param': + store.dispatch(updateMessages([{code:'error', message: response.data.message }])); + return; + case 'rest_invalid_param': + const messages = Object.keys(response.data.data.params).map(paramName => { + const errorMessage = response.data.data.params[paramName]; + if (errorMessage === 'Invalid parameter.') { + return { code: 'error', message: `Invalid ${paramName} parameter!` }; + } + return { code: 'error', message: errorMessage }; + }); + store.dispatch(updateMessages(messages)); + return; + } + } store.dispatch(updateMessages([{code:'error', message: 'HTML_ERROR'}], notificationMessages)); } } diff --git a/frontend/src/helpers/OrderHelper.js b/frontend/src/helpers/OrderHelper.js index 71f4a15..10b604a 100644 --- a/frontend/src/helpers/OrderHelper.js +++ b/frontend/src/helpers/OrderHelper.js @@ -21,7 +21,11 @@ export const fromWCOrder = (WCOrder) => { dateCreated: formatDate(WCOrder['date_created']), dateCompleted: formatDate(WCOrder['date_completed']), estimatedDeliveryDate: undefined, + vatCode: WCOrder['vat'], reference: WCOrder['reference'], + tender: WCOrder['tender'], + companyName: WCOrder['company_name'], + projectName: WCOrder['project_name'], assignedTo: 'assigned to', fixedPrice: WCOrder.total, recurringPrice: WCOrder['recurring_price'],