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:
+
+
+ Select ... ';
+
+ foreach($list_of_delivery_processes as $index => $process){
+ echo '' . $process['title'] . ' ';
+ }
+ echo '
+ ';
+ 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 '';
+ }
+ }
+
+ 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 @@
+
+
+
+ Estimated delivery date:
+ "
+ 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 @@
+
+
+
+
+
\ 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": [