'Parcel Post',
'AUS_PARCEL_EXPRESS' => 'Express Post');
public function __construct(){
$this->id = 'auspost';
$this->method_title = __('Australian Post','australian-post');
$this->title = __('Australian Post','australian-post');
$this->init_form_fields();
$this->init_settings();
$this->enabled = $this->get_option('enabled');
$this->title = $this->get_option('title');
$this->api_key = $this->get_option('api_key');
$this->shop_post_code = $this->get_option('shop_post_code');
$this->default_weight = $this->get_option('default_weight');
$this->default_width = $this->get_option('default_width');
$this->default_length = $this->get_option('default_length');
$this->default_height = $this->get_option('default_height');
$this->show_duration = $this->get_option( 'show_duration' );
$this->debug_mode = $this->get_option('debug_mode');
add_action('woocommerce_update_options_shipping_'.$this->id, array($this, 'process_admin_options'));
}
public function init_form_fields(){
$dimensions_unit = strtolower( get_option( 'woocommerce_dimension_unit' ) );
$weight_unit = strtolower( get_option( 'woocommerce_weight_unit' ) );
$this->form_fields = array(
'enabled' => array(
'title' => __( 'Enable/Disable', 'woocommerce' ),
'type' => 'checkbox',
'label' => __( 'Enable Australian Post', 'woocommerce' ),
'default' => 'yes'
),
'title' => array(
'title' => __( 'Method Title', 'woocommerce' ),
'type' => 'text',
'description' => __( 'This controls the title', 'woocommerce' ),
'default' => __( 'Australian Post Shipping', 'woocommerce' ),
'desc_tip' => true,
),
'api_key' => array(
'title' => __( 'API Key', 'australian-post' ),
'type' => 'text',
'description' => __( 'Get your key from https://developers.auspost.com.au/apis/pacpcs-registration', 'australian-post' ),
'default' => $this->api_key
),
'shop_post_code' => array(
'title' => __( 'Shop Origin Post Code', 'australian-post' ),
'type' => 'text',
'description' => __( 'Enter your Shop postcode.', 'australian-post' ),
'default' => '2000',
'css' => 'width:100px;',
),
'default_weight' => array(
'title' => __( 'Default Package Weight', 'australian-post' ),
'type' => 'text',
'default' => '0.5',
'description' => __( $weight_unit , 'australian-post' ),
'css' => 'width:100px;',
),
'default_width' => array(
'title' => __( 'Default Package Width', 'australian-post' ),
'type' => 'text',
'default' => '5',
'description' => __( $dimensions_unit, 'australian-post' ),
'css' => 'width:100px;',
),
'default_height' => array(
'title' => __( 'Default Package Height', 'australian-post' ),
'type' => 'text',
'default' => '5',
'description' => __( $dimensions_unit, 'australian-post' ),
'css' => 'width:100px;',
),
'default_length' => array(
'title' => __( 'Default Package Length', 'australian-post' ),
'type' => 'text',
'default' => '10',
'description' => __( $dimensions_unit, 'australian-post' ),
'css' => 'width:100px;',
),
'debug_mode' => array(
'title' => __( 'Enable Debug Mode', 'woocommerce' ),
'type' => 'checkbox',
'label' => __( 'Enable ', 'woocommerce' ),
'default' => 'no',
'description' => __('If debug mode is enabled, the shipping method will be activated just for the administrator.'),
),
'show_duration' => array(
'title' => __( 'Delivery Time', 'woocommerce' ),
'type' => 'checkbox',
'label' => __( 'Enable ', 'woocommerce' ),
'default' => 'yes',
'description' => __( 'Show Delivery Time Estimation in the Checkout page.', 'woocommerce' ),
),
);
}
/**
* Admin Panel Options
* - Options for bits like 'title' and availability on a country-by-country basis
*
* @since 1.0.0
* @return void
*/
public function admin_options() {
?>
debug_mode == 'yes'): ?>
Notes:
- Weight and Size Guidlines from Australia Post.
- If you encountered any problem with the plugin, please do not hesitate submitting a support ticket.
- If you like the plugin please leave me a ★★★★★ rating. A huge thank you from me in advance!
debug_mode === 'yes'){
return current_user_can('administrator');
}
// The lite version doesn't support international shipping
if($package['destination']['country'] != 'AU') return false;
return true;
}
public function calculate_shipping( $package ){
$package_details = $this->get_package_details( $package );
$this->rates = array();
$weight = 0;
$length = 0;
$width = 0;
$height = 0;
$rates = array();
foreach($package_details as $pack){
$weight = $pack['weight'];
$height = $pack['height'];
$width = $pack['width'];
$length = $pack['length'];
$rates = $this->get_rates($rates, $pack['item_id'], $weight, $height, $width, $length, $package['destination']['postcode'] );
}
if(!empty($rates)){
foreach ($rates as $key => $rate) {
$this->add_rate($rate);
}
}
}
private function get_rates( $old_rates, $item_id, $weight, $height, $width, $length, $destination ){
$query_params['from_postcode'] = $this->shop_post_code;
$query_params['to_postcode'] = $destination;
$query_params['length'] = $length;
$query_params['width'] = $width;
$query_params['height'] = $height;
$query_params['weight'] = $weight;
foreach($this->supported_services as $service_key => $service_name):
$query_params['service_code'] = $service_key;
$response = wp_remote_get( $this->postageParcelURL.'?'.http_build_query($query_params),array('headers' => array('AUTH-KEY'=> $this->api_key)));
if(is_wp_error( $response )){
return array('error' => 'Unknown Problem. Please Contact the admin');
}
$aus_response = json_decode(wp_remote_retrieve_body($response));
if(!isset($aus_response->error)){
$duration = '';
if($this->show_duration === 'yes'){
$duration = ' ('. $aus_response->postage_result->delivery_time .')';
}
$old_rate = (isset($old_rates[$service_key]['cost']))?$old_rates[$service_key]['cost']:0;
// add the rate if the API request succeeded
$rates[$service_key] = array(
'id' => $service_key,
'label' => $this->title. ' ' . $aus_response->postage_result->service.' ' . $duration,
'cost' => ($aus_response->postage_result->total_cost ) + $old_rate,
);
// if the API returned any error, show it to the user
}else{
return array('error' => $aus_response->error->errorMessage);
}
endforeach;
return $rates;
}
/**
* get_min_dimension function.
* get the minimum dimension of the package, so we multiply it with the quantity
* @access private
* @param number $width
* @param number $length
* @param number $height
* @return string $result
*/
private function get_min_dimension($width, $length, $height){
$dimensions = array('width'=>$width,'length'=>$length,'height'=>$height);
$result = array_keys($dimensions, min($dimensions));
return $result[0];
}
/**
* get_package_details function.
*
* @access private
* @param mixed $package
* @return void
*/
private function get_package_details( $package ) {
global $woocommerce;
$parcel = array();
$requests = array();
$weight = 0;
$volume = 0;
$value = 0;
$products = array();
// Get weight of order
foreach ( $package['contents'] as $item_id => $values ) {
$weight += woocommerce_get_weight( (floatval($values['data']->get_weight())<=0 )?$this->default_weight:$values['data']->get_weight(), 'kg' ) * $values['quantity'];
$value += $values['data']->get_price() * $values['quantity'];
$length = woocommerce_get_dimension( ($values['data']->length=='')?$this->default_length:$values['data']->length, 'cm' );
$height = woocommerce_get_dimension( ($values['data']->height=='')?$this->default_height:$values['data']->height, 'cm' );
$width = woocommerce_get_dimension( ($values['data']->width=='')?$this->default_width:$values['data']->width, 'cm' );
$min_dimension = $this->get_min_dimension( $width, $length, $height );
//$$min_dimension = $$min_dimension * $values['quantity'];
$products[] = array('weight'=> woocommerce_get_weight( (floatval($values['data']->get_weight())<=0 )?$this->default_weight:$values['data']->get_weight(), 'kg' ),
'quantity'=> $values['quantity'],
'length'=> $length,
'height'=> $height,
'width'=> $width,
'item_id'=> $item_id,
);
$volume += ( $length * $height * $width );
}
$max_weight = $this->get_max_weight($package);
//if($weight > $max_weight){
$pack = array();
$packs_count = 1;
$pack[$packs_count]['weight'] = 0;
$pack[$packs_count]['length'] = 0;
$pack[$packs_count]['height'] = 0;
$pack[$packs_count]['width'] = 0;
//$pack[$packs_count]['quantity'] = 0;
foreach ($products as $product){
while ($product['quantity'] != 0) {
if(!isset($pack[$packs_count]['weight'])){
$pack[$packs_count]['weight'] = 0;
}
if(!isset($pack[$packs_count]['quantity'])){
//$pack[$packs_count]['quantity'] = 0;
}
$pack[$packs_count]['weight'] += $product['weight'];
$pack[$packs_count]['length'] =1;// $product['length'];
$pack[$packs_count]['height'] =1;// $product['height'];
$pack[$packs_count]['width'] =1;// $product['width'];
$pack[$packs_count]['item_id'] = $product['item_id'];
//$pack[$packs_count]['quantity'] += $product['quantity'];
if($pack[$packs_count]['weight'] > $max_weight ){
$pack[$packs_count]['weight'] -= $product['weight'];
//$pack[$packs_count]['quantity'] -= $product['quantity'];
$packs_count++;
$pack[$packs_count]['weight'] = $product['weight'];
$pack[$packs_count]['length'] =1;// $product['length'];
$pack[$packs_count]['height'] =1;// $product['height'];
$pack[$packs_count]['width'] =1;// $product['width'];
$pack[$packs_count]['item_id'] = $product['item_id'];
//$pack[$packs_count]['quantity'] = $product['quantity'];
}
$product['quantity']--;
}
}
//}
return $pack;
}
private function get_max_weight( $package){
$max = ( $package['destination']['country'] == 'AU' )? 22:20;
$store_unit = strtolower( get_option('woocommerce_weight_unit') );
if($store_unit == 'kg')
return $max;
if($store_unit == 'g')
return $max * 1000;
if($store_unit == 'lbs')
return $max * 0.453592;
if($store_unit == 'oz')
return $max * 0.0283495;
return $max;
}
}