-
-
-
- '_wiaas_max_cost_margin',
- 'name' => 'wiaas_max_cost_margin',
- 'value' => $max_cost_margin,
- 'label' => __( 'Max cost margin:', 'wiaas' ),
- 'type' => 'number',
- )
- );
- ?>
-
-
-
- '_wiaas_price_commision',
- 'name' => 'wiaas_pricing_rules_commision',
- 'value' => $commission,
- 'label' => __( 'Commision (Percent):', 'wiaas' ),
- 'type' => 'number',
- )
- );
- ?>
-
-
-
-
diff --git a/backend/app/plugins/wiaas/includes/admin/pricing/views/html-product-pricing.php b/backend/app/plugins/wiaas/includes/admin/pricing/views/html-product-pricing.php
index f852b5f..3412387 100644
--- a/backend/app/plugins/wiaas/includes/admin/pricing/views/html-product-pricing.php
+++ b/backend/app/plugins/wiaas/includes/admin/pricing/views/html-product-pricing.php
@@ -4,29 +4,6 @@ if ( ! defined( 'ABSPATH' ) ) {
}
?>
-
-
get_type() !== 'bundle' ||
- $product->get_status() !== 'publish') {
+ $product->get_status() !== 'publish' ||
+ empty(Wiaas_Package_Pricing::get_package_prices($product))) {
$access_group = Groups_Group::read_by_name('admin');
} else {
diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-admin.php b/backend/app/plugins/wiaas/includes/class-wiaas-admin.php
index c67c1ee..39d0b48 100644
--- a/backend/app/plugins/wiaas/includes/class-wiaas-admin.php
+++ b/backend/app/plugins/wiaas/includes/class-wiaas-admin.php
@@ -33,7 +33,10 @@ class Wiaas_Admin {
$plugin_url = untrailingslashit( plugins_url( '/', WIAAS_FILE ) );
wp_enqueue_style( 'wiaas_admin_menu', $plugin_url . '/assets/css/menu.css' );
- wp_enqueue_style( 'wiaas_admin_packages', $plugin_url . '/assets/css/package.css' );
+
+ wp_enqueue_style( 'wiaas_admin_packages', $plugin_url . '/assets/css/wiaas-admin-package.css' );
+
+ wp_enqueue_script( 'wiaas_admin_packages', $plugin_url . '/assets/js/wiaas-admin-package.js' );
}
}
diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-product.php b/backend/app/plugins/wiaas/includes/class-wiaas-product.php
index 9bf1fc9..1360443 100644
--- a/backend/app/plugins/wiaas/includes/class-wiaas-product.php
+++ b/backend/app/plugins/wiaas/includes/class-wiaas-product.php
@@ -6,17 +6,19 @@ class Wiaas_Product {
require_once dirname( __FILE__ ) . '/product/class-wiaas-product-category.php';
require_once dirname( __FILE__ ) . '/product/class-wiaas-product-supplier.php';
- add_filter('woocommerce_register_post_type_product', array(__CLASS__, 'define_product_capabilities'));
+ add_filter('woocommerce_register_post_type_product', array(__CLASS__, 'manage_product_settings'));
}
/**
- * Define capabilities for editing products so we can easily control read/edit/create access for them
+ * Update product type settins before it is created:
+ * - Define capabilities for editing products so we can easily control read/edit/create access for them
+ * - Declare fields supported by product
*
* @param $args
*
* @return mixed
*/
- public static function define_product_capabilities($args) {
+ public static function manage_product_settings($args) {
$args['capabilities'] = array(
'edit_post' => 'edit_product',
@@ -28,6 +30,10 @@ class Wiaas_Product {
'read_private_posts' => 'read_private_products',
'create_posts' => 'create_products', // use `create_products` instead of default `edit_products`
);
+
+ $args['supports'] = array( 'title', 'thumbnail' );
+
+
return $args;
}
}
diff --git a/backend/app/plugins/wiaas/includes/package/class-wiaas-package-status.php b/backend/app/plugins/wiaas/includes/package/class-wiaas-package-status.php
index 8a7cfd5..29016f2 100644
--- a/backend/app/plugins/wiaas/includes/package/class-wiaas-package-status.php
+++ b/backend/app/plugins/wiaas/includes/package/class-wiaas-package-status.php
@@ -56,7 +56,9 @@ class Wiaas_Package_Status {
$statuses = [self::AVAILABLE, self::INVALID_MARGIN, self::INVALID_TEMPLATE];
foreach ($statuses as $status) {
- wp_insert_term($status, 'package_status');
+ if (! has_term($status)) {
+ wp_insert_term($status, 'package_status');
+ }
}
}
diff --git a/backend/app/plugins/wiaas/includes/pricing/class-wiaas-package-pricing.php b/backend/app/plugins/wiaas/includes/pricing/class-wiaas-package-pricing.php
index 7c9fd30..b681f7f 100644
--- a/backend/app/plugins/wiaas/includes/pricing/class-wiaas-package-pricing.php
+++ b/backend/app/plugins/wiaas/includes/pricing/class-wiaas-package-pricing.php
@@ -49,30 +49,10 @@ class Wiaas_Package_Pricing {
);
public static function init() {
-
- add_filter('woocommerce_bundle_price_html', array( __CLASS__, 'get_package_price_html' ), 10, 2);
add_action('woocommerce_update_product', array(__CLASS__, 'on_product_update' ), 10, 1 );
}
- public static function get_package_price_html($price_html, $package) {
- $bundled_items = $package->get_bundled_items();
-
- $recurring_price = 0;
-
- foreach ($bundled_items as $bundled_item) {
- $product = $bundled_item->product;
- $product_price = Wiaas_Product_Pricing::get_product_price($product);
- if ($product_price['is_recurring']) {
- $recurring_price += $product_price['price'] * $bundled_item->get_quantity();
- }
- }
-
- $price_html = 'Fixed: ' . $price_html . ' and ' . $recurring_price . ' / month';
-
- return $price_html;
- }
-
/**
* Get configuration for available payment types
* @return array
@@ -121,6 +101,8 @@ class Wiaas_Package_Pricing {
$package->delete_meta_data( '_wiaas_pricing_rules' );
}
$package->save_meta_data();
+
+ self::_validate_package($package);
}
/**
@@ -147,6 +129,11 @@ class Wiaas_Package_Pricing {
private static function _get_package_prices($package) {
$pricing_rules = $package->get_meta( '_wiaas_pricing_rules' );
+
+ if (empty($pricing_rules)) {
+ return null;
+ }
+
$commision = self::_get_package_pricing_commision($package);
$prices = array();
diff --git a/backend/app/plugins/wiaas/includes/pricing/wiaas-pricing-functions.php b/backend/app/plugins/wiaas/includes/pricing/wiaas-pricing-functions.php
index 1a2baef..a9ba343 100644
--- a/backend/app/plugins/wiaas/includes/pricing/wiaas-pricing-functions.php
+++ b/backend/app/plugins/wiaas/includes/pricing/wiaas-pricing-functions.php
@@ -48,4 +48,80 @@ function wiaas_get_recurrent_price_mortage($principal_amount, $pay_period, $marg
function wiaas_get_price_margin($fixed_price, $principal_amount, $total_cost) {
$total_gain = $fixed_price + $principal_amount;
return $total_gain - $total_cost;
+}
+
+function wiaas_get_package_hardware_procurement_cost($package) {
+ $bundled_items = $package->get_bundled_items();
+ $total_cost = 0;
+
+ foreach ($bundled_items as $bundled_item) {
+ $product = $bundled_item->product;
+
+ if (Wiaas_Product_Category::get_category($product) === 'hardware') {
+ $total_cost += Wiaas_Pricing::get_product_total_cost($product) * $bundled_item->get_quantity();
+ }
+ }
+
+ return $total_cost;
+}
+
+function wiaas_get_package_software_procurement_cost($package) {
+ $bundled_items = $package->get_bundled_items();
+ $total_cost = 0;
+
+ foreach ($bundled_items as $bundled_item) {
+ if (Wiaas_Product_Category::is_hardware($bundled_item->product)) {
+ $total_cost += Wiaas_Pricing::get_product_total_cost($bundled_item->product) * $bundled_item->get_quantity();
+ }
+ }
+
+ return $total_cost;
+}
+
+function wiaas_get_package_installation_procurement_cost($package) {
+ $bundled_items = $package->get_bundled_items();
+ $total_cost = 0;
+
+ foreach ($bundled_items as $bundled_item) {
+ if (Wiaas_Product_Category::is_installation($bundled_item->product)) {
+ $installation_cost = Wiaas_Pricing::get_product_total_cost($bundled_item->product);
+ $total_cost = $total_cost > $installation_cost ? $total_cost : $installation_cost;
+ }
+ }
+
+ return $total_cost;
+}
+
+function wiaas_get_package_one_time_services_procurement_cost($package) {
+ $bundled_items = $package->get_bundled_items();
+ $total_cost = 0;
+
+ foreach ($bundled_items as $bundled_item) {
+ if (Wiaas_Product_Category::is_service($bundled_item->product)) {
+
+ $price = Wiaas_Product_Pricing::get_product_price($bundled_item->product);
+ if (! $price['is_recurring']) {
+ $total_cost += Wiaas_Pricing::get_product_total_cost($bundled_item->product) * $bundled_item->get_quantity();
+ }
+ }
+ }
+
+ return $total_cost;
+}
+
+function wiaas_get_package_recurring_services_procurement_cost($package) {
+ $bundled_items = $package->get_bundled_items();
+ $total_cost = 0;
+
+ foreach ($bundled_items as $bundled_item) {
+ if (Wiaas_Product_Category::is_service($bundled_item->product)) {
+
+ $price = Wiaas_Product_Pricing::get_product_price($bundled_item->product);
+ if ( $price['is_recurring']) {
+ $total_cost += $price['price'] * $bundled_item->get_quantity();
+ }
+ }
+ }
+
+ return $total_cost;
}
\ No newline at end of file
diff --git a/backend/app/plugins/wiaas/includes/product/class-wiaas-product-category.php b/backend/app/plugins/wiaas/includes/product/class-wiaas-product-category.php
index fe7e70e..4e981c3 100644
--- a/backend/app/plugins/wiaas/includes/product/class-wiaas-product-category.php
+++ b/backend/app/plugins/wiaas/includes/product/class-wiaas-product-category.php
@@ -46,7 +46,9 @@ class Wiaas_Product_Category {
public static function register_product_categories() {
foreach (self::$available_product_categories as $key => $available_product_category) {
- wp_insert_term($key, 'product_cat');
+ if (! has_term_meta($key)) {
+ wp_insert_term($key, 'product_cat');
+ }
}
}
@@ -83,6 +85,26 @@ class Wiaas_Product_Category {
return self::_get_product_category_type($product) === 'service';
}
+ /**
+ * Determines if provided product is hardware
+ * @param $product
+ *
+ * @return bool
+ */
+ public static function is_hardware($product) {
+ return self::_get_product_category_type($product) === 'hardware';
+ }
+
+ /**
+ * Determines if provided product is software
+ * @param $product
+ *
+ * @return bool
+ */
+ public static function is_software($product) {
+ return self::_get_product_category_type($product) === 'software';
+ }
+
// PRIVATE
diff --git a/frontend/src/helpers/PackageHelper.js b/frontend/src/helpers/PackageHelper.js
index c59d6c6..ba3fde4 100644
--- a/frontend/src/helpers/PackageHelper.js
+++ b/frontend/src/helpers/PackageHelper.js
@@ -54,7 +54,7 @@ export const fromWCPackage = wcPackage => {
document.icon = getDocumentIcon(document.extension);
return document;
}) : [],
- shortDescription: wcPackage.description,
+ shortDescription: wcPackage['short_description'],
prices: extractPrices(wcPackage.id, wcPackage.prices || []),
groups: extractGroups(wcPackage.groups || {}),
additionalPackages: wcPackage['additional_packages'] ? wcPackage['additional_packages'].map(additionalPackage =>({