From 1f98232ac0f70536ddd4f49cbabb528c3373fb36 Mon Sep 17 00:00:00 2001 From: Troy Davisson Date: Thu, 27 Nov 2014 13:27:56 -0500 Subject: [PATCH] Provide rate quotes back as objects --- composer.json | 4 +- src/Fedex/Rate.php | 21 ++-- src/Quote.php | 123 ++++++++++++++++++++ src/RateAdapter.php | 4 +- src/Ship.php | 12 +- src/UPS/Rate.php | 13 ++- src/USPS/Rate.php | 17 ++- tests/ShipTest.php | 268 +++++++++++++++++++------------------------- 8 files changed, 280 insertions(+), 182 deletions(-) create mode 100644 src/Quote.php diff --git a/composer.json b/composer.json index 58cef70..3c7d92d 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,9 @@ "email": "pdt256@gmail.com" } ], - "require": {}, + "require": { + "nesbot/carbon": "1.*" + }, "require-dev": { "phpunit/phpunit": "4.0.*" }, diff --git a/src/Fedex/Rate.php b/src/Fedex/Rate.php index 5f91875..328bbac 100644 --- a/src/Fedex/Rate.php +++ b/src/Fedex/Rate.php @@ -1,8 +1,10 @@ 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; diff --git a/src/Quote.php b/src/Quote.php new file mode 100644 index 0000000..e37cb10 --- /dev/null +++ b/src/Quote.php @@ -0,0 +1,123 @@ +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; + } +} diff --git a/src/RateAdapter.php b/src/RateAdapter.php index 8fd7dbb..de2d17a 100644 --- a/src/RateAdapter.php +++ b/src/RateAdapter.php @@ -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());')); } } diff --git a/src/Ship.php b/src/Ship.php index d176c0c..06e5363 100644 --- a/src/Ship.php +++ b/src/Ship.php @@ -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());')); } } diff --git a/src/UPS/Rate.php b/src/UPS/Rate.php index 53a4cbb..bb33c50 100644 --- a/src/UPS/Rate.php +++ b/src/UPS/Rate.php @@ -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; diff --git a/src/USPS/Rate.php b/src/USPS/Rate.php index 48647b5..c0ebf1f 100644 --- a/src/USPS/Rate.php +++ b/src/USPS/Rate.php @@ -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); diff --git a/tests/ShipTest.php b/tests/ShipTest.php index ce42ffe..4fa34df 100644 --- a/tests/ShipTest.php +++ b/tests/ShipTest.php @@ -1,5 +1,7 @@ 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); - // } }