diff --git a/backend/app/plugins/wiaas/assets/js/wiaas-template-admin-write-panels.js b/backend/app/plugins/wiaas/assets/js/wiaas-template-admin-write-panels.js index c12c4c2..24562f8 100644 --- a/backend/app/plugins/wiaas/assets/js/wiaas-template-admin-write-panels.js +++ b/backend/app/plugins/wiaas/assets/js/wiaas-template-admin-write-panels.js @@ -1,76 +1,23 @@ jQuery(function ($) { - var $edit_in_cart = $('.bundle_edit_in_cart'), - $group_mode_select = $('select#_wc_pb_group_mode'), - $bundled_products_panel = $('#bundled_product_data'), - $bundled_products_toolbar = $bundled_products_panel.find('.toolbar'), - $template_products_container_hardware = $('.wiaas-template-items_hardware'), - $template_products_container_software = $('.wiaas-template-items_software'), - $template_products_container_services = $('.wiaas-template-items_services'), - $template_products_container_isntallation = $('.wiaas-template-items_installation'), + var $template_categories_container_hardware = $('.wiaas-template-items_hardware'), + $template_categories_container_software = $('.wiaas-template-items_software'), + $template_categories_container_services = $('.wiaas-template-items_services'), + $template_categories_container_isntallation = $('.wiaas-template-items_installation'), - $template_products = $('.wc-bundled-item', - $template_products_container_services, - $template_products_container_software, - $template_products_container_hardware, - $template_products_container_isntallation), + $template_categories = $('.wc-bundled-item', + $template_categories_container_services, + $template_categories_container_software, + $template_categories_container_hardware, + $template_categories_container_isntallation), $template_search_hardware = $('#wiaastemplate_products_hardware'), $template_search_software = $('#wiaastemplate_products_software'), $template_search_services = $('#wiaastemplate_products_services'), $template_search_installation = $('#wiaastemplate_products_installation'), - bundled_product_objects = {}, - bundled_products_add_count = $template_products.length, - block_params = { - message: null, - overlayCSS: { - background: '#fff', - opacity: 0.6 - } - }; + template_category_objects = {}, + template_category_add_count = $template_categories.length; - $.fn.wc_bundles_select2 = function () { - $(document.body).trigger('wc-enhanced-select-init'); - }; - - // Bundle type move stock msg up. - $('.bundle_stock_msg').appendTo('._manage_stock_field .description'); - - // Simple type options are valid for bundles. - $('.show_if_simple:not(.hide_if_bundle)').addClass('show_if_bundle'); - - $('body').on('woocommerce-product-type-change', function (event, select_val) { - - if ('bundle' === select_val) { - - $('.show_if_external').hide(); - $('.show_if_bundle').show(); - - $('input#_manage_stock').change(); - - $('#_nyp').change(); - } - - }); - - $group_mode_select.change(function () { - if ($.inArray($group_mode_select.val(), wc_bundles_admin_params.group_modes_with_parent) === -1) { - $edit_in_cart.hide(); - } else { - $edit_in_cart.show(); - } - }); - - // Downloadable support. - $('input#_downloadable').change(function () { - $('select#product-type').change(); - }); - - // Trigger product type change. - $('select#product-type').change(); - - // Trigger group mode change. - $group_mode_select.change(); init_event_handlers(); @@ -81,52 +28,50 @@ jQuery(function ($) { $template_search_hardware .on('change', function () { - addSearchedProduct('hardware', $template_search_hardware, $template_products_container_hardware) + addSearchedTemplateCategory('hardware', $template_search_hardware, $template_categories_container_hardware) }); $template_search_software .on('change', function () { - addSearchedProduct('software', $template_search_software, $template_products_container_software) + addSearchedTemplateCategory('software', $template_search_software, $template_categories_container_software) }); $template_search_installation .on('change', function () { - addSearchedProduct('services', $template_search_installation, $template_products_container_isntallation) + addSearchedTemplateCategory('installation', $template_search_installation, $template_categories_container_isntallation) }); $template_search_services .on('change', function () { - addSearchedProduct('installation', $template_search_services, $template_products_container_services) + addSearchedTemplateCategory('services', $template_search_services, $template_categories_container_services) }); - function addSearchedProduct(options, search, container) { - var bundled_product_ids = search.val(), - bundled_product_id = bundled_product_ids && bundled_product_ids.length > 0 ? bundled_product_ids.shift() : false; + function addSearchedTemplateCategory(options, search, container) { + var template_category_ids = search.val(), + template_category_id = template_category_ids && template_category_ids.length > 0 ? template_category_ids.shift() : false; var template_category_title =search.text(); - if (!bundled_product_id) { + if (!template_category_id) { return false; } search.val([]).change(); - $bundled_products_panel.block(block_params); - - bundled_products_add_count++; + template_category_add_count++; var data = { action: 'wiaas_add_template_product', post_id: woocommerce_admin_meta_boxes.post_id, - id: bundled_products_add_count, + id: template_category_add_count, title: template_category_title, - product_id: bundled_product_id, + template_category_id: template_category_id, security: wc_bundles_admin_params.add_bundled_product_nonce, options: options, }; @@ -140,13 +85,11 @@ jQuery(function ($) { container.append(response.markup); var $added = $('.wiaas-template-item', container).last(), - added_id = 'bundled_item_' + bundled_products_add_count; + added_id = 'bundled_item_' + template_category_add_count; $added.data('bundled_item_id', added_id); $added.wc_bundles_select2(); - $bundled_products_panel.trigger('wc-bundles-added-bundled-product'); - } else if (response.message !== '') { window.alert(response.message); } @@ -161,8 +104,6 @@ jQuery(function ($) { } search.text(''); - $bundled_products_panel.unblock(); - }); }, 250); @@ -170,7 +111,7 @@ jQuery(function ($) { return false; } - $template_products_container_isntallation + $template_categories_container_isntallation // Remove Item. .on('click', 'a.remove_row', function (e) { @@ -181,15 +122,13 @@ jQuery(function ($) { $el.find('*').off(); $el.remove(); - delete bundled_product_objects[el_id]; - - $bundled_products_panel.triggerHandler('wc-bundled-products-changed'); + delete template_category_objects[el_id]; e.preventDefault(); }); - $template_products_container_hardware + $template_categories_container_hardware // Remove Item. .on('click', 'a.remove_row', function (e) { @@ -200,15 +139,13 @@ jQuery(function ($) { $el.find('*').off(); $el.remove(); - delete bundled_product_objects[el_id]; - - $bundled_products_panel.triggerHandler('wc-bundled-products-changed'); + delete template_category_objects[el_id]; e.preventDefault(); }); - $template_products_container_software + $template_categories_container_software // Remove Item. .on('click', 'a.remove_row', function (e) { @@ -219,15 +156,13 @@ jQuery(function ($) { $el.find('*').off(); $el.remove(); - delete bundled_product_objects[el_id]; - - $bundled_products_panel.triggerHandler('wc-bundled-products-changed'); + delete template_category_objects[el_id]; e.preventDefault(); }); - $template_products_container_services + $template_categories_container_services // Remove Item. .on('click', 'a.remove_row', function (e) { @@ -238,9 +173,7 @@ jQuery(function ($) { $el.find('*').off(); $el.remove(); - delete bundled_product_objects[el_id]; - - $bundled_products_panel.triggerHandler('wc-bundled-products-changed'); + delete template_category_objects[el_id]; e.preventDefault(); diff --git a/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-admin-template-selection.php b/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-admin-template-selection.php index e1012a6..2fca714 100644 --- a/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-admin-template-selection.php +++ b/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-admin-template-selection.php @@ -3,27 +3,35 @@ class Wiaas_Admin_Template_Selection { public static function init() { - add_action('add_meta_boxes', array(__CLASS__, 'create_custom_meta_box'), 100); - add_action('woocommerce_process_product_meta_bundle', array(__CLASS__, 'save_custom_content_meta_box'), 10, 1); + add_action('add_meta_boxes', array(__CLASS__, 'create_template_meta_box'), 100); + add_action('woocommerce_process_product_meta_bundle', array(__CLASS__, 'save_template_content_meta_box'), 10, 1); // Processes and saves type-specific data. add_action('woocommerce_admin_process_product_object', array(__CLASS__, 'validate_bundle'), 11); } - public static function create_custom_meta_box() { + /** + * Renders template selection meta box + */ + public static function create_template_meta_box() { add_meta_box( 'template_product_meta_box', __('Choose package template (optional)', 'cmb'), - 'Wiaas_Admin_Template_Selection::add_custom_content_meta_box', + 'Wiaas_Admin_Template_Selection::add_template_content_meta_box', 'product', 'normal', 'high' ); } - - public static function add_custom_content_meta_box($post) { + /** + * Fill in the value of template selection dropdown, + * and render template categories of the selected template + * + * @param $post WP_Post object + */ + public static function add_template_content_meta_box($post) { $value = get_post_meta($post->ID, '_select_template', true); @@ -49,49 +57,82 @@ class Wiaas_Admin_Template_Selection { $template_products_data = self::show_template_products($value); self::render_template_products($template_products_data['hardware']); - self::render_template_products($template_products_data['service']); + self::render_template_products($template_products_data['services']); self::render_template_products($template_products_data['installation']); self::render_template_products($template_products_data['software']); ?> $template_products_hardware, - 'service' => $template_products_service, + 'services' => $template_products_services, 'installation' => $template_products_installation, 'software' => $template_products_software ); } + /** + * Render html of template categories + * + * @param $template_products array containing template category information + */ public static function render_template_products($template_products) { if (!empty($template_products)) { @@ -108,90 +149,43 @@ class Wiaas_Admin_Template_Selection { } } - public static function get_product_categories($category_meta) { - $category_objects = array(); + /** + * Save selected template + * + * @param $post_id WP_Post + */ - if (empty($category_meta)) { - return array(); - } - - foreach ($category_meta as $meta) { - - if (!empty($meta)) { - - - $category_template_id = $meta['template_category_id']; - - $template_category_object = new Wiaas_Template_Category_Object( - $category_template_id, - $meta['template_category_title'], - $meta['quantity']); - - $category_objects[$category_template_id] = $template_category_object; - } - - } - return empty($category_objects) ? null : $category_objects; - } - - public static function get_bundled_product_categories($bundled_items) { - - $template_category_objects = array(); - foreach ($bundled_items as $item_id => $item) { - $item_data = $item->get_data(); - $post_terms = wp_get_object_terms($item->get_product_id(), 'template_category', array('fields' => 'id=>name')); - - if (!empty($post_terms) && !is_wp_error($post_terms)) { - - $cat = ''; - $category_template_id = ''; - - foreach ($post_terms as $id => $term) { - $cat = $term; - $category_template_id = $id; - } - - $template_category_object = new Wiaas_Template_Category_Object( - $category_template_id, - $cat, - $item_data['quantity_max']); - $template_category_objects[$category_template_id] = $template_category_object; - - } - } - - return $template_category_objects; - } - - - function save_custom_content_meta_box($post_id) { + function save_template_content_meta_box($post_id) { $selected_template = $_POST['_select_template']; - if (!empty($selected_template)) - update_post_meta($post_id, '_select_template', esc_attr($selected_template)); - else { - update_post_meta($post_id, '_select_template', ''); - } + + WC_Product_Template::bind_selected_template_to_product($selected_template, $post_id); } + /** + * Get the template categories from bundle products and selected template + * Compare template categories and quantities that are required by the template with those in bundle products + * + * Admin error is added if validation is not satisfied + * + * @param $product WC_Product_Bundle + */ public static function validate_bundle($product) { if ($product->get_type() == 'bundle') { $selected_template = $_POST['_select_template']; $bundled_items = $product->get_bundled_items('view'); - $products_form_template = self::show_template_products($selected_template); + $template_categories_form_template = self::show_template_products($selected_template); - $missing_categories = array(); - $insufficient_product_quantities = array(); + $missing_template_categories = array(); + $insufficient_template_category_quantities = array(); - - $categories_form_template = self::get_categories_from_templates($products_form_template); - $categories_form_bundle = self::get_bundled_product_categories($bundled_items); + $categories_form_template = self::get_categories_from_templates($template_categories_form_template); + $categories_form_bundle = WC_Product_Template::extract_bundled_product_categories($bundled_items); $bundle_category_keys = array_keys($categories_form_bundle); - if (!empty($categories_form_template)) { foreach ($categories_form_template as $category) { @@ -200,7 +194,7 @@ class Wiaas_Admin_Template_Selection { if (!in_array($template_cat_id, $bundle_category_keys)) { - array_push($missing_categories, $category->name); + array_push($missing_template_categories, $category->name); } else { @@ -208,37 +202,25 @@ class Wiaas_Admin_Template_Selection { $quantity_from_template = $category->quantity; if ((int)($quantity_from_template) !== $product_from_bundle_quantity) { - array_push($insufficient_product_quantities, $category->name); + array_push($insufficient_template_category_quantities, $category->name); } } } } - $categories_message = implode(',', $missing_categories); - $quantity_message = implode(',', $insufficient_product_quantities); + $template_categories_message = implode(',', $missing_template_categories); + $quantity_message = implode(',', $insufficient_template_category_quantities); - if (!empty($missing_categories)) { - WC_PB_Meta_Box_Product_Data::add_admin_error(__(' WIAAS This product bundle does not correspond to selected template Categories missing: ' . $categories_message, 'woocommerce-product-bundles')); + if (!empty($missing_template_categories)) { + WC_PB_Meta_Box_Product_Data::add_admin_error(__(' WIAAS This product bundle does not correspond to selected template Categories missing: ' . $template_categories_message, 'woocommerce-product-bundles')); } - if (!empty($insufficient_product_quantities)) { + if (!empty($insufficient_template_category_quantities)) { WC_PB_Meta_Box_Product_Data::add_admin_error(__(' WIAAS This product bundle does not correspond to selected template Categories with different quantities: ' . $quantity_message, 'woocommerce-product-bundles')); } } } - - public static function get_category_ids_form_bundle($product) { - $products_form_budnle = $product->get_bundled_data_items(); - $product_ids = array(); - - foreach ($products_form_budnle as $product) { - array_push($product_ids, $product->get_id()); - } - - return self::get_product_categories($product_ids); - - } } Wiaas_Admin_Template_Selection::init(); diff --git a/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-template-admin-ajax.php b/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-template-admin-ajax.php index 656f0ef..18e0ab5 100644 --- a/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-template-admin-ajax.php +++ b/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-template-admin-ajax.php @@ -21,6 +21,10 @@ class Wiaas_Template_Admin_Ajax { } + /** + * An ajax callback action for handling template selection + */ + public static function ajax_handle_template_selection() { $selected_template_id = intval($_POST['selected_template']); @@ -34,7 +38,7 @@ class Wiaas_Template_Admin_Ajax { if (!empty($template_products)) { ob_start(); Wiaas_Admin_Template_Selection::render_template_products($template_products['hardware']); - Wiaas_Admin_Template_Selection::render_template_products($template_products['service']); + Wiaas_Admin_Template_Selection::render_template_products($template_products['services']); Wiaas_Admin_Template_Selection::render_template_products($template_products['installation']); Wiaas_Admin_Template_Selection::render_template_products($template_products['software']); @@ -53,7 +57,7 @@ class Wiaas_Template_Admin_Ajax { check_ajax_referer('wc_bundles_add_bundled_product', 'security'); $loop = intval($_POST['id']); - $product_id = intval($_POST['product_id']); + $template_category_id = intval($_POST['template_category_id']); $title = $_POST['title']; $options = $_POST['options']; @@ -70,13 +74,13 @@ class Wiaas_Template_Admin_Ajax { } /** - * + * Handles adding template categories search. */ public static function ajax_wiaas_template_category_search() { - $term = ($_POST['term']); + $term = wp_unslash($_GET['term']); $response = array(); - + $terms = get_terms(array( 'taxonomy' => 'template_category', 'name__like' => $term diff --git a/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-template-products.php b/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-template-products.php index ddb5e54..9e50ed0 100644 --- a/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-template-products.php +++ b/backend/app/plugins/wiaas/includes/admin/template/class-wiaas-template-products.php @@ -7,7 +7,6 @@ class Wiaas_template { public static function init() { add_filter('product_type_selector', array(__CLASS__, 'add_template_product_type')); - add_action('admin_footer', array(__CLASS__, 'templates_custom_js')); add_filter('woocommerce_product_data_tabs', array(__CLASS__, 'custom_product_tabs')); add_action('woocommerce_product_data_panels', array(__CLASS__, 'wiaastemplate_product_tab_content_all')); add_action('woocommerce_admin_process_product_object', array(__CLASS__, 'save_wiaastemplate')); @@ -35,7 +34,7 @@ class Wiaas_template { } /** - * Add to product type drop down. + * Add template product type drop down. */ function add_template_product_type($types) { @@ -48,27 +47,7 @@ class Wiaas_template { /** - * Show pricing fields for template product. - */ - function templates_custom_js() { - - if ('product' != get_post_type()) : - return; - endif; - - ?> - " style="width: 250px;" name="template_product" data-placeholder="" - data-action="woocommerce_json_search_products" multiple="multiple" data-limit="500"> + multiple="multiple" data-limit="500"> @@ -154,7 +140,7 @@ class Wiaas_template { /** - * Save the custom fields. + * Save the template categories that are bind to template. */ function save_wiaastemplate($post_id) { @@ -163,14 +149,21 @@ class Wiaas_template { $posted_template_data_installation = isset($_POST['template_data_installation']) ? $_POST['template_data_installation'] : false; $posted_template_data_software = isset($_POST['template_data_software']) ? $_POST['template_data_software'] : false; - self::save_template_product_meta($post_id, $posted_template_data_hardware, 'hardware'); - self::save_template_product_meta($post_id, $posted_template_data_services, 'services'); - self::save_template_product_meta($post_id, $posted_template_data_installation, 'installation'); - self::save_template_product_meta($post_id, $posted_template_data_software, 'software'); + self::process_and_save_template_product_meta($post_id, $posted_template_data_hardware, 'hardware'); + self::process_and_save_template_product_meta($post_id, $posted_template_data_services, 'services'); + self::process_and_save_template_product_meta($post_id, $posted_template_data_installation, 'installation'); + self::process_and_save_template_product_meta($post_id, $posted_template_data_software, 'software'); } - public static function save_template_product_meta($post_id, $posted_template_data, $option) { + /** + * Get extract posted data and save them to meta + * + * @param $post_id integer id of the template + * @param $posted_template_data mixed + * @param $option string indicating main wiaas category + */ + public static function process_and_save_template_product_meta($post_id, $posted_template_data, $option) { $processed_template_data = array(); // Sort posted data by menu order. @@ -178,24 +171,24 @@ class Wiaas_template { foreach ($posted_template_data as $data) { - $product_id = isset($data['product_id']) ? absint($data['product_id']) : false; - $product_title = isset($data['product_title']) ? $data['product_title'] : false; + $template_category_id = isset($data['template_category_id']) ? absint($data['template_category_id']) : false; + $template_category_title = isset($data['template_category_title']) ? $data['template_category_title'] : false; $quantity = isset($data['quantity']) ? absint($data['quantity']) : false; $item_data = array( - 'template_category_id' => $product_id, - 'template_category_title' => trim($product_title), + 'template_category_id' => $template_category_id, + 'template_category_title' => trim($template_category_title), 'quantity' => $quantity ); - $processed_template_data[$product_id] = $item_data; + $processed_template_data[$template_category_id] = $item_data; } - update_post_meta($post_id, '_template_items_' . $option, $processed_template_data); + WC_Product_Template::save_template_product_meta($post_id, $option, $processed_template_data); } public static function menu_sort_order($a, $b) { @@ -208,7 +201,7 @@ class Wiaas_template { /** - * Hide Attributes data panel. + * Hide default WC_Product data panels. */ function hide_attributes_data_panel($tabs) { diff --git a/backend/app/plugins/wiaas/includes/admin/template/views/html-wiaas-template-product.php b/backend/app/plugins/wiaas/includes/admin/template/views/html-wiaas-template-product.php index 0c0e03d..ea8bd95 100644 --- a/backend/app/plugins/wiaas/includes/admin/template/views/html-wiaas-template-product.php +++ b/backend/app/plugins/wiaas/includes/admin/template/views/html-wiaas-template-product.php @@ -18,8 +18,8 @@ if (!defined('ABSPATH')) { ?> + ?> $item) { + $item_data = $item->get_data(); + $post_terms = wp_get_object_terms($item->get_product_id(), 'template_category', array('fields' => 'id=>name')); + + if (!empty($post_terms) && !is_wp_error($post_terms)) { + + $cat = ''; + $category_template_id = ''; + + foreach ($post_terms as $id => $term) { + $cat = $term; + $category_template_id = $id; + } + + $template_category_object = new Wiaas_Template_Category_Object( + $category_template_id, + $cat, + $item_data['quantity_max']); + $template_category_objects[$category_template_id] = $template_category_object; + + } + } + + return $template_category_objects; + } + + /** + * Save selected template to bundled product meta + * + * @param $selected_template integer + * @param $post_id integer + */ + + public static function bind_selected_template_to_product($selected_template, $post_id) { + if (!empty($selected_template)) + update_post_meta($post_id, '_select_template', esc_attr($selected_template)); + else { + update_post_meta($post_id, '_select_template', ''); + } + } + + /** + * Save template categories to template product meta + * + * @param $post_id integer + * @param $option string a main wiaas category + * @param $processed_template_data array actual template category data + */ + + public static function save_template_product_meta($post_id, $option, $processed_template_data) { + + update_post_meta($post_id, '_template_items_' . $option, $processed_template_data); + + } } } diff --git a/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-templates.php b/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-templates.php new file mode 100644 index 0000000..e3f008d --- /dev/null +++ b/backend/app/plugins/wiaas/tests/unit-tests/test-wiaas-templates.php @@ -0,0 +1,61 @@ +template_category = wp_create_term('Test', 'template_category'); + $this->template_meta = array( + 'template_category_id' => $this->template_category['term_id'], + 'template_category_title' => 'Test', + 'quantity' => 1 + ); + + $this->template = $this->create_new_wiaas_template(); + $this->product = $this->create_new_product(); + $this->package = $this->create_new_package(); + $this->add_products_to_package($this->package, $this->product); + + + } + + public function test_template_category_taxonomy_created() { + $taxonomy = get_taxonomy('template_category'); + + $this->assertInstanceOf(WP_Taxonomy::class, $taxonomy); + + $template_category_names = array_map(function ($term) { + return $term->name; + }, get_terms(array('taxonomy' => 'template_category', 'hide_empty' => false))); + + $this->assertNotEmpty($template_category_names); + $this->assertContains('Test', $template_category_names); + + } + + function test_adding_template_category_to_template() { + + WC_Product_Template::save_template_product_meta($this->template->get_id(), 'hardware', $this->template_meta); + + $test_template_category = WC_Product_Template::get_template_categories_from_meta( + $this->template->get_id(), '_template_items_hardware'); + + $this->assertEquals($test_template_category['template_category_id'], $this->template_meta['template_category_id']); + $this->assertEquals($test_template_category['template_category_title'], $this->template_meta['template_category_title']); + $this->assertEquals($test_template_category['quantity'], $this->template_meta['quantity']); + } + + function save_bind_package_to_template() { + WC_Product_Template::bind_selected_template_to_product($this->template->get_id(), $this->package->get_id()); + $value = get_post_meta($this->package->get_id(), '_select_template', true); + + $this->assertNotEmpty($value); + } +} \ 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 14a5b2f..d4c64b5 100644 --- a/backend/app/plugins/wiaas/tests/wiaas-unit-test-case.php +++ b/backend/app/plugins/wiaas/tests/wiaas-unit-test-case.php @@ -88,6 +88,21 @@ class Wiaas_Unit_Test_Case extends WP_UnitTestCase { $package->sync(true); } + + function create_new_wiaas_template() { + $post_id = wp_insert_post(array( + 'post_type' => 'product', + 'post_status' => 'publish', + 'post_name' => 'product', + 'post_title' => 'Package', + 'post_content' => 'Package', + 'post_excerpt' => 'Package' + ), true); + + return new WC_Product_Template($post_id); + + } + function create_new_customer($login = 'customer_test', $organization_name = 'test-customer-organization') { $customer_id = wp_insert_user(array( 'user_login' => $login,