diff --git a/backend/app/plugins/wiaas/assets/css/wiaas-admin-delivery-process.css b/backend/app/plugins/wiaas/assets/css/wiaas-admin-delivery-process.css new file mode 100644 index 0000000..bbd9acd --- /dev/null +++ b/backend/app/plugins/wiaas/assets/css/wiaas-admin-delivery-process.css @@ -0,0 +1,15 @@ +.delivery-process { + background-color: #777; + color: white; + cursor: pointer; + padding: 18px; + width: 100%; + border: none; + text-align: left; + outline: none; + font-size: 15px; + } + + .delivery-process:hover { + background-color: #555; + } \ No newline at end of file diff --git a/backend/app/plugins/wiaas/assets/js/wiaas-admin-delivery-process.js b/backend/app/plugins/wiaas/assets/js/wiaas-admin-delivery-process.js new file mode 100644 index 0000000..12e8a2f --- /dev/null +++ b/backend/app/plugins/wiaas/assets/js/wiaas-admin-delivery-process.js @@ -0,0 +1,23 @@ +jQuery(document).ready(function($) { + + $('#delivery-process-selector').change(function(e){ + e.preventDefault(); + + var data = { + action: 'wiaas_create_order_delivery_process', + _ajax_nonce: $('#wiaas_create_order_delivery_process_nonce').val(), + order: $('#wiaas_order_id').val(), + form: e.target.value + + }; + + // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php + $.post(ajaxurl, data, function(response) { + if (response.success){ + location.reload(); + }else{ + alert(response.data[0].message); + } + }); + }); +}); \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-delivery-process.php b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-delivery-process.php new file mode 100644 index 0000000..0218ec9 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-delivery-process.php @@ -0,0 +1,21 @@ +ID; + + $process = Wiaas_Delivery_Process::get_order_delivery_process($order_id); + + if ($process === NULL){ + $list_of_delivery_processes = Wiaas_Delivery_Process::get_available_delivery_processes(); + + echo '
+

Please select a process for the order:

+
+ +
'; + wp_nonce_field( 'wiaas_create_order_delivery_process', 'wiaas_create_order_delivery_process_nonce' ); + echo ''; + + }else{ + $current_step = Wiaas_Delivery_Process::get_active_step($order_id); + $workflow_url = $current_step->get_entry_url(); + + echo '
+ Go to delivery process page +
'; + } + } + + public static function add_custom_fields_after_order_details($order){ + $order_estimated_delivery_date = Wiaas_Order::get_order_estimated_date($order->id); + + $order_id = $order->id; + require 'views/html-order-delivery-date.php'; + } +} + +Wiaas_Admin_Order_Process_Flow::init(); \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/admin/delivery-process/views/html-order-delivery-date.php b/backend/app/plugins/wiaas/includes/admin/delivery-process/views/html-order-delivery-date.php new file mode 100644 index 0000000..10f6ec7 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/admin/delivery-process/views/html-order-delivery-date.php @@ -0,0 +1,38 @@ + + +

+ + " + onChange="onOrderEstimatedDeliveryDateChange(this.value)"/> +

+ + \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/admin/delivery-process/views/html-order-suppliers-delivery-dates.php b/backend/app/plugins/wiaas/includes/admin/delivery-process/views/html-order-suppliers-delivery-dates.php new file mode 100644 index 0000000..a03f7d1 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/admin/delivery-process/views/html-order-suppliers-delivery-dates.php @@ -0,0 +1,200 @@ + + +
+ + + + + + + + + + + '; + $estimated_date = $supplier['estimated_date'] ? date("Y-m-d", $supplier['estimated_date']) : ""; + $confirmed_date = $supplier['confirmed_date'] ? date("Y-m-d", $supplier['confirmed_date']) : ""; + + ?> + + + + + + + + + + + + + + $tracking_info){ + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SuppliersEstimated dateConfirmed date

' . $supplier['name'] . ' + type="date" onChange="onEstimatedDeliveryDateChange(, this.value)" value="" /> + + type="date" onChange="onConfirmedDeliveryDateChange(, this.value)" value="" /> +

Tracking

+ placeholder="Tracking number" value="" /> + placeholder="Tracking URL" value="" />

Final dates :


Earliest installation date :

+
+ + \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/admin/delivery-process/wiaas-admin-delivery-process-ajax.php b/backend/app/plugins/wiaas/includes/admin/delivery-process/wiaas-admin-delivery-process-ajax.php new file mode 100644 index 0000000..9d26610 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/admin/delivery-process/wiaas-admin-delivery-process-ajax.php @@ -0,0 +1,140 @@ +add_meta_data('_wiaas_commercial_lead_id', $shop_owner_id); + + + // add suppliers to order + $suppliers = array(); + $items = $order->get_items('line_item'); + + foreach($items as $item){ + $product = wc_get_product($item['product_id']); + + if ($product->is_type('simple') && !Wiaas_Product_Category::is_installation($product)){ + $supplier_id = Wiaas_Product::get_supplier_id($product->id); + $supplier_name = wiaas_get_organization_name($supplier_id); + if (!isset($suppliers[$supplier_id])){ + $suppliers[$supplier_id] = array( + 'id' => $supplier_id, + 'name' => $supplier_name, + 'estimated_date' => NULL, + 'confirmed_date' => NULL, + 'tracking_info' => array(), + 'items' => array($product->id) + ); + }else{ + $suppliers[$supplier_id]['items'][] = $product->id; + } + } + } + + $order->add_meta_data('_wiaas_suppliers', $suppliers, true); + + // add additional date fields to order + $order->add_meta_data('_wiaas_estimated_delivery_date', NULL, true); + $order->add_meta_data('_wiaas_final_estimated_delivery_date', 0, true); + $order->add_meta_data('_wiaas_final_confirmed_delivery_date', 0, true); + $order->add_meta_data('_wiaas_earliest_installation_date', 0, true); + + //add additional days prior installation field + $max_additional_days = 0; + $items = $order->get_items('line_item'); + + foreach($items as $item){ + $product = wc_get_product($item['product_id']); + if ($product->get_type() === 'bundle'){ + $package_additional_days = Wiaas_Package::get_earliest_installation_additional_days($product->id); + if ($package_additional_days > $max_additional_days){ + $max_additional_days = $package_additional_days; + } + } + } + + $order->add_meta_data('_wiaas_order_additional_days_prior_installation', $max_additional_days, true); + } /** diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-delivery-process.php b/backend/app/plugins/wiaas/includes/class-wiaas-delivery-process.php index 34b58c3..9e9a4de 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-delivery-process.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-delivery-process.php @@ -19,8 +19,6 @@ class Wiaas_Delivery_Process { } private static function _init_hooks() { - add_action('woocommerce_new_order', array( __CLASS__, 'create_delivery_process_for_order' )); - add_filter( 'gform_entry_meta', array(__CLASS__, 'extend_gravity_form_entry_meta'), 10, 2 ); add_action( 'gravityflow_workflow_complete', array(__CLASS__, 'maybe_complete_parent_process_step'), 5, 3 ); @@ -80,7 +78,41 @@ class Wiaas_Delivery_Process { $order = wc_get_order($order_id); $order->update_status('completed', 'Completed order delivery process.', true); } - } + } + + /** + * List available delivery processes + * + * @return array + */ + public static function get_available_delivery_processes(){ + $forms = GFFormsModel::search_forms( self::$process_form_title_prefix, true ); + $result = array(); + foreach($forms as $form){ + $result[] = array( + 'title' => str_replace(self::$process_form_title_prefix, '', $form->title), + 'id' => $form->id + ); + } + + return $result; + } + + public static function get_active_step($order_id){ + $process_entry_id = get_post_meta($order_id, 'wiaas_delivery_process_entry_id'); + if (empty($process_entry_id)) { + return null; + } + + $process_instance = GFAPI::get_entry($process_entry_id); + $api = new Gravity_Flow_API($process_instance['form_id']); + $steps_info = $api->get_steps(); + + foreach ( $steps_info as $step_info ) { + return $api->get_step( $step_info->get_id(), $process_instance ); + } + return null; + } /** * Retrieves delivery process instance for order @@ -92,7 +124,7 @@ class Wiaas_Delivery_Process { public static function get_order_delivery_process($order_id) { $process_entry_id = get_post_meta($order_id, 'wiaas_delivery_process_entry_id'); - if (!isset($process_entry_id)) { + if (empty($process_entry_id)) { return null; } @@ -132,13 +164,13 @@ class Wiaas_Delivery_Process { } /** - * Automatically create delivery process instance when order is created + * create delivery process instance * @param $order_id */ - public static function create_delivery_process_for_order($order_id) { + public static function create_delivery_process_for_order($order_id, $form_id) { $process_form = null; $forms = GFFormsModel::search_forms( self::$process_form_title_prefix, true ); - $process_form = $forms[0]; + $process_form = GFFormsModel::get_form($form_id); if(isset($process_form)) { $order = wc_get_order( $order_id ); $new_process_entry = array( @@ -150,7 +182,10 @@ class Wiaas_Delivery_Process { add_post_meta($order_id, 'wiaas_delivery_process_id', $process_form->id); add_post_meta($order_id, 'wiaas_delivery_process_entry_id', $process_entry_id); + + return true; } + return false; } /** diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-order.php b/backend/app/plugins/wiaas/includes/class-wiaas-order.php index 2ae0029..618a7ea 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-order.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-order.php @@ -44,6 +44,162 @@ class Wiaas_Order { return "1000000$number"; } + public static function get_additional_days_prior_installation($order_id){ + $order = wc_get_order($order_id); + return $order->get_meta('_wiaas_order_additional_days_prior_installation'); + } + + public static function add_additional_tracking_info($order_id, $supplier_id){ + $suppliers = self::get_suppliers($order_id); + foreach($suppliers as $key => $supplier){ + if ($supplier['id'] === $supplier_id){ + $suppliers[$key]['tracking_info'][] = array( + 'number' => '', + 'url' => '' + ); + + $order = wc_get_order($order_id); + $order->update_meta_data('_wiaas_suppliers', $suppliers); + $order->save_meta_data(); + return true; + } + } + + return false; + } + + public static function save_tracking_info($order_id, $supplier_id, $tracking_index, $tracking_num, $tracking_url){ + $suppliers = self::get_suppliers($order_id); + foreach($suppliers as $key => $supplier){ + if ($supplier['id'] === $supplier_id){ + $suppliers[$key]['tracking_info'][$tracking_index]['number'] = $tracking_num; + $suppliers[$key]['tracking_info'][$tracking_index]['url'] = $tracking_url; + + + $order = wc_get_order($order_id); + $order->update_meta_data('_wiaas_suppliers', $suppliers); + $order->save_meta_data(); + return true; + } + } + + return false; + } + + public static function delete_tracking_info($order_id, $supplier_id, $tracking_index){ + $suppliers = self::get_suppliers($order_id); + foreach($suppliers as $key => $supplier){ + if ($supplier['id'] === $supplier_id){ + unset($suppliers[$key]['tracking_info'][$tracking_index]); + + $order = wc_get_order($order_id); + $order->update_meta_data('_wiaas_suppliers', $suppliers); + $order->save_meta_data(); + return true; + } + } + + return false; + } + + public static function save_estimated_date($order_id, $supplier_id, $date){ + $suppliers = self::get_suppliers($order_id); + $updated = false; + foreach($suppliers as $key => $supplier){ + if ($supplier['id'] === $supplier_id){ + $suppliers[$key]['estimated_date'] = $date; + $updated = true; + } + } + + if (!$updated){ + return false; + } + + $order = wc_get_order($order_id); + + $order->update_meta_data('_wiaas_suppliers', $suppliers); + self::_update_max_and_earliest_dates($order, $suppliers); + + $order->save_meta_data(); + return true; + } + + public static function save_confirmed_date($order_id, $supplier_id, $date){ + $suppliers = self::get_suppliers($order_id); + $updated = false; + foreach($suppliers as $key => $supplier){ + if ($supplier['id'] === $supplier_id){ + $suppliers[$key]['confirmed_date'] = $date; + $updated = true; + if (!$suppliers[$key]['estimated_date']){ + $suppliers[$key]['estimated_date'] = $date; + } + } + } + + if (!$updated){ + return false; + } + + $order = wc_get_order($order_id); + + $order->update_meta_data('_wiaas_suppliers', $suppliers); + self::_update_max_and_earliest_dates($order, $suppliers); + + $order->save_meta_data(); + return true; + } + + public static function get_order_estimated_date($order_id){ + $order = wc_get_order($order_id); + if (!$order){ + return NULL; + } + + return $order->get_meta('_wiaas_order_estimated_delivery_date') ?: NULL; + } + + public static function save_order_estimated_date($order_id, $date){ + return update_post_meta($order_id, '_wiaas_order_estimated_delivery_date', $date); + } + + public static function get_final_estimated_date($order_id){ + $order = wc_get_order($order_id); + if (!$order){ + return 0; + } + + return $order->get_meta('_wiaas_final_estimated_delivery_date') ?: 0; + } + + public static function get_final_confirmed_date($order_id){ + $order = wc_get_order($order_id); + if (!$order){ + return 0; + } + + return $order->get_meta('_wiaas_final_confirmed_delivery_date') ?: 0; + } + + public static function get_earliest_installation_date($order_id){ + $order = wc_get_order($order_id); + if (!$order){ + return 0; + } + + return $order->get_meta('_wiaas_earliest_installation_date') ?: 0; + } + + + /** + * Get suppliers related to order + */ + public static function get_suppliers($order_id){ + $order = wc_get_order($order_id); + return $order->get_meta('_wiaas_suppliers'); + } + /** * Update `shop_order` post type settings before creation to enable better order management for wiaas * @@ -190,12 +346,65 @@ class Wiaas_Order { public static function get_order_tender($order_id) { return get_post_meta($order_id, '_wiaas_tender', true); - } + } /** * PRIVATE */ + private static function _update_max_and_earliest_dates($order, $suppliers){ + $max_estimated_date = 0; + $max_confirmed_date = 0; + $earliest_installation_date = 0; + $missing_estimated = false; + $missing_confirmed = false; + $no_earliest = false; + + foreach($suppliers as $supplier){ + if (!$supplier['estimated_date']){ + $missing_estimated = true; + } + if (!$supplier['confirmed_date']){ + $missing_confirmed = true; + } + + if ($supplier['estimated_date'] > $max_estimated_date){ + $max_estimated_date = $supplier['estimated_date']; + } + if ($supplier['confirmed_date'] > $max_confirmed_date){ + $max_confirmed_date = $supplier['confirmed_date']; + } + + if (!$no_earliest){ + $supplier_date = $supplier['estimated_date']; + if ($supplier['confirmed_date'] > $supplier_date){ + $supplier_date = $supplier['confirmed_date']; + } + if ($supplier_date > 0){ + if ($supplier_date > $earliest_installation_date){ + $earliest_installation_date = $supplier_date; + } + }else{ + $no_earliest = true; + $earliest_installation_date = 0; + } + } + } + + if ($missing_estimated && $missing_confirmed){ + $no_earliest = true; + $earliest_installation_date = 0; + } + + if (!$no_earliest){ + $earliest_installation_date = strtotime('+' . self::get_additional_days_prior_installation($order->id) . ' days', $earliest_installation_date); + } + + $order->update_meta_data('_wiaas_final_confirmed_delivery_date', $max_confirmed_date); + $order->update_meta_data('_wiaas_final_estimated_delivery_date', $max_estimated_date); + $order->update_meta_data('_wiaas_earliest_installation_date', $earliest_installation_date); + } + /** * Append specific wiaas order details, like reference * @param $data diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-package.php b/backend/app/plugins/wiaas/includes/class-wiaas-package.php index 9800711..e1527b0 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-package.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-package.php @@ -48,6 +48,10 @@ class Wiaas_Package { return $response; } + public static function get_earliest_installation_additional_days($package_id){ + return get_post_meta($package_id, 'additional_days_prior_earliest_installation', true); + } + /** * Append package documents * @param $data diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-product.php b/backend/app/plugins/wiaas/includes/class-wiaas-product.php index 9bddd4a..73f5a82 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-product.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-product.php @@ -70,6 +70,10 @@ class Wiaas_Product { return $args; } + + public static function get_supplier_id($product_id){ + return wp_get_post_terms($product_id, 'supplier', array('fields' => 'ids'))[0]; + } } Wiaas_Product::init(); \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/db-updates/data/wiaas-ui-field-bundle-properties.json b/backend/app/plugins/wiaas/includes/db-updates/data/wiaas-ui-field-bundle-properties.json index 6eaf16d..d5de4dc 100644 --- a/backend/app/plugins/wiaas/includes/db-updates/data/wiaas-ui-field-bundle-properties.json +++ b/backend/app/plugins/wiaas/includes/db-updates/data/wiaas-ui-field-bundle-properties.json @@ -46,6 +46,27 @@ "load_terms": 1, "return_format": "id", "multiple": 0 + }, + { + "key": "field_5bdb1512ab14f", + "label": "Additional days prior earliest installation", + "name": "additional_days_prior_earliest_installation", + "type": "number", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": 5, + "placeholder": "", + "prepend": "", + "append": "", + "min": 0, + "max": "", + "step": "" } ], "location": [