You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
3.3 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
/* Simple shipping calculator example based on number of items in cart
*
* Needs to declare getName for the pref list, and getRates
*
* Declare the options you require in the constructor
* and the logic to caluculate the price etc (in this case) in getRate
*/
require_once 'lib/shipping/shippinglib.php';
class CustomShippingProvider_Example extends CustomShippingProvider
{
private $services;
public function __construct() // needs to be without params
{
$this->services = [
'standard' => [
'name' => tra('Standard Shipping'),
'description' => tra('3 to 5 working days'),
'zones' => [
'zone 1' => [ // $5 per package, more than 6 packages go free
'cost_per_item' => 9,
'max_total' => 45,
],
'zone 2' => [ // $20 per package, max 3
'cost_per_item' => 20,
'max_total' => 60,
],
],
],
'express' => [
'name' => tra('Express Shipping'),
'description' => tra('Next day delivery'),
'zones' => [
'zone 1' => [ // $20 per package, max 3
'cost_per_item' => 20,
'max_total' => 60,
],
'zone 2' => [ // $30 per package, max 3
'cost_per_item' => 30,
'max_total' => 90,
],
],
],
];
}
public function getName()
{
return tra('Custom Shipping Example');
}
public function getCurrency()
{
return 'USD';
}
public function getRates(array $from, array $to, array $packages)
{
if (! empty($to) && ! empty($packages)) {
$rates = [];
foreach ($this->services as $service => $info) {
$rates[] = $this->getRate($info, $from, $to, $packages);
}
return $rates;
} else {
return [];
}
}
private function getRate($service, array $from, array $to, array $packages)
{
$ret = [
'provider' => $this->getName(),
'currency' => $this->getCurrency(),
'service' => $service['name'],
'readable' => $service['description'],
];
$itemCount = 0;
foreach ($packages as $item) {
if (! empty($item['count'])) {
$itemCount += (int) $item['count'];
} else {
$itemCount++;
}
}
if (in_array(strtoupper($to['country']), [ 'AR', 'BO', 'BR', 'CL', 'CO', 'EC', 'FK', 'GF', 'GY', 'PY', 'PE', 'GS', 'SR', 'UY', 'VE' ])) {
$zone = $service['zones']['zone 2']; // zone 2 is South America
} else {
$zone = $service['zones']['zone 1'];
}
$ret['cost'] = min($itemCount * $zone['cost_per_item'], $zone['max_total']);
return $ret;
}
}