Provide rate quotes back as objects

pull/3/head
Troy Davisson 10 years ago
parent 6d42cd1273
commit 1f98232ac0

@ -9,7 +9,9 @@
"email": "pdt256@gmail.com"
}
],
"require": {},
"require": {
"nesbot/carbon": "1.*"
},
"require-dev": {
"phpunit/phpunit": "4.0.*"
},

@ -1,8 +1,10 @@
<?php
namespace pdt256\Shipping\Fedex;
use Carbon\Carbon;
use pdt256\Shipping;
use pdt256\Shipping\Arr;
use pdt256\Shipping\Quote;
use pdt256\Shipping\RateAdapter;
use pdt256\Shipping\RateRequest;
use DOMDocument;
@ -220,13 +222,18 @@ class Rate extends RateAdapter
->getElementsByTagName('TotalNetCharge')->item(0)
->getElementsByTagName('Amount')->item(0)->nodeValue;
$this->rates[] = array(
'code' => $code,
'name' => $name,
'cost' => (int) $cost * 100,
'delivery_ts' => $delivery_ts,
'transit_time' => $transit_time,
);
$quote = new Quote;
$quote
->setCarrier('fedex')
->setCode($code)
->setName($name)
->setCost((int) $cost * 100)
->setTransitTime($transit_time);
if ($delivery_ts) {
$quote->setDeliveryEstimate(new Carbon($delivery_ts));
}
$this->rates[] = $quote;
}
return $this;

@ -0,0 +1,123 @@
<?php namespace pdt256\Shipping;
use Carbon\Carbon;
class Quote
{
protected $code;
protected $name;
protected $cost;
protected $transit_time;
protected $delivery_ts;
protected $carrier;
/**
* @return mixed
*/
public function getCarrier()
{
return $this->carrier;
}
/**
* @param mixed $carrier
* @return $this
*/
public function setCarrier($carrier)
{
$this->carrier = $carrier;
return $this;
}
/**
* @return mixed
*/
public function getCode()
{
return $this->code;
}
/**
* @param string $code
* @return $this
*/
public function setCode($code)
{
$this->code = $code;
return $this;
}
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
/**
* @param string $name
* @return $this
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* @return mixed
*/
public function getCost()
{
return $this->cost;
}
/**
* Quoted cost of this service, in pennies
*
* @param int $cost
* @return $this
*/
public function setCost($cost)
{
$this->cost = $cost;
return $this;
}
/**
* @return mixed
*/
public function getTransitTime()
{
return $this->transit_time;
}
/**
* @param mixed $transit_time
* @return $this
*/
public function setTransitTime($transit_time)
{
$this->transit_time = $transit_time;
return $this;
}
/**
* @return mixed
*/
public function getDeliveryEstimate()
{
return $this->delivery_ts;
}
/**
* @param Carbon $estimate
* @return $this
*/
public function setDeliveryEstimate(Carbon $estimate)
{
$this->delivery_ts = $estimate;
return $this;
}
}

@ -43,11 +43,11 @@ abstract class RateAdapter
->process()
->sort_by_cost();
return $this->rates;
return array_values($this->rates);
}
protected function sort_by_cost()
{
uasort($this->rates, create_function('$a, $b', 'return ($a["cost"] > $b["cost"]);'));
uasort($this->rates, create_function('$a, $b', 'return ($a->getCost() > $b->getCost());'));
}
}

@ -88,13 +88,13 @@ class Ship
foreach ($rates[$carrier] as $row3) {
if (in_array($row3['code'], $group_codes)) {
$row3['carrier'] = $carrier;
if (in_array($row3->getCode(), $group_codes)) {
$row3->setCarrier($carrier);
if ($cheapest_row === NULL) {
$cheapest_row = $row3;
} else {
if ($row3['cost'] < $cheapest_row['cost']) {
if ($row3->getCost() < $cheapest_row->getCost()) {
$cheapest_row = $row3;
}
}
@ -126,8 +126,8 @@ class Ship
foreach ($rates[$carrier] as $row3) {
if (in_array($row3['code'], $group_codes)) {
$row3['carrier'] = $carrier;
if (in_array($row3->getCode(), $group_codes)) {
$row3->setCarrier($carrier);
$display_rates[$shipping_group][] = $row3;
}
}
@ -142,6 +142,6 @@ class Ship
protected function sort_by_cost( & $rates)
{
uasort($rates, create_function('$a, $b', 'return ($a["cost"] > $b["cost"]);'));
uasort($rates, create_function('$a, $b', 'return ($a->getCost() > $b->getCost());'));
}
}

@ -3,6 +3,7 @@ namespace pdt256\Shipping\UPS;
use pdt256\Ship;
use pdt256\Shipping\Arr;
use pdt256\Shipping\Quote;
use pdt256\Shipping\RateAdapter;
use pdt256\Shipping\RateRequest;
use DOMDocument;
@ -233,11 +234,13 @@ class Rate extends RateAdapter
continue;
}
$this->rates[] = array(
'code' => $code,
'name' => $name,
'cost' => (int) $cost * 100,
);
$quote = new Quote;
$quote
->setCarrier('ups')
->setCode($code)
->setName($name)
->setCost((int) $cost * 100);
$this->rates[] = $quote;
}
return $this;

@ -3,6 +3,7 @@ namespace pdt256\Shipping\USPS;
use pdt256\Shipping;
use pdt256\Shipping\Arr;
use pdt256\Shipping\Quote;
use pdt256\Shipping\RateAdapter;
use pdt256\Shipping\RateRequest;
use DOMDocument;
@ -178,6 +179,7 @@ class Rate extends RateAdapter
throw $e;
}
/** @var Quote[] $rates */
$rates = [];
foreach ($postage_list as $postage) {
@ -191,16 +193,19 @@ class Rate extends RateAdapter
}
if (array_key_exists($code, $rates)) {
$cost = $rates[$code]['cost'] + ($cost * 100);
$cost = $rates[$code]->getCost() + ($cost * 100);
} else {
$cost = $cost * 100;
}
$rates[$code] = [
'code' => $code,
'name' => $name,
'cost' => (int) $cost,
];
$quote = new Quote;
$quote
->setCarrier('usps')
->setCode($code)
->setName($name)
->setCost((int) $cost);
$rates[$quote->getCode()] = $quote;
}
$this->rates = array_values($rates);

@ -1,5 +1,7 @@
<?php
use Carbon\Carbon;
use pdt256\Shipping\Package;
use pdt256\Shipping\Quote;
use pdt256\Shipping\Ship;
use pdt256\Shipping\Shipment;
use pdt256\Shipping\USPS;
@ -123,18 +125,23 @@ class ShipTest extends PHPUnit_Framework_TestCase
$usps = new USPS\Rate($this->getUSPSOptions());
$usps_rates = $usps->get_rates();
$this->assertEquals(json_encode([
1 => [
'code' => '4',
'name' => 'Parcel Post',
'cost' => 1001,
],
0 => [
'code' => '1',
'name' => 'Priority Mail',
'cost' => 1220,
],
]), json_encode($usps_rates));
$post = new Quote;
$post
->setCarrier('usps')
->setCode(4)
->setName('Parcel Post')
->setCost(1001);
$priority = new Quote;
$priority
->setCarrier('usps')
->setCode(1)
->setName('Priority Mail')
->setCost(1220);
$expected_return = [$post, $priority];
$this->assertEquals($expected_return, $usps_rates);
}
public function testUPSRate()
@ -142,28 +149,37 @@ class ShipTest extends PHPUnit_Framework_TestCase
$ups = new UPS\Rate($this->getUPSOptions());
$ups_rates = $ups->get_rates();
$this->assertEquals(json_encode([
0 => [
'code' => '03',
'name' => 'UPS Ground',
'cost' => 1900,
],
1 => [
'code' => '02',
'name' => 'UPS 2nd Day Air',
'cost' => 4900,
],
2 => [
'code' => '13',
'name' => 'UPS Next Day Air Saver',
'cost' => 8900,
],
3 => [
'code' => '01',
'name' => 'UPS Next Day Air',
'cost' => 9300,
],
]), json_encode($ups_rates));
$ground = new Quote;
$ground
->setCarrier('ups')
->setCode('03')
->setName('UPS Ground')
->setCost(1900);
$twodayair = new Quote;
$twodayair
->setCarrier('ups')
->setCode('02')
->setName('UPS 2nd Day Air')
->setCost(4900);
$nextdaysaver = new Quote;
$nextdaysaver
->setCarrier('ups')
->setCode('13')
->setName('UPS Next Day Air Saver')
->setCost(8900);
$nextdayair = new Quote;
$nextdayair
->setCarrier('ups')
->setCode('01')
->setName('UPS Next Day Air')
->setCost(9300);
$expected_return = [$ground, $twodayair, $nextdaysaver, $nextdayair];
$this->assertEquals($expected_return, $ups_rates);
}
public function testFedexRate()
@ -171,36 +187,44 @@ class ShipTest extends PHPUnit_Framework_TestCase
$fedex = new Fedex\Rate($this->getFedexOptions());
$fedex_rates = $fedex->get_rates();
$this->assertEquals(json_encode([
3 => [
'code' => 'GROUND_HOME_DELIVERY',
'name' => 'Ground Home Delivery',
'cost' => 1600,
'delivery_ts' => NULL,
'transit_time' => 'THREE_DAYS',
],
2 => [
'code' => 'FEDEX_EXPRESS_SAVER',
'name' => 'Fedex Express Saver',
'cost' => 2900,
'delivery_ts' => '2014-09-30T20:00:00',
'transit_time' => NULL,
],
1 => [
'code' => 'FEDEX_2_DAY',
'name' => 'Fedex 2 Day',
'cost' => 4000,
'delivery_ts' => '2014-09-29T20:00:00',
'transit_time' => NULL,
],
0 => [
'code' => 'STANDARD_OVERNIGHT',
'name' => 'Standard Overnight',
'cost' => 7800,
'delivery_ts' => '2014-09-26T20:00:00',
'transit_time' => NULL,
],
]), json_encode($fedex_rates));
$ground = new Quote;
$ground
->setCarrier('fedex')
->setCode('GROUND_HOME_DELIVERY')
->setName('Ground Home Delivery')
->setCost(1600)
->setTransitTime('THREE_DAYS');
$express = new Quote;
$express
->setCarrier('fedex')
->setCode('FEDEX_EXPRESS_SAVER')
->setName('Fedex Express Saver')
->setCost(2900)
->setDeliveryEstimate(new Carbon('2014-09-30T20:00:00'))
->setTransitTime(null);
$secondday = new Quote;
$secondday
->setCarrier('fedex')
->setCode('FEDEX_2_DAY')
->setName('Fedex 2 Day')
->setCost(4000)
->setDeliveryEstimate(new Carbon('2014-09-29T20:00:00'))
->setTransitTime(null);
$overnight = new Quote;
$overnight
->setCarrier('fedex')
->setCode('STANDARD_OVERNIGHT')
->setName('Standard Overnight')
->setCost(7800)
->setDeliveryEstimate(new Carbon('2014-09-26T20:00:00'))
->setTransitTime(null);
$expected_result = [$ground, $express, $secondday, $overnight];
$this->assertEquals($expected_result, $fedex_rates);
}
public function testDisplayOptions()
@ -219,102 +243,36 @@ class ShipTest extends PHPUnit_Framework_TestCase
$ship = Ship::factory($this->shipping_options);
$display_rates = $ship->get_display_rates($rates);
$this->assertEquals(json_encode([
$post = new Quote;
$post->setCode(4)
->setName('Parcel Post')
->setCost(1001)
->setCarrier('usps');
$fedex_two_day = new Quote;
$fedex_two_day->setCode('FEDEX_2_DAY')
->setName('Fedex 2 Day')
->setCost(4000)
->setDeliveryEstimate(new Carbon('2014-09-29T20:00:00'))
->setCarrier('fedex');
$overnight = new Quote;
$overnight->setCode('STANDARD_OVERNIGHT')
->setName('Standard Overnight')
->setCost(7800)
->setDeliveryEstimate(new Carbon('2014-09-26T20:00:00'))
->setCarrier('fedex');
$this->assertEquals([
'Standard Shipping' => [
0 => [
'code' => '4',
'name' => 'Parcel Post',
'cost' => 1001,
'carrier' => 'usps',
],
$post,
],
'Two-Day Shipping' => [
0 => [
'code' => 'FEDEX_2_DAY',
'name' => 'Fedex 2 Day',
'cost' => 4000,
'delivery_ts' => '2014-09-29T20:00:00',
'transit_time' => NULL,
'carrier' => 'fedex',
],
$fedex_two_day,
],
'One-Day Shipping' => [
0 => [
'code' => 'STANDARD_OVERNIGHT',
'name' => 'Standard Overnight',
'cost' => 7800,
'delivery_ts' => '2014-09-26T20:00:00',
'transit_time' => NULL,
'carrier' => 'fedex',
],
$overnight,
],
]), json_encode($display_rates));
], $display_rates);
}
// // Readme Examples:
// public function testUSPSReadmeExample()
// {
// $usps = new USPS\Rate([
// 'prod' => FALSE,
// 'username' => 'XXXX',
// 'password' => 'XXXX',
// 'shipment' => array_merge($this->shipment, [
// 'size' => 'LARGE',
// 'container' => 'RECTANGULAR',
// ]),
// 'approved_codes' => [
// '1', // 1-3 business days
// '4', // 2-8 business days
// ],
// 'request_adapter' => new RateRequest\StubUSPS(),
// ]);
//
// $usps_rates = $usps->get_rates();
// var_export($usps_rates);
// }
//
// public function testUPSReadmeExample()
// {
// $ups = new UPS\Rate([
// 'prod' => FALSE,
// 'shipment' => $this->shipment,
// 'approved_codes' => [
// '03', // 1-5 business days
// '02', // 2 business days
// '01', // next business day 10:30am
// '13', // next business day by 3pm
// '14', // next business day by 8am
// ],
// 'request_adapter' => new RateRequest\StubUPS(),
// ]);
//
// $ups_rates = $ups->get_rates();
// var_export($ups_rates);
// }
//
// public function testFedexReadmeExample()
// {
// $fedex = new Fedex\Rate([
// 'prod' => FALSE,
// 'key' => 'XXXX',
// 'password' => 'XXXX',
// 'account_number' => 'XXXX',
// 'meter_number' => 'XXXX',
// 'drop_off_type' => 'BUSINESS_SERVICE_CENTER',
// 'shipment' => array_merge($this->shipment, [
// 'packaging_type' => 'YOUR_PACKAGING',
// ]),
// 'approved_codes' => [
// 'FEDEX_EXPRESS_SAVER', // 1-3 business days
// 'FEDEX_GROUND', // 1-5 business days
// 'GROUND_HOME_DELIVERY', // 1-5 business days
// 'FEDEX_2_DAY', // 2 business days
// 'STANDARD_OVERNIGHT', // overnight
// ],
// 'request_adapter' => new RateRequest\StubFedex(),
// ]);
//
// $fedex_rates = $fedex->get_rates();
// var_export($fedex_rates);
// }
}

Loading…
Cancel
Save