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 index 92309a9..cf3eea6 100644 --- a/backend/app/plugins/wiaas/includes/api/class-wiaas-package-api.php +++ b/backend/app/plugins/wiaas/includes/api/class-wiaas-package-api.php @@ -46,28 +46,29 @@ class Wiaas_Package_API { $query['tax_query'] = array(); } - // Moved package status handling here + // 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_serch_terms = array(); + $price_search_terms = array(); foreach ($pay_types as $pay_type) { - $price_serch_terms[] = '_' . $commercial_lead_id . '_' . $pay_type . '_default'; - $price_serch_terms[] = '_' . $commercial_lead_id . '_' . $pay_type . '_customer_' . $customer_id; + $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_serch_terms, + 'terms' => $price_search_terms, 'field' => 'slug' ); diff --git a/backend/app/plugins/wiaas/includes/pricing/class-wiaas-package-cl-pricing.php b/backend/app/plugins/wiaas/includes/pricing/class-wiaas-package-cl-pricing.php index 83f213a..a0af916 100644 --- a/backend/app/plugins/wiaas/includes/pricing/class-wiaas-package-cl-pricing.php +++ b/backend/app/plugins/wiaas/includes/pricing/class-wiaas-package-cl-pricing.php @@ -10,11 +10,11 @@ class Wiaas_Package_CL_Pricing { /** * Sets package extra prices * - * @param int $organization_id + * @param int $owner_id ID of the shop owner organization who set extra prices * @param int $package_id * @param array $cl_extras */ - public static function set_extras($organization_id, $package_id, $cl_extras) { + public static function set_extras($owner_id, $package_id, $cl_extras) { foreach ($cl_extras as $extra_type => $cl_extra) { unset($cl_extra['type']); @@ -23,28 +23,28 @@ class Wiaas_Package_CL_Pricing { $cl_extras[$extra_type] = $cl_extra; } - $old_extras = self::get_extras($organization_id, $package_id); + $old_extras = self::get_extras($owner_id, $package_id); // Persist package price extras update_term_meta( - $organization_id, + $owner_id, '_wiaas_cm_extras_'.$package_id, $cl_extras); - do_action('wiaas_package_prices_extras_set', $organization_id, $package_id, $cl_extras, $old_extras); + do_action('wiaas_package_prices_extras_set', $owner_id, $package_id, $cl_extras, $old_extras); } /** * Retrieves package catalogue extra prices * - * @param int $organization_id + * @param int $owner_id ID of the shop owner organization who set extra prices * @param int $package_id * * @return array|null */ - public static function get_extras($organization_id, $package_id) { + public static function get_extras($owner_id, $package_id) { $cl_extras = get_term_meta( - $organization_id, + $owner_id, '_wiaas_cm_extras_'.$package_id, true); @@ -54,31 +54,30 @@ class Wiaas_Package_CL_Pricing { /** * Retrieve catalogue package extra prices for provided customer * - * @param int $organization_id - * @param string $pay_type - * @param int $package_id - * @param int $customer_id + * If customer specific prices are set for the package, only those will be retrieved + * otherwise deafult prices exras will be retrieved + * + * @param int $owner_id ID of the shop owner organization who set extra prices + * @param string $pay_type Payment type for the pacakge + * @param int $package_id ID of the package + * @param int $customer_id ID of the customer * * @return array|null */ - public static function get_extras_for_customer($organization_id, $pay_type, $package_id, $customer_id) { - $cl_extras = self::get_extras($organization_id, $package_id); + public static function get_extras_for_customer($owner_id, $pay_type, $package_id, $customer_id) { + $cl_extras = self::get_extras($owner_id, $package_id); if (! empty($cl_extras)) { - // retrieve default and customer specific extras - $cl_pay_type_customer_extras = $cl_extras[$pay_type.'_customer_'.$customer_id]; - $cl_pay_type_extras = $cl_extras[$pay_type.'_default']; - - // if commercial lead has special prices for this customer then use them - if (! empty($cl_pay_type_customer_extras) && $cl_pay_type_customer_extras['visible']) { - - return array( - 'fixed' => floatval($cl_pay_type_customer_extras['fixed']), - 'services' => floatval($cl_pay_type_customer_extras['services']), - 'recurrent' => floatval($cl_pay_type_customer_extras['recurrent']) - ); + // if customer specific prices are set for this package use only them + // else use default prices set for this package + if (self::_customer_specific_prices_exist($cl_extras, $customer_id)) { + $cl_pay_type = $pay_type . '_customer_' . $customer_id; + } else { + $cl_pay_type = $pay_type . '_default'; } + $cl_pay_type_extras = $cl_extras[$cl_pay_type]; + // if commercial lead has default price for this package then use it if (! empty($cl_pay_type_extras) && $cl_pay_type_extras['visible']) { @@ -93,4 +92,23 @@ class Wiaas_Package_CL_Pricing { // there are no prices set for this payment type return null; } + + + private static function _customer_specific_prices_exist($cl_extras, $customer_id) { + + $pay_types = array_keys(Wiaas_Package_Pricing::get_available_pay_types()); + + $cl_customer_pay_types = array(); + foreach ($pay_types as $pay_type) { + $cl_customer_pay_types[] = $pay_type.'_customer_'.$customer_id; + } + + foreach ($cl_extras as $cl_pay_type => $data) { + if (in_array($cl_pay_type, $cl_customer_pay_types)) { + return true; + } + } + + return false; + } } diff --git a/backend/app/plugins/wiaas/tests/unit-tests/pricing/test-wiaas-package-cl-pricing.php b/backend/app/plugins/wiaas/tests/unit-tests/pricing/test-wiaas-package-cl-pricing.php new file mode 100644 index 0000000..6dcfcf5 --- /dev/null +++ b/backend/app/plugins/wiaas/tests/unit-tests/pricing/test-wiaas-package-cl-pricing.php @@ -0,0 +1,162 @@ +shop_owner_id = wp_insert_term( + 'Shop owner organization', + Wiaas_User_Organization::TAXONOMY_NAME)['term_id']; + + $this->customer_id = wp_insert_term( + 'Customer Organization', + Wiaas_User_Organization::TAXONOMY_NAME)['term_id']; + + $package = $this->create_new_package(); + + $this->add_products_to_package($package, array( $this->create_new_product())); + + $this->package_id = $package->get_id(); + + $this->cl_extras = array( + 'purchase_default' => array( + 'fixed' => 10, + 'recurrent' => 10, + 'services' => 10, + 'visible' => true + ), + 'purchase_24_default' => array( + 'fixed' => 10, + 'recurrent' => 10, + 'services' => 10, + 'visible' => true + ), + 'managed_36_default' => array( + 'fixed' => 10, + 'recurrent' => 10, + 'services' => 10, + 'visible' => true + ) + ); + } + + /** + * @covers Wiaas_Package_CL_Pricing::set_extras() + */ + function test_packages_extras_set() { + Wiaas_Package_CL_Pricing::set_extras( + $this->shop_owner_id, + $this->package_id, + $this->cl_extras); + + // validate data saved + $cl_extras = get_term_meta( + $this->shop_owner_id, + '_wiaas_cm_extras_' . $this->package_id, + true); + + $this->_validate_default_cl_extras($cl_extras); + } + + /** + * @covers Wiaas_Package_CL_Pricing::get_extras() + */ + function test_package_extras_retrieved() { + update_term_meta( + $this->shop_owner_id, + '_wiaas_cm_extras_' . $this->package_id, + $this->cl_extras); + + $cl_extras = Wiaas_Package_CL_Pricing::get_extras($this->shop_owner_id, $this->package_id); + + $this->_validate_default_cl_extras($cl_extras); + } + + /** + * @covers Wiaas_Package_CL_Pricing::get_extras_for_customer() + */ + function test_default_extras_retrieved_for_customer() { + update_term_meta( + $this->shop_owner_id, + '_wiaas_cm_extras_' . $this->package_id, + $this->cl_extras); + + $pay_types = array_keys(Wiaas_Package_Pricing::get_available_pay_types()); + + foreach ($pay_types as $pay_type) { + $customer_cl_extra = Wiaas_Package_CL_Pricing::get_extras_for_customer( + $this->shop_owner_id, + $pay_type, + $this->package_id, + $this->customer_id); + + $this->assertNotNull($customer_cl_extra); + + $this->assertEquals(10, $customer_cl_extra['fixed']); + $this->assertEquals(10, $customer_cl_extra['recurrent']); + $this->assertEquals(10, $customer_cl_extra['services']); + } + } + + /** + * @covers Wiaas_Package_CL_Pricing::get_extras_for_customer() + */ + function test_customer_specific_extras_retrieved_for_customer() { + // append customer specific extras for purchase payment type + $this->cl_extras['purchase_customer_' . $this->customer_id] = array( + 'fixed' => 100, + 'recurrent' => 100, + 'services' => 100, + 'visible' => true + ); + + // set prices extras + update_term_meta( + $this->shop_owner_id, + '_wiaas_cm_extras_' . $this->package_id, + $this->cl_extras); + + // test that only extras are retrieved for purchase payment type + // and the rest are not retrieved + $pay_types = array_keys(Wiaas_Package_Pricing::get_available_pay_types()); + foreach ($pay_types as $pay_type) { + $customer_cl_extra = Wiaas_Package_CL_Pricing::get_extras_for_customer( + $this->shop_owner_id, + $pay_type, + $this->package_id, + $this->customer_id); + + if ($pay_type === 'purchase') { + + $this->assertNotNull($customer_cl_extra); + + $this->assertEquals(100, $customer_cl_extra['fixed']); + $this->assertEquals(100, $customer_cl_extra['recurrent']); + $this->assertEquals(100, $customer_cl_extra['services']); + } else { + + $this->assertNull($customer_cl_extra); + } + } + } + + + // HELPERS + + private function _validate_default_cl_extras($cl_extras) { + $this->assertNotEmpty($cl_extras); + + $this->assertArrayHasKey('purchase_default', $cl_extras); + $this->assertArrayHasKey('purchase_24_default', $cl_extras); + $this->assertArrayHasKey('managed_36_default', $cl_extras); + + foreach ($cl_extras as $cl_extra) { + $this->assertEquals(10, $cl_extra['fixed']); + $this->assertEquals(10, $cl_extra['recurrent']); + $this->assertEquals(10, $cl_extra['services']); + $this->assertTrue($cl_extra['visible']); + } + } +} \ No newline at end of file