id = 'wc_shipping_aramex';
$this->method_title = __( 'Aramex', 'woocommerce-shipping-aramex' );
$this->init();
$this->maybe_init_actions();
}
/**
* Make sure certain actions only run on the first instantiation of this class.
*
* @since 1.0.0
* @return void
*/
public function maybe_init_actions() {
if ( false === get_transient( $this->id . '_has_run_actions' ) ) {
if ( '' == $this->account_entity || '' == $this->account_number || '' == $this->account_pin || '' == $this->account_user_name || '' == $this->account_password ) {
// Display an admin notice if API credentials are required, and not on the shipping method screen itself.
add_action( 'admin_notices', array( $this, 'notice_specify_api_credentials' ) );
} else {
// Specify a method to run when the "aramex_pickup" AJAX event is fired.
add_action( 'wp_ajax_aramex_pickup', array( $this, 'ajax_pickup_callback' ) );
// Register a meta box to display order information from Aramex.
add_action( 'woocommerce_admin_order_data_after_order_details', array( $this, 'pickup_request_form' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
}
set_transient( $this->id . '_has_run_actions', '' );
} else {
delete_transient( $this->id . '_has_run_actions' );
}
}
/**
* Init.
*/
public function init() {
// Check for soap.
if ( ! class_exists( 'SoapClient' ) ) {
add_action( 'admin_notices', array( $this, 'notice_soap_error' ) );
}
$this->init_form_fields();
$this->init_settings();
$this->title = $this->get_option( 'title' );
$this->debug = $this->get_option( 'debug' );
$this->type = $this->get_option( 'type' );
$this->availability = $this->get_option( 'availability' );
$this->countries = $this->get_option( 'countries' );
$this->aramex_product_type = $this->get_option( 'aramex_product_type' );
$this->account_entity = $this->get_option( 'account_entity' );
$this->account_number = $this->get_option( 'account_number' );
$this->account_pin = $this->get_option( 'account_pin' );
$this->account_user_name = $this->get_option( 'account_user_name' );
$this->account_password = $this->get_option( 'account_password' );
$this->account_city = $this->get_option( 'account_city' );
$this->account_address1 = $this->get_option( 'account_address1' );
$this->account_address2 = $this->get_option( 'account_address2' );
$this->account_address3 = $this->get_option( 'account_address3' );
$this->account_province_code = $this->get_option( 'account_province_code' );
$this->account_post_code = $this->get_option( 'account_post_code' );
$this->pickup_open_time = $this->get_option( 'pickup_open_time' );
$this->pickup_close_time = $this->get_option( 'pickup_close_time' );
$this->pickup_contact_person_name = $this->get_option( 'pickup_contact_person_name' );
$this->pickup_contact_person_title = $this->get_option( 'pickup_contact_person_title' );
$this->pickup_contact_person_company = $this->get_option( 'pickup_contact_person_company' );
$this->pickup_contact_person_phone = $this->get_option( 'pickup_contact_person_phone' );
$this->pickup_contact_person_cell_phone = $this->get_option( 'pickup_contact_person_cell_phone' );
$this->pickup_contact_person_email = $this->get_option( 'pickup_contact_person_email' );
$this->enable_box_packing = $this->get_option( 'enable_box_packing' );
$this->test = $this->get_option( 'test' );
$this->boxes = isset( $this->settings['boxes'] ) ? $this->settings['boxes'] : array();
add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
if ( 'yes' === $this->debug ) {
$this->log = new WC_Logger();
}
}
/**
* Display an admin notice, if not on the shipping method screen and if the
* account isn't yet connected.
*
* @since 1.0.0
* @return void
*/
public function notice_specify_api_credentials() {
// Don't show these notices on our admin screen.
if ( ( isset( $_GET['page'] ) && ( 'woocommerce_settings' == $_GET['page'] || 'wc-settings' == $_GET['page'] ) ) && ( isset( $_GET['section'] ) && 'wc_shipping_aramex' == $_GET['section'] ) ) {
return;
}
$url = add_query_arg(
array(
'page' => 'wc-settings',
'tab' => 'shipping',
'section' => $this->id,
),
admin_url( 'admin.php' )
);
/* translators: 1) opening , 2) closing , 3) opening anchor tag to Aramex setting, and 4) closing anchor tag. */
echo '
' . sprintf( __( '%1$sWooCommerce Aramex is almost ready.%2$s To get started, %3$senter your Aramex account details%4$s.', 'woocommerce-shipping-aramex' ), '', ' ', '', ' ' ) . '
' . "\n";
}
/**
* Render SOAP notice.
*/
public function notice_soap_error() {
/* translators: 1) opening , 2) closing , 3) opening anchor tag to php.net, and 4) closing anchor tag. */
echo '' . sprintf( __( '%1$sYour server does not have the %3$sSOAP Client%4$s enabled.%2$s Please contact your web hosting provider and request that SOAP be enabled.', 'woocommerce-shipping-aramex' ), '', ' ', '', ' ' ) . '
' . "\n";
}
/**
* Render box packing form.
*/
public function generate_box_packing_html() {
ob_start();
include( 'views/html-box-packing.php' );
return ob_get_clean();
}
/**
* Validate box packing field.
*
* @return array Boxes.
*/
public function validate_box_packing_field() {
$boxes = array();
if ( isset( $_POST['aramex_boxes_outer_length'] ) ) {
$aramex_boxes_name = isset( $_POST['aramex_boxes_name'] ) ? $_POST['aramex_boxes_name'] : array();
$aramex_boxes_outer_length = $_POST['aramex_boxes_outer_length'];
$aramex_boxes_outer_width = $_POST['aramex_boxes_outer_width'];
$aramex_boxes_outer_height = $_POST['aramex_boxes_outer_height'];
$aramex_boxes_inner_length = $_POST['aramex_boxes_inner_length'];
$aramex_boxes_inner_width = $_POST['aramex_boxes_inner_width'];
$aramex_boxes_inner_height = $_POST['aramex_boxes_inner_height'];
$aramex_boxes_box_weight = $_POST['aramex_boxes_box_weight'];
$aramex_boxes_max_weight = $_POST['aramex_boxes_max_weight'];
for ( $i = 0; $i < sizeof( $aramex_boxes_outer_length ); $i ++ ) {
$has_outer_dimensions = (
$aramex_boxes_outer_length[ $i ]
&&
$aramex_boxes_outer_width[ $i ]
&&
$aramex_boxes_outer_height[ $i ]
);
$has_inner_dimensions = (
$aramex_boxes_inner_length[ $i ] &&
$aramex_boxes_inner_width[ $i ] &&
$aramex_boxes_inner_height[ $i ]
);
if ( $has_outer_dimensions && $has_inner_dimensions ) {
$boxes[] = array(
'name' => wc_clean( $aramex_boxes_name[ $i ] ),
'outer_length' => floatval( $aramex_boxes_outer_length[ $i ] ),
'outer_width' => floatval( $aramex_boxes_outer_width[ $i ] ),
'outer_height' => floatval( $aramex_boxes_outer_height[ $i ] ),
'inner_length' => floatval( $aramex_boxes_inner_length[ $i ] ),
'inner_width' => floatval( $aramex_boxes_inner_width[ $i ] ),
'inner_height' => floatval( $aramex_boxes_inner_height[ $i ] ),
'box_weight' => floatval( $aramex_boxes_box_weight[ $i ] ),
'max_weight' => floatval( $aramex_boxes_max_weight[ $i ] ),
);
}
}
}
return $boxes;
}
/**
* Register form fields for Aramex setting.
*/
public function init_form_fields() {
/* translators: placeholders are opening and closing anchor tags. */
$product_type_description = __( 'For international shipping. The product type involves the specification of certain features concerning the delivery of the product such as: Priority, Time Sensitivity, and whether it is a Document or Non-Document.' , 'woocommerce-shipping-aramex' );
$product_type_description .= ' ';
/* translators: placeholders are opening and closing anchor tags. */
$product_type_description .= sprintf( __( '%1$sView the differences between each of the product types.%2$s', 'woocommerce-shipping-aramex' ), '', ' ' );
$this->form_fields = array(
'enabled' => array(
'title' => __( 'Enable/Disable', 'woocommerce-shipping-aramex' ),
'type' => 'checkbox',
'label' => __( 'Enable this shipping method', 'woocommerce-shipping-aramex' ),
'default' => 'no',
),
'test' => array(
'title' => __( 'Test Mode', 'woocommerce-shipping-aramex' ),
'type' => 'checkbox',
'label' => __( 'Enabled', 'woocommerce-shipping-aramex' ),
'default' => 'yes',
),
'title' => array(
'title' => __( 'Method Title', 'woocommerce-shipping-aramex' ),
'type' => 'text',
'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce-shipping-aramex' ),
'default' => __( 'Aramex Shipping Delivery', 'woocommerce-shipping-aramex' ),
'desc_tip' => true,
),
'availability' => array(
'title' => __( 'Availability', 'woocommerce-shipping-aramex' ),
'type' => 'select',
'class' => 'availability_select',
'description' => '',
'default' => 'including',
'options' => array(
'all' => __( 'All Countries', 'woocommerce-shipping-aramex' ),
'including' => __( 'Selected countries', 'woocommerce-shipping-aramex' ),
'excluding' => __( 'Excluding selected countries', 'woocommerce-shipping-aramex' ),
),
),
'countries' => array(
'title' => __( 'Countries', 'woocommerce-shipping-aramex' ),
'type' => 'multiselect',
'class' => 'chosen_select availability_countries_select',
'css' => 'width: 450px;',
'default' => '',
'options' => WC()->countries->get_allowed_countries(),
),
'aramex_product_type' => array(
'title' => __( 'Aramex Product Type', 'woocommerce-shipping-aramex' ),
'type' => 'select',
'description' => $product_type_description,
'default' => 'PDX',
'options' => array(
'PDX' => __( 'Priority Document', 'woocommerce-shipping-aramex' ),
'PPX' => __( 'Priority Parcel', 'woocommerce-shipping-aramex' ),
'PLX' => __( 'Priority Letter', 'woocommerce-shipping-aramex' ),
'DDX' => __( 'Deferred Document', 'woocommerce-shipping-aramex' ),
'DPX' => __( 'Deferred Parcel', 'woocommerce-shipping-aramex' ),
'GDX' => __( 'Ground Document', 'woocommerce-shipping-aramex' ),
'GPX' => __( 'Ground Parcel', 'woocommerce-shipping-aramex' ),
),
),
'client_account_info' => array(
'title' => __( 'Aramex Account Info', 'woocommerce-shipping-aramex' ),
'type' => 'title',
),
'account_entity' => array(
'title' => __( 'Account Entity', 'woocommerce-shipping-aramex' ),
'type' => 'text',
'description' => __( 'Identification Code/Number for Transmitting Party. This code should be provided to you by Aramex.', 'woocommerce-shipping-aramex' ),
'desc_tip' => false,
),
'account_number' => array(
'title' => __( 'Account Number', 'woocommerce-shipping-aramex' ),
'type' => 'text',
'description' => __( 'The Customer’s Account number provided by Aramex when the contract is signed.', 'woocommerce-shipping-aramex' ),
'desc_tip' => false,
),
'account_pin' => array(
'title' => __( 'Account Pin', 'woocommerce-shipping-aramex' ),
'type' => 'text',
'description' => __( 'A key that is given to account customers associated with the account number, so as to validate customer identity.', 'woocommerce-shipping-aramex' ),
'desc_tip' => false,
),
'account_user_name' => array(
'title' => __( 'User Name', 'woocommerce-shipping-aramex' ),
'type' => 'text',
'description' => __( 'A unique user name sent to the customer upon registration with Aramex.', 'woocommerce-shipping-aramex' ),
'desc_tip' => false,
),
'account_password' => array(
'title' => __( 'Password', 'woocommerce-shipping-aramex' ),
'type' => 'text',
'description' => __( 'A unique password to verify the user name, sent to the client upon registration with Aramex.', 'woocommerce-shipping-aramex' ),
'desc_tip' => false,
),
'location_Address' => array(
'title' => __( 'Address', 'woocommerce-shipping-aramex' ),
'type' => 'title',
),
'account_city' => array(
'title' => __( 'City', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'account_address1' => array(
'title' => __( 'Address1', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'account_address2' => array(
'title' => __( 'Address2', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'account_address3' => array(
'title' => __( 'Address3', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'account_province_code' => array(
'title' => __( 'State Or Province Code', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'account_post_code' => array(
'title' => __( 'Post Code', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'pickup_details' => array(
'title' => __( 'Pickup Details', 'woocommerce-shipping-aramex' ),
'type' => 'title',
),
'pickup_open_time' => array(
'title' => __( 'Open Time', 'woocommerce-shipping-aramex' ),
'type' => 'select',
'description' => __( 'The time your store is open for pickup.', 'woocommerce-shipping-aramex' ),
'options' => $this->_get_time_options(),
),
'pickup_close_time' => array(
'title' => __( 'Close Time', 'woocommerce-shipping-aramex' ),
'type' => 'select',
'description' => __( 'The time your store closes and isn\'t available for pickup.', 'woocommerce-shipping-aramex' ),
'options' => $this->_get_time_options(),
),
'pickup_contact_person' => array(
'title' => __( 'Pickup Contact Person', 'woocommerce-shipping-aramex' ),
'type' => 'title',
),
'pickup_contact_person_name' => array(
'title' => __( 'Contact Person Name', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'pickup_contact_person_title' => array(
'title' => __( 'Contact Person Title', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'pickup_contact_person_company' => array(
'title' => __( 'Contact Person Company', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'pickup_contact_person_phone' => array(
'title' => __( 'Contact Person Phone', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'pickup_contact_person_cell_phone' => array(
'title' => __( 'Contact Person Cell Phone', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'pickup_contact_person_email' => array(
'title' => __( 'Contact Person Email', 'woocommerce-shipping-aramex' ),
'type' => 'text',
),
'enable_box_packing_title' => array(
'title' => __( 'Box Packing', 'woocommerce-shipping-aramex' ),
'type' => 'title',
),
'enable_box_packing' => array(
'title' => __( 'Enable Box Packing', 'woocommerce-shipping-aramex' ),
'type' => 'checkbox',
'label' => __( 'Enable', 'woocommerce-shipping-aramex' ),
'default' => 'no',
'class' => 'enable_box_packing',
),
'boxes' => array(
'type' => 'box_packing',
'class' => 'box_packing_html',
),
'enable_debug_title' => array(
'title' => __( 'Debug', 'woocommerce-shipping-aramex' ),
'type' => 'title',
),
'debug' => array(
'title' => __( 'Debug Log', 'woocommerce-shipping-aramex' ),
'type' => 'checkbox',
'label' => __( 'Enable logging', 'woocommerce-shipping-aramex' ),
'default' => 'no',
/* translators: log pathfile. */
'description' => sprintf( __( 'Log Aramex events, such as API requests, inside %s', 'woocommerce-shipping-aramex' ), 'woocommerce/logs/' . $this->id . '-' . sanitize_file_name( wp_hash( $this->id ) ) . '.txt
' ),
),
);
}
/**
* Generate an array of available time options.
*
* @since 1.0.0
* @return array Time options.
*/
private function _get_time_options() {
$response = array();
for ( $i = 0; $i <= 23; $i++ ) {
$value = str_pad( $i, 2, '0', STR_PAD_LEFT );
$response[ $value . ':00' ] = $value . ':00';
$response[ $value . ':15' ] = $value . ':15';
$response[ $value . ':30' ] = $value . ':30';
$response[ $value . ':45' ] = $value . ':45';
}
return $response;
}
/**
* Check whether this shipping method is available or not.
*
* @param array $package Package.
*
* @return bool Returns true if available.
*/
public function is_available( $package ) {
global $woocommerce;
if ( 'no' === $this->enabled ) {
return false;
}
if ( 'including' === $this->availability ) {
if ( is_array( $this->countries ) ) {
if ( ! in_array( $package['destination']['country'], $this->countries ) ) {
return false;
}
}
} elseif ( 'excluding' === $this->availability ) {
if ( is_array( $this->countries ) ) {
if ( in_array( $package['destination']['country'], $this->countries ) ) {
return false;
}
}
}
return apply_filters( 'woocommerce_shipping_' . $this->id . '_is_available', true );
}
/**
* Render the admin settings.
*/
public function admin_options() {
?>
method_title ); ?>
Note: the SOAP extension must be loaded for Aramex shipping to work. Contact your hosting company, ISP or systems administrator and request that the soap extension be activated.
WC()->countries->get_base_country(),
'AccountEntity' => $this->account_entity,
'AccountNumber' => $this->account_number,
'AccountPin' => $this->account_pin,
'UserName' => $this->account_user_name,
'Password' => $this->account_password,
'Version' => 'V1.0',
);
}
/**
* Get test client info.
*
* @return array Client info.
*/
public function get_test_client_info() {
return array(
'AccountCountryCode' => 'JO',
'AccountEntity' => 'AMM',
'AccountNumber' => '20016',
'AccountPin' => '331421',
'UserName' => 'testingapi@aramex.com',
'Password' => 'R123456789$r',
'Version' => 'v1.0',
);
}
/**
* Get parameters for origin address when requesting rates calculation.
*
* @return array Origin address.
*/
public function rates_get_origin_address() {
return array(
'Line1' => $this->account_address1,
'Line2' => $this->account_address2,
'Line3' => $this->account_address3,
'City' => $this->account_city,
'StateOrProvinceCode' => $this->account_province_code,
'PostCode' => $this->account_post_code,
'CountryCode' => WC()->countries->get_base_country(),
);
}
/**
* Exchange rates calculator
*
* @param array $params Request params.
*
* @return mixed Response.
*/
public function calculate_rates( $params ) {
try {
$params['ClientInfo'] = $this->get_client_info();
$params['OriginAddress'] = $this->rates_get_origin_address();
$soap_client = new SoapClient(
WC_Aramex()->plugin_dir . '/wsdl/aramex-rates-calculator-wsdl.wsdl',
array(
'trace' => 1,
)
);
$results = $soap_client->CalculateRate( $params );
return $results;
} catch ( SoapFault $fault ) {
return null;
}
}
/**
* Get pickup address parameters.
*
* @return array Pick address.
*/
public function get_pickup_address() {
return array(
'Line1' => $this->account_address1,
'Line2' => $this->account_address2,
'Line3' => $this->account_address3,
'City' => $this->account_city,
'StateOrProvinceCode' => $this->account_province_code,
'PostCode' => $this->account_post_code,
'CountryCode' => WC()->countries->get_base_country(),
);
}
/**
* Get pickup contact parameters.
*
* @return array Pickup contact.
*/
public function get_pickup_contact() {
return array(
'Department' => '',
'PersonName' => $this->pickup_contact_person_name,
'Title' => $this->pickup_contact_person_title,
'CompanyName' => $this->pickup_contact_person_company,
'PhoneNumber1' => $this->pickup_contact_person_phone,
'PhoneNumber1Ext' => '',
'PhoneNumber2' => '',
'PhoneNumber2Ext' => '',
'FaxNumber' => '',
'CellPhone' => $this->pickup_contact_person_cell_phone,
'EmailAddress' => $this->pickup_contact_person_email,
'Type' => '',
);
}
/**
* Handles pickup AJAX.
*/
public function ajax_pickup_callback() {
try {
$order_id = $_POST['order_id'];
$order = wc_get_order( $order_id );
$pickup_date = new DateTime( urldecode( $_POST['pickup_date'] ) );
// Check for product group.
$product_group = 'DOM';
$product_type = 'ONP';
if ( WC()->countries->get_base_country() !== $order->shipping_country ) {
$product_group = 'EXP';
$product_type = $this->aramex_product_type;
}
$params = array(
'Transaction' => array(
'Reference1' => time(),
'Reference2' => '',
'Reference3' => '',
'Reference4' => '',
'Reference5' => '',
),
'LabelInfo' => array(
'ReportID' => 9201,
'ReportType' => 'URL',
),
'Pickup' => array(
'PickupAddress' => $this->get_pickup_address(),
'PickupContact' => $this->get_pickup_contact(),
'PickupLocation' => 'Reception',
'PickupDate' => date_format( $pickup_date, DATE_W3C ),
'Comments' => '',
'Reference1' => 'Ref Pickup ' . time(),
'Reference2' => '',
'Vehicle' => '',
'Status' => 'Ready',
'PickupItems' => array(
array(
'ProductGroup' => $product_group,
'ProductType' => $product_type,
'Payment' => 'P',
'NumberOfPieces' => $order->get_item_count(),
'NumberOfShipments' => 1,
'PackageType' => '',
'Comments' => '',
),
),
),
);
$params['ClientInfo'] = ( 'yes' === $this->test )
? $this->get_test_client_info()
: $this->get_client_info();
$params['Pickup']['LastPickupTime'] = date_format( $pickup_date, DATE_W3C );
// Get close & start time.
$close_time = $this->pickup_close_time;
$close_time_h = 00;
$close_time_m = 00;
$close_time_array = explode( ':', $close_time );
if ( isset( $close_time_array['0'] ) ) {
$close_time_h = $close_time_array['0'];
}
if ( isset( $close_time_array['1'] ) ) {
$close_time_m = $close_time_array['1'];
}
$open_time = $this->pickup_open_time;
$open_time_h = 00;
$open_time_m = 00;
$open_time_array = explode( ':', $open_time );
if ( isset( $open_time_array['0'] ) ) {
$open_time_h = $open_time_array['0'];
}
if ( isset( $open_time_array['1'] ) ) {
$open_time_m = $open_time_array['1'];
}
$pickup_date->setTime( $open_time_h, $open_time_m, 00 );
$params['Pickup']['ReadyTime'] = date_format( $pickup_date, DATE_W3C );
$pickup_date->setTime( $close_time_h, $close_time_m, 00 );
$params['Pickup']['ClosingTime'] = date_format( $pickup_date, DATE_W3C );
$soap_client = new SoapClient(
WC_Aramex()->plugin_dir . '/wsdl/shipping-services-api-wsdl.wsdl',
array(
'trace' => 1,
)
);
if ( 'yes' === $this->test ) {
$soap_client->__setLocation( 'http://ws.dev.aramex.net/shippingapi/shipping/service_1_0.svc' );
} else {
$soap_client->__setLocation( 'http://ws.aramex.net/shippingapi/shipping/service_1_0.svc' );
}
$results = $soap_client->CreatePickup( $params );
// Check for error.
if ( empty( $results->HasErrors ) ) {
update_post_meta( $order_id, '_pickup_id', $results->ProcessedPickup->ID );
update_post_meta( $order_id, '_pickup_guid', $results->ProcessedPickup->GUID );
_e( 'done', 'woocommerce-shipping-aramex' );
} else {
$errors = array();
if ( is_array( $results->Notifications->Notification ) ) {
foreach ( $results->Notifications->Notification as $error ) {
$errors[] = $error->Message;
}
} else {
$errors[] = $results->Notifications->Notification->Message;
}
echo json_encode( $errors );
}
} catch ( Exception $e ) {
echo json_encode( array(
$e->getMessage(),
) );
}
die();
}
/**
* Calculate shipping for a given package.
*
* @param array $package Package to calculate the cost.
*/
public function calculate_shipping( $package = array() ) {
if ( 'yes' === $this->debug ) {
/* translators: placeholder is shipping method's title. */
$this->log->add( $this->id, sprintf( __( '%s: Enter calculate shipping function.', 'woocommerce-shipping-aramex' ), $this->method_title ) );
}
// Get dimensions.
$length = array();
$width = array();
$height = array();
$total_weight = WC()->cart->cart_contents_weight;
$total_volume = 0;
$boxes = $this->boxes;
foreach ( WC()->cart->get_cart() as $package ) {
$item = wc_get_product( $package['product_id'] );
if ( $item->has_dimensions() ) {
$w = $item->get_width();
$h = $item->get_height();
$l = $item->get_length();
$total_volume += $w * $h * $l * $package['quantity'];
$length[] = $l;
$width[] = $w;
$height[] = $h;
$default_height[] = $h * $package['quantity'];
} else {
if ( $this->debug ) {
/* translators: item is item's title */
wc_add_notice( sprintf( __( 'There is no dimension for product %s .', 'woocommerce-shipping-aramex' ), $item->get_title() ), 'error' );
}
}
// Check for weight.
if ( ! $item->get_weight() && 'yes' === $this->debug ) {
/* translators: item is item's title */
$this->log->add( $this->id, sprintf( __( 'There is no weight for product %s .', 'woocommerce-shipping-aramex' ), $item->get_title() ) );
}
}
// Check for dimensions.
if ( count( $width ) == 0 || count( $length ) == 0 || count( $height ) == 0 ) {
if ( 'yes' === $this->debug ) {
$this->log->add( $this->id, __( 'There is no dimension for shippment.', 'woocommerce-shipping-aramex' ) );
}
}
// Check for weight.
if ( WC()->cart->cart_contents_weight == 0 ) {
if ( 'yes' == $this->debug ) {
$this->log->add( $this->id, __( 'There is no weight for shippment.', 'woocommerce-shipping-aramex' ) );
}
}
// Check for product group.
$product_group = 'DOM';
$product_type = 'OND';
if ( WC()->customer->get_shipping_country() != WC()->countries->get_base_country() ) {
$product_group = 'EXP';
$product_type = $this->aramex_product_type;
}
$params = array(
'Transaction' => array(
'Reference1' => time(),
),
'DestinationAddress' => array(
'Line1' => WC()->customer->get_shipping_address(),
'Line2' => WC()->customer->get_shipping_address_2(),
'City' => WC()->customer->get_shipping_city(),
'StateOrProvinceCode' => WC()->customer->get_shipping_state(),
'PostCode' => WC()->customer->get_shipping_postcode(),
'CountryCode' => WC()->customer->get_shipping_country(),
),
'ShipmentDetails' => array(
'PaymentType' => 'P',
'ProductGroup' => $product_group,
'ProductType' => $product_type,
'NumberOfPieces' => WC()->cart->cart_contents_count,
'Dimensions' => array(),
),
);
// Check if box packing enabled.
if ( 'yes' === $this->enable_box_packing ) {
// Check for box.
$fit_box_index = null;
foreach ( $boxes as $key => $box ) {
$box_max_weight = $box['max_weight'];
$box_volume = $box['inner_length'] * $box['inner_width'] * $box['inner_height'];
// Check if bix fit for weight & volume.
if ( $box_max_weight >= $total_weight && $box_volume >= $total_volume ) {
// Check if box fit for dimensions.
if ( $box['inner_length'] >= max( $length ) && $box['inner_width'] >= max( $width ) && $box['inner_height'] >= max( $height ) || $box['inner_length'] >= max( $length ) && $box['inner_width'] >= max( $height ) && $box['inner_height'] >= max( $width ) ) {
$fit_box_index = $key;
break;
}
}
}
if ( isset( $boxes[ $fit_box_index ] ) ) {
$fit_box = $boxes[ $fit_box_index ];
$params['ShipmentDetails']['ActualWeight'] = array(
'Value' => WC()->cart->cart_contents_weight + $fit_box['box_weight'],
'Unit' => get_option( 'woocommerce_weight_unit' ),
);
$params['ShipmentDetails']['ChargeableWeight'] = array(
'Value' => WC()->cart->cart_contents_weight + $fit_box['box_weight'],
'Unit' => get_option( 'woocommerce_weight_unit' ),
);
$params['ShipmentDetails']['Dimensions']['Length'] = $fit_box['outer_length'];
$params['ShipmentDetails']['Dimensions']['Width'] = $fit_box['outer_width'];
$params['ShipmentDetails']['Dimensions']['Height'] = $fit_box['outer_height'];
$params['ShipmentDetails']['Dimensions']['Unit'] = get_option( 'woocommerce_dimension_unit' );
$results = $this->calculate_rates( $params );
if ( ! is_null( $results ) && empty( $results->HasErrors ) ) {
$rate = array(
'id' => $this->id,
'label' => $this->title,
'cost' => empty( $results->TotalAmount->Value ) ? 0.0 : $results->TotalAmount->Value,
'calc_tax' => 'per_item',
);
// Register the rate.
$this->add_rate( $rate );
} else {
if ( 'yes' === $this->debug ) {
/* translators: placeholder is dumped response from API. */
$this->log->add( $this->id, sprintf( __( 'Response: %s', 'woocommerce-shipping-aramex' ), print_r( $results, true ) ) );
}
}
} else {
$params['ShipmentDetails']['ActualWeight'] = array(
'Value' => WC()->cart->cart_contents_weight,
'Unit' => get_option( 'woocommerce_weight_unit' ),
);
$params['ShipmentDetails']['ChargeableWeight'] = array(
'Value' => WC()->cart->cart_contents_weight,
'Unit' => get_option( 'woocommerce_weight_unit' ),
);
$params['ShipmentDetails']['Dimensions']['Length'] = max( $length );
$params['ShipmentDetails']['Dimensions']['Width'] = max( $width );
$params['ShipmentDetails']['Dimensions']['Height'] = array_sum( $default_height );
$params['ShipmentDetails']['Dimensions']['Unit'] = get_option( 'woocommerce_dimension_unit' );
$results = $this->calculate_rates( $params );
if ( ! is_null( $results ) && empty( $results->HasErrors ) ) {
$rate = array(
'id' => $this->id,
'label' => $this->title,
'cost' => empty( $results->TotalAmount->Value ) ? 0.0 : $results->TotalAmount->Value,
'calc_tax' => 'per_item',
);
// Register the rate.
$this->add_rate( $rate );
} else {
if ( 'yes' === $this->debug ) {
/* translators: placeholder is dumped response from API. */
$this->log->add( $this->id, sprintf( __( 'Response: %s', 'woocommerce-shipping-aramex' ), print_r( $results, true ) ) );
}
}
}
} else {
$params['ShipmentDetails']['ActualWeight'] = array(
'Value' => WC()->cart->cart_contents_weight,
'Unit' => get_option( 'woocommerce_weight_unit' ),
);
$params['ShipmentDetails']['ChargeableWeight'] = array(
'Value' => WC()->cart->cart_contents_weight,
'Unit' => get_option( 'woocommerce_weight_unit' ),
);
$params['ShipmentDetails']['Dimensions']['Length'] = max( $length );
$params['ShipmentDetails']['Dimensions']['Width'] = max( $width );
$params['ShipmentDetails']['Dimensions']['Height'] = array_sum( $default_height );
$params['ShipmentDetails']['Dimensions']['Unit'] = get_option( 'woocommerce_dimension_unit' );
$results = $this->calculate_rates( $params );
if ( ! is_null( $results ) && empty( $results->HasErrors ) ) {
$rate = array(
'id' => $this->id,
'label' => $this->title,
'cost' => empty( $results->TotalAmount->Value ) ? 0.0 : $results->TotalAmount->Value,
'calc_tax' => 'per_item',
);
// Register the rate.
$this->add_rate( $rate );
} else {
if ( 'yes' == $this->debug ) {
/* translators: placeholder is dumped response from API. */
$this->log->add( $this->id, sprintf( __( 'Response: %s', 'woocommerce-shipping-aramex' ), print_r( $results, true ) ) );
}
}
}
}
/**
* Render pickup request form in admin order screen.
*
* @param WC_Order $order Current order instance.
*/
public function pickup_request_form( $order ) {
// Check if pickup exist.
$pickup_id = get_post_meta( $order->ID, '_pickup_id', true );
$pickup_guid = get_post_meta( $order->ID, '_pickup_guid', true );
?>
@
: