From ca3af231696f33d75351f2886c0f000e8f9142a0 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 10:01:38 +0200 Subject: [PATCH 01/38] replace hardcoded currency results into a value object --- Contracts/IPrice.php | 9 +++++++++ Main.php | 7 ++++++- Shipping/Price/PricePL.php | 30 +++++++++++++++++++++++++++++ Shipping/Price/PriceUk.php | 30 +++++++++++++++++++++++++++++ Shipping/Price/PriceUs.php | 30 +++++++++++++++++++++++++++++ Shipping/ShippingCostCalculator.php | 18 ++++++++++------- 6 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 Contracts/IPrice.php create mode 100644 Shipping/Price/PricePL.php create mode 100644 Shipping/Price/PriceUk.php create mode 100644 Shipping/Price/PriceUs.php diff --git a/Contracts/IPrice.php b/Contracts/IPrice.php new file mode 100644 index 0000000..59c2880 --- /dev/null +++ b/Contracts/IPrice.php @@ -0,0 +1,9 @@ +calculate($order); + + /*@var IPrice */ + $shipping_cost = (new ShippingCostCalculator())->calculate($order); + + return $shipping_cost->getFomatedValue(); } } \ No newline at end of file diff --git a/Shipping/Price/PricePL.php b/Shipping/Price/PricePL.php new file mode 100644 index 0000000..da89bdf --- /dev/null +++ b/Shipping/Price/PricePL.php @@ -0,0 +1,30 @@ +value = $value; + } + + public function getValue() + { + return $this->value; + } + + public function getCurrencyCode() + { + return $this->currency_code; + } + + public function getFomatedValue() + { + return $this->value.$this->currency_code; + } +} \ No newline at end of file diff --git a/Shipping/Price/PriceUk.php b/Shipping/Price/PriceUk.php new file mode 100644 index 0000000..9c44eaa --- /dev/null +++ b/Shipping/Price/PriceUk.php @@ -0,0 +1,30 @@ +value = $value; + } + + public function getValue() + { + return $this->value; + } + + public function getCurrencyCode() + { + return $this->currency_code; + } + + public function getFomatedValue() + { + return $this->value.$this->currency_code; + } +} \ No newline at end of file diff --git a/Shipping/Price/PriceUs.php b/Shipping/Price/PriceUs.php new file mode 100644 index 0000000..cd13e1a --- /dev/null +++ b/Shipping/Price/PriceUs.php @@ -0,0 +1,30 @@ +value = $value; + } + + public function getValue() + { + return $this->value; + } + + public function getCurrencyCode() + { + return $this->currency_code; + } + + public function getFomatedValue() + { + return $this->currency_code.$this->value; + } +} \ No newline at end of file diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index 7a7cf2f..9a2ab3f 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -1,11 +1,15 @@ getCountry(); @@ -15,29 +19,29 @@ public function calculate(Order $order) $total = $order->getTotalPl(); if($total > 100) { - return '0PLN'; + return new PricePl(0); } //there will be more logic in the future - return '25PLN'; + return new PricePl(25); case "UK": $total = $order->getTotalUk(); if($total > 300) { - return '0'."GBP"; + return new PriceUk(0); } //there will be more logic in the future - return '25'."GBP"; + return new PriceUk(25); case "US": $total = $order->getTotalUs(); if($total > 1000) { - return '$0'; + return new PriceUs(0); } //there will be more logic in the future - return '$250'; + return new PriceUs(250); } } } \ No newline at end of file From 6386b8ee61ad5e3cfcd3bce52f7f8b722bc36eeb Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 10:21:07 +0200 Subject: [PATCH 02/38] strategy pattern usage. version with factory inside of the refactored class --- Contracts/ICountryShippingCalc.php | 7 ++++ Shipping/CountryCalculators/CalcPl.php | 20 +++++++++++ Shipping/CountryCalculators/CalcUk.php | 21 ++++++++++++ Shipping/CountryCalculators/CalcUs.php | 21 ++++++++++++ Shipping/CountryCalculators/CalcWorld.php | 17 ++++++++++ .../CountryCalculators/CountryCalcFactory.php | 24 ++++++++++++++ Shipping/ShippingCostCalculator.php | 33 ++----------------- tests/MainTest.php | 11 +++++++ 8 files changed, 124 insertions(+), 30 deletions(-) create mode 100644 Contracts/ICountryShippingCalc.php create mode 100644 Shipping/CountryCalculators/CalcPl.php create mode 100644 Shipping/CountryCalculators/CalcUk.php create mode 100644 Shipping/CountryCalculators/CalcUs.php create mode 100644 Shipping/CountryCalculators/CalcWorld.php create mode 100644 Shipping/CountryCalculators/CountryCalcFactory.php diff --git a/Contracts/ICountryShippingCalc.php b/Contracts/ICountryShippingCalc.php new file mode 100644 index 0000000..62ee2b4 --- /dev/null +++ b/Contracts/ICountryShippingCalc.php @@ -0,0 +1,7 @@ +getTotalPl(); + if($total > 100) + { + return new PricePl(0); + } + //there will be more logic in the future + return new PricePl(25); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/CalcUk.php b/Shipping/CountryCalculators/CalcUk.php new file mode 100644 index 0000000..b23c8d9 --- /dev/null +++ b/Shipping/CountryCalculators/CalcUk.php @@ -0,0 +1,21 @@ +getTotalUk(); + + if($total > 300) + { + return new PriceUk(0); + } + //there will be more logic in the future + return new PriceUk(25); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/CalcUs.php b/Shipping/CountryCalculators/CalcUs.php new file mode 100644 index 0000000..e0032ac --- /dev/null +++ b/Shipping/CountryCalculators/CalcUs.php @@ -0,0 +1,21 @@ +getTotalUs(); + + if($total > 1000) + { + return new PriceUs(0); + } + //there will be more logic in the future + return new PriceUs(250); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/CalcWorld.php b/Shipping/CountryCalculators/CalcWorld.php new file mode 100644 index 0000000..9f3ffe8 --- /dev/null +++ b/Shipping/CountryCalculators/CalcWorld.php @@ -0,0 +1,17 @@ +getCountry(); - switch($country) - { - case "PL": - $total = $order->getTotalPl(); - if($total > 100) - { - return new PricePl(0); - } - //there will be more logic in the future - return new PricePl(25); - - case "UK": - $total = $order->getTotalUk(); - - if($total > 300) - { - return new PriceUk(0); - } - //there will be more logic in the future - return new PriceUk(25); - case "US": - $total = $order->getTotalUs(); - - if($total > 1000) - { - return new PriceUs(0); - } - //there will be more logic in the future - return new PriceUs(250); - } + $country_calculator = (new CountryCalcFactory())->create($country); + return $country_calculator->calculate($order); } } \ No newline at end of file diff --git a/tests/MainTest.php b/tests/MainTest.php index 1ed41c1..9006804 100644 --- a/tests/MainTest.php +++ b/tests/MainTest.php @@ -49,4 +49,15 @@ public function start_freeShippingUs() $this->assertEquals('$0', $result); } + + /** + * @test + */ + public function start_costForUnknowCountries() + { + $main = new Main(); + $result = $main->start("Nigeria", 2450); + + $this->assertEquals('$200', $result); + } } \ No newline at end of file From 4168be0181ce9075a37e2adbb356f95d1bce8262 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 10:50:10 +0200 Subject: [PATCH 03/38] strategy pattern usage. version with factory inside of the refactored class force usage of interface --- Shipping/ShippingCostCalculator.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index b3ec428..d145ab7 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -1,6 +1,7 @@ getCountry(); $country_calculator = (new CountryCalcFactory())->create($country); - return $country_calculator->calculate($order); + return $this->country_calc($country_calculator); + } + + /** + * We use this method to force future programmers to use the proper interface + * implementation for calculation purphoses + * @param Order $order + * @param ICountryShippingCalc $calc + * @return IPrice + */ + private function country_calc(Order $order, ICountryShippingCalc $calc):IPrice + { + return $calc->calculate($order); } } \ No newline at end of file From d17857ee0bf75b2f9d53de0a4a6b6e50f09e9fe5 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 11:28:19 +0200 Subject: [PATCH 04/38] strategy pattern usage. version with factory extracted level up Also we use separated interface and order adapter to separate shitty library coupling --- Contracts/ICountryShippingCalc.php | 3 +- Contracts/IShippingOrder.php | 11 ++++++ Main.php | 11 ++++-- Orders/Order.php | 3 ++ Orders/ShippingOrderAdapter.php | 35 +++++++++++++++++++ Shipping/CountryCalculators/CalcPl.php | 12 +++++-- Shipping/CountryCalculators/CalcUk.php | 15 ++++++-- Shipping/CountryCalculators/CalcUs.php | 15 ++++++-- Shipping/CountryCalculators/CalcWorld.php | 16 ++++++--- .../CountryCalculators/CountryCalcFactory.php | 12 ++++--- Shipping/ShippingCostCalculator.php | 20 ++--------- tests/MainTest.php | 2 +- 12 files changed, 117 insertions(+), 38 deletions(-) create mode 100644 Contracts/IShippingOrder.php create mode 100644 Orders/ShippingOrderAdapter.php diff --git a/Contracts/ICountryShippingCalc.php b/Contracts/ICountryShippingCalc.php index 62ee2b4..7533717 100644 --- a/Contracts/ICountryShippingCalc.php +++ b/Contracts/ICountryShippingCalc.php @@ -3,5 +3,6 @@ interface ICountryShippingCalc { - public function calculate($order):IPrice; + public function __construct(IShippingOrder $order); + public function calculate():IPrice; } \ No newline at end of file diff --git a/Contracts/IShippingOrder.php b/Contracts/IShippingOrder.php new file mode 100644 index 0000000..ee5ee38 --- /dev/null +++ b/Contracts/IShippingOrder.php @@ -0,0 +1,11 @@ +create($order_adapter); /*@var IPrice */ - $shipping_cost = (new ShippingCostCalculator())->calculate($order); + $shipping_cost = (new ShippingCostCalculator())->calculate($country_calculator); return $shipping_cost->getFomatedValue(); } diff --git a/Orders/Order.php b/Orders/Order.php index 08134e6..bdc5aef 100644 --- a/Orders/Order.php +++ b/Orders/Order.php @@ -60,4 +60,7 @@ public function getClientShippingDiscountWORLD() { return 0; } + + //please assume that there will be a lot more of code inside of this class + //imagine the worst code which you ever seen... this one is worse } \ No newline at end of file diff --git a/Orders/ShippingOrderAdapter.php b/Orders/ShippingOrderAdapter.php new file mode 100644 index 0000000..b95322a --- /dev/null +++ b/Orders/ShippingOrderAdapter.php @@ -0,0 +1,35 @@ +order = $order; + } + + public function getCountry() + { + return $this->order->getCountry(); + } + + public function getTotalPl() + { + return $this->order->getTotalPl(); + } + + public function getTotalUk() + { + return $this->order->getTotalUk(); + } + + public function getTotalUs() + { + return $this->order->getTotalUs(); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/CalcPl.php b/Shipping/CountryCalculators/CalcPl.php index 3e6a1cb..17a5fe2 100644 --- a/Shipping/CountryCalculators/CalcPl.php +++ b/Shipping/CountryCalculators/CalcPl.php @@ -3,13 +3,21 @@ use App\Contracts\ICountryShippingCalc; use App\Contracts\IPrice; +use App\Contracts\IShippingOrder; use App\Shipping\Price\PricePl; class CalcPl implements ICountryShippingCalc { - public function calculate($order):IPrice + private IShippingOrder $order; + + public function __construct(IShippingOrder $order) + { + $this->order = $order; + } + + public function calculate():IPrice { - $total = $order->getTotalPl(); + $total = $this->order->getTotalPl(); if($total > 100) { return new PricePl(0); diff --git a/Shipping/CountryCalculators/CalcUk.php b/Shipping/CountryCalculators/CalcUk.php index b23c8d9..033afc5 100644 --- a/Shipping/CountryCalculators/CalcUk.php +++ b/Shipping/CountryCalculators/CalcUk.php @@ -1,15 +1,24 @@ order = $order; + } + + public function calculate():IPrice { - $total = $order->getTotalUk(); + $total = $this->order->getTotalUk(); if($total > 300) { diff --git a/Shipping/CountryCalculators/CalcUs.php b/Shipping/CountryCalculators/CalcUs.php index e0032ac..9b7c3d3 100644 --- a/Shipping/CountryCalculators/CalcUs.php +++ b/Shipping/CountryCalculators/CalcUs.php @@ -1,15 +1,24 @@ order = $order; + } + + public function calculate():IPrice { - $total = $order->getTotalUs(); + $total = $this->order->getTotalUs(); if($total > 1000) { diff --git a/Shipping/CountryCalculators/CalcWorld.php b/Shipping/CountryCalculators/CalcWorld.php index 9f3ffe8..c80eae6 100644 --- a/Shipping/CountryCalculators/CalcWorld.php +++ b/Shipping/CountryCalculators/CalcWorld.php @@ -3,15 +3,23 @@ namespace App\Shipping\CountryCalculators; - +use \App\Contracts\ICountryShippingCalc; use App\Contracts\IPrice; +use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceUs; -class CalcWorld implements \App\Contracts\ICountryShippingCalc +class CalcWorld implements ICountryShippingCalc { + private IShippingOrder $order; + + public function __construct(IShippingOrder $order) + { + $this->order = $order; + } - public function calculate($order): IPrice + public function calculate(): IPrice { - return new PriceUs(200); + //we don't care for the order total value, always add shipping cost + return new PriceUs(299); } } \ No newline at end of file diff --git a/Shipping/CountryCalculators/CountryCalcFactory.php b/Shipping/CountryCalculators/CountryCalcFactory.php index 70f0abd..0c18ab3 100644 --- a/Shipping/CountryCalculators/CountryCalcFactory.php +++ b/Shipping/CountryCalculators/CountryCalcFactory.php @@ -4,21 +4,23 @@ namespace App\Shipping\CountryCalculators; use App\Contracts\ICountryShippingCalc; +use App\Contracts\IShippingOrder; class CountryCalcFactory { - public function create($country_code): ICountryShippingCalc + public function create(IShippingOrder $order): ICountryShippingCalc { + $country_code = $order->getCountry(); switch ($country_code) { case "PL": - return new CalcPl(); + return new CalcPl($order); case "UK": - return new CalcUk(); + return new CalcUk($order); case "US": - return new CalcUs(); + return new CalcUs($order); default: - return new CalcWorld(); + return new CalcWorld($order); } } } \ No newline at end of file diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index d145ab7..cb2be81 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -11,23 +11,9 @@ class ShippingCostCalculator { - public function calculate(Order $order):IPrice + public function calculate(ICountryShippingCalc $calc):IPrice { - $country = $order->getCountry(); - - $country_calculator = (new CountryCalcFactory())->create($country); - return $this->country_calc($country_calculator); - } - - /** - * We use this method to force future programmers to use the proper interface - * implementation for calculation purphoses - * @param Order $order - * @param ICountryShippingCalc $calc - * @return IPrice - */ - private function country_calc(Order $order, ICountryShippingCalc $calc):IPrice - { - return $calc->calculate($order); + //all future additional calculations related with shipping only should start/be added here + return $calc->calculate(); } } \ No newline at end of file diff --git a/tests/MainTest.php b/tests/MainTest.php index 9006804..4d1927c 100644 --- a/tests/MainTest.php +++ b/tests/MainTest.php @@ -58,6 +58,6 @@ public function start_costForUnknowCountries() $main = new Main(); $result = $main->start("Nigeria", 2450); - $this->assertEquals('$200', $result); + $this->assertEquals('$299', $result); } } \ No newline at end of file From e467686224020010b268a7a3aceebf47c23ef671 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 12:01:17 +0200 Subject: [PATCH 05/38] code tweaks New calculations will be added (bad way) --- Contracts/IShippingClient.php | 7 +++++++ Main.php | 4 ++-- Orders/Order.php | 4 +++- Orders/ShippingOrderAdapter.php | 10 +++++++++- Shipping/ShippingCostCalculator.php | 15 +++++++++++++-- tests/MainTest.php | 17 +++++++++++++++++ 6 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 Contracts/IShippingClient.php diff --git a/Contracts/IShippingClient.php b/Contracts/IShippingClient.php new file mode 100644 index 0000000..e763775 --- /dev/null +++ b/Contracts/IShippingClient.php @@ -0,0 +1,7 @@ +create($order_adapter); /*@var IPrice */ - $shipping_cost = (new ShippingCostCalculator())->calculate($country_calculator); + $shipping_cost = (new ShippingCostCalculator())->calculate($country_calculator, $order_adapter); return $shipping_cost->getFomatedValue(); } diff --git a/Orders/Order.php b/Orders/Order.php index bdc5aef..69c624b 100644 --- a/Orders/Order.php +++ b/Orders/Order.php @@ -15,11 +15,13 @@ class Order { private $country = "PL"; private $total = 50; + private $shipping_discount = 0; - public function __construct($country_code, $total) + public function __construct($country_code, $total, $shipping_discount = 0) { $this->country = $country_code; $this->total = $total; + $this->shipping_discount = $shipping_discount; } public function getCountry() diff --git a/Orders/ShippingOrderAdapter.php b/Orders/ShippingOrderAdapter.php index b95322a..d4bba73 100644 --- a/Orders/ShippingOrderAdapter.php +++ b/Orders/ShippingOrderAdapter.php @@ -4,7 +4,10 @@ namespace App\Orders; -class ShippingOrderAdapter implements \App\Contracts\IShippingOrder +use App\Contracts\IShippingClient; +use App\Contracts\IShippingOrder; + +class ShippingOrderAdapter implements IShippingOrder, IShippingClient { private Order $order; @@ -32,4 +35,9 @@ public function getTotalUs() { return $this->order->getTotalUs(); } + + public function getShippingDiscount() + { + // TODO: Implement getShippingDiscount() method. + } } \ No newline at end of file diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index cb2be81..4e29637 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -3,6 +3,9 @@ use App\Contracts\ICountryShippingCalc; use App\Contracts\IPrice; +use App\Contracts\IShippingOrder; +use App\Contracts\IShippingClient; + use App\Orders\Order; use App\Shipping\CountryCalculators\CountryCalcFactory; use App\Shipping\Price\PricePl; @@ -11,9 +14,17 @@ class ShippingCostCalculator { - public function calculate(ICountryShippingCalc $calc):IPrice + public function calculate(ICountryShippingCalc $calc, IShippingClient $client):IPrice { //all future additional calculations related with shipping only should start/be added here - return $calc->calculate(); + $shipping_cost = $calc->calculate(); + + //include client discount code + + //include additional money for premium type box + + //include discounts for special premium days of delivery + + return $shipping_cost; } } \ No newline at end of file diff --git a/tests/MainTest.php b/tests/MainTest.php index 4d1927c..8b6e50e 100644 --- a/tests/MainTest.php +++ b/tests/MainTest.php @@ -7,6 +7,9 @@ class MainTest extends TestCase { /** + * @feature Orders + * @sceanrio Calculate Shipping Cost + * @case to Poland without discounts * @test */ public function start_needToPayPL() @@ -17,6 +20,20 @@ public function start_needToPayPL() $this->assertEquals('25PLN', $result); } + /** + * @feature Orders + * @sceanrio Calculate Shipping Cost + * @case to Poland without Client Shipping discount + * @test + */ + public function start_needToPayPLDiscount() + { + $main = new Main(); + $result = $main->start("PL", 50); + + $this->assertEquals('15PLN', $result); + } + /** * @test */ From db9f46ea69efd7cd94482d91c2336230647671dd Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 12:27:16 +0200 Subject: [PATCH 06/38] code tweaks adding discount based on client discount for shipping --- Main.php | 4 ++-- Orders/Order.php | 4 ++-- Orders/ShippingOrderAdapter.php | 12 +++++++++++- Shipping/Price/PriceFactory.php | 20 ++++++++++++++++++++ Shipping/ShippingCostCalculator.php | 16 ++++++++++++++++ tests/MainTest.php | 2 +- 6 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 Shipping/Price/PriceFactory.php diff --git a/Main.php b/Main.php index 31145ad..d1cef86 100644 --- a/Main.php +++ b/Main.php @@ -9,9 +9,9 @@ class Main { - public function start($country_code, $total) + public function start($country_code, $total, $discount = 0) { - $immutable_order = new Order($country_code, $total); + $immutable_order = new Order($country_code, $total, $discount); //we want to be independent as much as possible from the oryginal messed Order object $order_adapter = new ShippingOrderAdapter($immutable_order); diff --git a/Orders/Order.php b/Orders/Order.php index 69c624b..a0295b5 100644 --- a/Orders/Order.php +++ b/Orders/Order.php @@ -17,7 +17,7 @@ class Order private $total = 50; private $shipping_discount = 0; - public function __construct($country_code, $total, $shipping_discount = 0) + public function __construct($country_code, $total, $shipping_discount) { $this->country = $country_code; $this->total = $total; @@ -50,7 +50,7 @@ public function getClientDiscount(){ public function getClientShippingDiscountPL() { - return 10; + return $this->shipping_discount; } public function getClientShippingDiscountEU() diff --git a/Orders/ShippingOrderAdapter.php b/Orders/ShippingOrderAdapter.php index d4bba73..bca1d0a 100644 --- a/Orders/ShippingOrderAdapter.php +++ b/Orders/ShippingOrderAdapter.php @@ -38,6 +38,16 @@ public function getTotalUs() public function getShippingDiscount() { - // TODO: Implement getShippingDiscount() method. + switch($this->order->getCountry()) + { + case "PL": + return $this->order->getClientShippingDiscountPL(); + case "UK": + return $this->order->getClientShippingDiscountEU(); + case "US": + return $this->order->getClientShippingDiscountWORLD(); + default: + return $this->order->getClientShippingDiscountWORLD(); + } } } \ No newline at end of file diff --git a/Shipping/Price/PriceFactory.php b/Shipping/Price/PriceFactory.php new file mode 100644 index 0000000..0f1bc51 --- /dev/null +++ b/Shipping/Price/PriceFactory.php @@ -0,0 +1,20 @@ +price_factory = new PriceFactory(); + } public function calculate(ICountryShippingCalc $calc, IShippingClient $client):IPrice { //all future additional calculations related with shipping only should start/be added here $shipping_cost = $calc->calculate(); //include client discount code + if($client->getShippingDiscount() > 0 ) + { + if($client->getShippingDiscount() >= $shipping_cost->getValue()) + { + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), 0); + } else { + $after_discount = $shipping_cost->getValue() - $client->getShippingDiscount(); + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $after_discount); + } + } //include additional money for premium type box diff --git a/tests/MainTest.php b/tests/MainTest.php index 8b6e50e..b5a9ebf 100644 --- a/tests/MainTest.php +++ b/tests/MainTest.php @@ -29,7 +29,7 @@ public function start_needToPayPL() public function start_needToPayPLDiscount() { $main = new Main(); - $result = $main->start("PL", 50); + $result = $main->start("PL", 50, 10); $this->assertEquals('15PLN', $result); } From c679d5d7e245de985ac7de1c3387d81204b49697 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 14:59:19 +0200 Subject: [PATCH 07/38] code tweaks adding premium box cost into delivery --- Main.php | 6 +++--- Orders/Order.php | 8 +++++++- Orders/ShippingOrderAdapter.php | 5 +++++ Shipping/ShippingCostCalculator.php | 16 ++++++++++++++-- tests/MainTest.php | 16 +++++++++++++++- 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/Main.php b/Main.php index d1cef86..26c3c50 100644 --- a/Main.php +++ b/Main.php @@ -9,9 +9,9 @@ class Main { - public function start($country_code, $total, $discount = 0) + public function start($country_code, $total, $discount = 0, $premium_box = false) { - $immutable_order = new Order($country_code, $total, $discount); + $immutable_order = new Order($country_code, $total, $discount, $premium_box); //we want to be independent as much as possible from the oryginal messed Order object $order_adapter = new ShippingOrderAdapter($immutable_order); @@ -19,7 +19,7 @@ public function start($country_code, $total, $discount = 0) $country_calculator = (new CountryCalcFactory())->create($order_adapter); /*@var IPrice */ - $shipping_cost = (new ShippingCostCalculator())->calculate($country_calculator, $order_adapter); + $shipping_cost = (new ShippingCostCalculator())->calculate($country_calculator, $order_adapter, $order_adapter); return $shipping_cost->getFomatedValue(); } diff --git a/Orders/Order.php b/Orders/Order.php index a0295b5..2b5d4cb 100644 --- a/Orders/Order.php +++ b/Orders/Order.php @@ -16,12 +16,14 @@ class Order private $country = "PL"; private $total = 50; private $shipping_discount = 0; + private $premium_box = false; - public function __construct($country_code, $total, $shipping_discount) + public function __construct($country_code, $total, $shipping_discount, $premium_box) { $this->country = $country_code; $this->total = $total; $this->shipping_discount = $shipping_discount; + $this->premium_box = $premium_box; } public function getCountry() @@ -63,6 +65,10 @@ public function getClientShippingDiscountWORLD() return 0; } + public function isPremiumBox() + { + return $this->premium_box; + } //please assume that there will be a lot more of code inside of this class //imagine the worst code which you ever seen... this one is worse } \ No newline at end of file diff --git a/Orders/ShippingOrderAdapter.php b/Orders/ShippingOrderAdapter.php index bca1d0a..7d58c6f 100644 --- a/Orders/ShippingOrderAdapter.php +++ b/Orders/ShippingOrderAdapter.php @@ -50,4 +50,9 @@ public function getShippingDiscount() return $this->order->getClientShippingDiscountWORLD(); } } + + public function isPremiumBox():bool + { + return $this->order->isPremiumBox(); + } } \ No newline at end of file diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index d5df101..ebd3b01 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -20,7 +20,7 @@ public function __construct() { $this->price_factory = new PriceFactory(); } - public function calculate(ICountryShippingCalc $calc, IShippingClient $client):IPrice + public function calculate(ICountryShippingCalc $calc, IShippingClient $client, IShippingOrder $order):IPrice { //all future additional calculations related with shipping only should start/be added here $shipping_cost = $calc->calculate(); @@ -38,9 +38,21 @@ public function calculate(ICountryShippingCalc $calc, IShippingClient $client):I } //include additional money for premium type box + if($order->isPremiumBox() ) + { + $price = 0; + switch($shipping_cost->getCurrencyCode()) + { + case "PLN" : $price = 40; break;//PLN; + case "GBP": $price = 20; break; //GBP + case "$": $price = 17; break;//US $ + default: 17; break; // US $ for the rest of the world + } + $price_summary = $shipping_cost->getValue() + $price; + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); + } //include discounts for special premium days of delivery - return $shipping_cost; } } \ No newline at end of file diff --git a/tests/MainTest.php b/tests/MainTest.php index b5a9ebf..9410fb3 100644 --- a/tests/MainTest.php +++ b/tests/MainTest.php @@ -23,7 +23,7 @@ public function start_needToPayPL() /** * @feature Orders * @sceanrio Calculate Shipping Cost - * @case to Poland without Client Shipping discount + * @case to Poland with Client Shipping discount * @test */ public function start_needToPayPLDiscount() @@ -34,6 +34,20 @@ public function start_needToPayPLDiscount() $this->assertEquals('15PLN', $result); } + /** + * @feature Orders + * @sceanrio Calculate Shipping Cost + * @case to Poland without Client Shipping discount and premium box + * @test + */ + public function start_needToPayPLDiscountANDPremiumBox() + { + $main = new Main(); + $result = $main->start("PL", 50, 10, true); + + $this->assertEquals('55PLN', $result); + } + /** * @test */ From b731297da6f1d81218325f63ff973a23dbaa811d Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 15:04:26 +0200 Subject: [PATCH 08/38] code tweaks adding special days discounts (free delivery) --- Shipping/ShippingCostCalculator.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index ebd3b01..e868924 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -25,6 +25,13 @@ public function calculate(ICountryShippingCalc $calc, IShippingClient $client, I //all future additional calculations related with shipping only should start/be added here $shipping_cost = $calc->calculate(); + //include discounts for special premium days of delivery + //IMPORTANT this has to be called before all other discounts calculations + if($this->isSpecialDay()) + { + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), 0); + } + //include client discount code if($client->getShippingDiscount() > 0 ) { @@ -52,7 +59,11 @@ public function calculate(ICountryShippingCalc $calc, IShippingClient $client, I $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); } - //include discounts for special premium days of delivery return $shipping_cost; } + + private function isSpecialDay() + { + return false; + } } \ No newline at end of file From 89e68acecc2fee98ec1a8f2bacd081e38de10d79 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 15:07:01 +0200 Subject: [PATCH 09/38] code tweaks adding special days discounts (free delivery) --- Shipping/ShippingCostCalculator.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index e868924..121afbc 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -27,6 +27,7 @@ public function calculate(ICountryShippingCalc $calc, IShippingClient $client, I //include discounts for special premium days of delivery //IMPORTANT this has to be called before all other discounts calculations + //e.g. Free delivery in special day is not equal that the premium box is free ;) if($this->isSpecialDay()) { $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), 0); From 32277fd33764987c5f7cfb1d93b56909f87b7768 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 15:23:52 +0200 Subject: [PATCH 10/38] refactoring to decorator stuck in a problem of injected elements in interfaces/classes --- .../ClientShippingDiscount.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Shipping/AdditionalCalculations/ClientShippingDiscount.php diff --git a/Shipping/AdditionalCalculations/ClientShippingDiscount.php b/Shipping/AdditionalCalculations/ClientShippingDiscount.php new file mode 100644 index 0000000..7ed66a6 --- /dev/null +++ b/Shipping/AdditionalCalculations/ClientShippingDiscount.php @@ -0,0 +1,19 @@ + Date: Mon, 27 Sep 2021 15:47:29 +0200 Subject: [PATCH 11/38] refactoring to decorator decorator done --- Contracts/ICountryShippingCalc.php | 3 +- Contracts/IShippingClient.php | 2 +- .../ClientShippingDiscount.php | 24 +++++++-- .../FreeDeliveryDays.php | 39 +++++++++++++++ .../AdditionalCalculations/PremiumBox.php | 44 ++++++++++++++++ Shipping/CountryCalculators/CalcPl.php | 11 +--- Shipping/CountryCalculators/CalcUk.php | 12 +---- Shipping/CountryCalculators/CalcUs.php | 12 +---- Shipping/CountryCalculators/CalcWorld.php | 9 +--- .../CountryCalculators/CountryCalcFactory.php | 8 +-- Shipping/ShippingCostCalculator.php | 50 +++++-------------- 11 files changed, 129 insertions(+), 85 deletions(-) create mode 100644 Shipping/AdditionalCalculations/FreeDeliveryDays.php create mode 100644 Shipping/AdditionalCalculations/PremiumBox.php diff --git a/Contracts/ICountryShippingCalc.php b/Contracts/ICountryShippingCalc.php index 7533717..1727154 100644 --- a/Contracts/ICountryShippingCalc.php +++ b/Contracts/ICountryShippingCalc.php @@ -3,6 +3,5 @@ interface ICountryShippingCalc { - public function __construct(IShippingOrder $order); - public function calculate():IPrice; + public function calculate(IShippingOrder $order):IPrice; } \ No newline at end of file diff --git a/Contracts/IShippingClient.php b/Contracts/IShippingClient.php index e763775..da736ba 100644 --- a/Contracts/IShippingClient.php +++ b/Contracts/IShippingClient.php @@ -1,7 +1,7 @@ calc = $calc; + $this->price_factory = new PriceFactory(); } - public function calculate(): IPrice + public function calculate(IShippingOrder $order): IPrice { - // TODO: Implement calculate() method. + $shipping_cost = $this->calc->calculate($order); + + if($order->getShippingDiscount() > 0 ) + { + if($order->getShippingDiscount() >= $shipping_cost->getValue()) + { + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), 0); + } else { + $after_discount = $shipping_cost->getValue() - $order->getShippingDiscount(); + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $after_discount); + } + } + + return $shipping_cost; } } \ No newline at end of file diff --git a/Shipping/AdditionalCalculations/FreeDeliveryDays.php b/Shipping/AdditionalCalculations/FreeDeliveryDays.php new file mode 100644 index 0000000..74da87f --- /dev/null +++ b/Shipping/AdditionalCalculations/FreeDeliveryDays.php @@ -0,0 +1,39 @@ +calc = $calc; + $this->price_factory = new PriceFactory(); + } + + public function calculate(IShippingOrder $order): IPrice + { + $shipping_cost = $this->calc->calculate($order); + + if($this->isSpecialDay()) + { + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), 0); + } + + return $shipping_cost; + } + + private function isSpecialDay() + { + return false; + } +} \ No newline at end of file diff --git a/Shipping/AdditionalCalculations/PremiumBox.php b/Shipping/AdditionalCalculations/PremiumBox.php new file mode 100644 index 0000000..5898fee --- /dev/null +++ b/Shipping/AdditionalCalculations/PremiumBox.php @@ -0,0 +1,44 @@ +calc = $calc; + $this->price_factory = new PriceFactory(); + } + + public function calculate(IShippingOrder $order): IPrice + { + $shipping_cost = $this->calc->calculate($order); + + if($order->isPremiumBox() ) + { + $price = 0; + switch($shipping_cost->getCurrencyCode()) + { + case "PLN" : $price = 40; break;//PLN; + case "GBP": $price = 20; break; //GBP + case "$": $price = 17; break;//US $ + default: 17; break; // US $ for the rest of the world + } + $price_summary = $shipping_cost->getValue() + $price; + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); + } + + return $shipping_cost; + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/CalcPl.php b/Shipping/CountryCalculators/CalcPl.php index 17a5fe2..f5488e3 100644 --- a/Shipping/CountryCalculators/CalcPl.php +++ b/Shipping/CountryCalculators/CalcPl.php @@ -8,16 +8,9 @@ class CalcPl implements ICountryShippingCalc { - private IShippingOrder $order; - - public function __construct(IShippingOrder $order) - { - $this->order = $order; - } - - public function calculate():IPrice + public function calculate(IShippingOrder $order):IPrice { - $total = $this->order->getTotalPl(); + $total = $order->getTotalPl(); if($total > 100) { return new PricePl(0); diff --git a/Shipping/CountryCalculators/CalcUk.php b/Shipping/CountryCalculators/CalcUk.php index 033afc5..b17f59d 100644 --- a/Shipping/CountryCalculators/CalcUk.php +++ b/Shipping/CountryCalculators/CalcUk.php @@ -8,17 +8,9 @@ class CalcUk implements ICountryShippingCalc { - - private IShippingOrder $order; - - public function __construct(IShippingOrder $order) - { - $this->order = $order; - } - - public function calculate():IPrice + public function calculate(IShippingOrder $order):IPrice { - $total = $this->order->getTotalUk(); + $total = $order->getTotalUk(); if($total > 300) { diff --git a/Shipping/CountryCalculators/CalcUs.php b/Shipping/CountryCalculators/CalcUs.php index 9b7c3d3..95db62a 100644 --- a/Shipping/CountryCalculators/CalcUs.php +++ b/Shipping/CountryCalculators/CalcUs.php @@ -8,17 +8,9 @@ class CalcUs implements ICountryShippingCalc { - - private IShippingOrder $order; - - public function __construct(IShippingOrder $order) - { - $this->order = $order; - } - - public function calculate():IPrice + public function calculate(IShippingOrder $order):IPrice { - $total = $this->order->getTotalUs(); + $total = $order->getTotalUs(); if($total > 1000) { diff --git a/Shipping/CountryCalculators/CalcWorld.php b/Shipping/CountryCalculators/CalcWorld.php index c80eae6..f420767 100644 --- a/Shipping/CountryCalculators/CalcWorld.php +++ b/Shipping/CountryCalculators/CalcWorld.php @@ -10,14 +10,7 @@ class CalcWorld implements ICountryShippingCalc { - private IShippingOrder $order; - - public function __construct(IShippingOrder $order) - { - $this->order = $order; - } - - public function calculate(): IPrice + public function calculate(IShippingOrder $order): IPrice { //we don't care for the order total value, always add shipping cost return new PriceUs(299); diff --git a/Shipping/CountryCalculators/CountryCalcFactory.php b/Shipping/CountryCalculators/CountryCalcFactory.php index 0c18ab3..0ff6604 100644 --- a/Shipping/CountryCalculators/CountryCalcFactory.php +++ b/Shipping/CountryCalculators/CountryCalcFactory.php @@ -14,13 +14,13 @@ public function create(IShippingOrder $order): ICountryShippingCalc switch ($country_code) { case "PL": - return new CalcPl($order); + return new CalcPl(); case "UK": - return new CalcUk($order); + return new CalcUk(); case "US": - return new CalcUs($order); + return new CalcUs(); default: - return new CalcWorld($order); + return new CalcWorld(); } } } \ No newline at end of file diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index 121afbc..6ae47c4 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -7,11 +7,15 @@ use App\Contracts\IShippingClient; use App\Orders\Order; +use App\Shipping\AdditionalCalculations\ClientShippingDiscount; +use App\Shipping\AdditionalCalculations\FreeDeliveryDays; +use App\Shipping\AdditionalCalculations\PremiumBox; use App\Shipping\CountryCalculators\CountryCalcFactory; -use App\Shipping\Price\PriceFactory; + use App\Shipping\Price\PricePl; use App\Shipping\Price\PriceUk; use App\Shipping\Price\PriceUs; +use App\Shipping\Price\PriceFactory; class ShippingCostCalculator { @@ -20,51 +24,21 @@ public function __construct() { $this->price_factory = new PriceFactory(); } - public function calculate(ICountryShippingCalc $calc, IShippingClient $client, IShippingOrder $order):IPrice + public function calculate(ICountryShippingCalc $country_calc, IShippingClient $order):IPrice { //all future additional calculations related with shipping only should start/be added here - $shipping_cost = $calc->calculate(); + // $shipping_cost = $country_calc->calculate($order); //include discounts for special premium days of delivery //IMPORTANT this has to be called before all other discounts calculations //e.g. Free delivery in special day is not equal that the premium box is free ;) - if($this->isSpecialDay()) - { - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), 0); - } - - //include client discount code - if($client->getShippingDiscount() > 0 ) - { - if($client->getShippingDiscount() >= $shipping_cost->getValue()) - { - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), 0); - } else { - $after_discount = $shipping_cost->getValue() - $client->getShippingDiscount(); - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $after_discount); - } - } + $with_free_days = new FreeDeliveryDays($country_calc); - //include additional money for premium type box - if($order->isPremiumBox() ) - { - $price = 0; - switch($shipping_cost->getCurrencyCode()) - { - case "PLN" : $price = 40; break;//PLN; - case "GBP": $price = 20; break; //GBP - case "$": $price = 17; break;//US $ - default: 17; break; // US $ for the rest of the world - } - $price_summary = $shipping_cost->getValue() + $price; - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); - } + $with_client_discount = new ClientShippingDiscount($with_free_days); + $with_premium_boxing = new PremiumBox($with_client_discount); - return $shipping_cost; + return $with_premium_boxing->calculate($order); } - private function isSpecialDay() - { - return false; - } + } \ No newline at end of file From 7f40746fb46f04c1e46c536ada133f1d66fea9a6 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 15:53:49 +0200 Subject: [PATCH 12/38] refactoring to decorator extract methods - DRY --- .../ClientShippingDiscount.php | 4 ++++ .../AdditionalCalculations/FreeDeliveryDays.php | 4 ++++ .../AdditionalCalculations/IAdditionalCalc.php | 17 +++++++++++++++++ Shipping/AdditionalCalculations/PremiumBox.php | 9 ++++++--- 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 Shipping/AdditionalCalculations/IAdditionalCalc.php diff --git a/Shipping/AdditionalCalculations/ClientShippingDiscount.php b/Shipping/AdditionalCalculations/ClientShippingDiscount.php index 565aee1..0faba73 100644 --- a/Shipping/AdditionalCalculations/ClientShippingDiscount.php +++ b/Shipping/AdditionalCalculations/ClientShippingDiscount.php @@ -20,7 +20,11 @@ public function __construct(ICountryShippingCalc $calc) public function calculate(IShippingOrder $order): IPrice { $shipping_cost = $this->calc->calculate($order); + return $this->decorate($shipping_cost, $order); + } + protected function decorate(IPrice $shipping_cost, IShippingOrder $order) + { if($order->getShippingDiscount() > 0 ) { if($order->getShippingDiscount() >= $shipping_cost->getValue()) diff --git a/Shipping/AdditionalCalculations/FreeDeliveryDays.php b/Shipping/AdditionalCalculations/FreeDeliveryDays.php index 74da87f..b3ec766 100644 --- a/Shipping/AdditionalCalculations/FreeDeliveryDays.php +++ b/Shipping/AdditionalCalculations/FreeDeliveryDays.php @@ -23,7 +23,11 @@ public function __construct(ICountryShippingCalc $calc) public function calculate(IShippingOrder $order): IPrice { $shipping_cost = $this->calc->calculate($order); + return $this->decorate($shipping_cost, $order); + } + protected function decorate(IPrice $shipping_cost, IShippingOrder $order) + { if($this->isSpecialDay()) { $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), 0); diff --git a/Shipping/AdditionalCalculations/IAdditionalCalc.php b/Shipping/AdditionalCalculations/IAdditionalCalc.php new file mode 100644 index 0000000..c3dfff0 --- /dev/null +++ b/Shipping/AdditionalCalculations/IAdditionalCalc.php @@ -0,0 +1,17 @@ +calc->calculate($order); + return $this->decorate($shipping_cost, $order); + } + protected function decorate(IPrice $shipping_cost, IShippingOrder $order) + { if($order->isPremiumBox() ) { $price = 0; From 78924eac959fd8bab8b08f158d29c50b377fc8be Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 15:57:55 +0200 Subject: [PATCH 13/38] refactoring to decorator create abstract decorator and remove repeated code - DRY --- .../ClientShippingDiscount.php | 19 ++----------------- .../FreeDeliveryDays.php | 19 ++----------------- .../IAdditionalCalc.php | 19 ++++++++++++++++--- .../AdditionalCalculations/PremiumBox.php | 19 ++----------------- 4 files changed, 22 insertions(+), 54 deletions(-) diff --git a/Shipping/AdditionalCalculations/ClientShippingDiscount.php b/Shipping/AdditionalCalculations/ClientShippingDiscount.php index 0faba73..0aa2639 100644 --- a/Shipping/AdditionalCalculations/ClientShippingDiscount.php +++ b/Shipping/AdditionalCalculations/ClientShippingDiscount.php @@ -6,24 +6,9 @@ use \App\Contracts\IPrice; use \App\Shipping\Price\PriceFactory; -class ClientShippingDiscount implements ICountryShippingCalc +class ClientShippingDiscount extends IAdditionalCalc { - private ICountryShippingCalc $calc; - private $price_factory ; - - public function __construct(ICountryShippingCalc $calc) - { - $this->calc = $calc; - $this->price_factory = new PriceFactory(); - } - - public function calculate(IShippingOrder $order): IPrice - { - $shipping_cost = $this->calc->calculate($order); - return $this->decorate($shipping_cost, $order); - } - - protected function decorate(IPrice $shipping_cost, IShippingOrder $order) + protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice { if($order->getShippingDiscount() > 0 ) { diff --git a/Shipping/AdditionalCalculations/FreeDeliveryDays.php b/Shipping/AdditionalCalculations/FreeDeliveryDays.php index b3ec766..9bee3f1 100644 --- a/Shipping/AdditionalCalculations/FreeDeliveryDays.php +++ b/Shipping/AdditionalCalculations/FreeDeliveryDays.php @@ -9,24 +9,9 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceFactory; -class FreeDeliveryDays implements \App\Contracts\ICountryShippingCalc +class FreeDeliveryDays extends IAdditionalCalc { - private ICountryShippingCalc $calc; - private $price_factory ; - - public function __construct(ICountryShippingCalc $calc) - { - $this->calc = $calc; - $this->price_factory = new PriceFactory(); - } - - public function calculate(IShippingOrder $order): IPrice - { - $shipping_cost = $this->calc->calculate($order); - return $this->decorate($shipping_cost, $order); - } - - protected function decorate(IPrice $shipping_cost, IShippingOrder $order) + protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice { if($this->isSpecialDay()) { diff --git a/Shipping/AdditionalCalculations/IAdditionalCalc.php b/Shipping/AdditionalCalculations/IAdditionalCalc.php index c3dfff0..f23c390 100644 --- a/Shipping/AdditionalCalculations/IAdditionalCalc.php +++ b/Shipping/AdditionalCalculations/IAdditionalCalc.php @@ -2,16 +2,29 @@ namespace App\Shipping\AdditionalCalculations; - +use \App\Contracts\ICountryShippingCalc; use App\Contracts\IPrice; use App\Contracts\IShippingOrder; +use App\Shipping\Price\PriceFactory; -class IAdditionalCalc implements \App\Contracts\ICountryShippingCalc +abstract class IAdditionalCalc implements ICountryShippingCalc { + protected ICountryShippingCalc $calc; + protected $price_factory ; + + public function __construct(ICountryShippingCalc $calc) + { + $this->calc = $calc; + $this->price_factory = new PriceFactory(); + } + public function calculate(IShippingOrder $order): IPrice { - // TODO: Implement calculate() method. + $shipping_cost = $this->calc->calculate($order); + return $this->decorate($shipping_cost, $order); } + + abstract protected function decorate(IPrice $shipping_cost, IShippingOrder $order): IPrice; } \ No newline at end of file diff --git a/Shipping/AdditionalCalculations/PremiumBox.php b/Shipping/AdditionalCalculations/PremiumBox.php index ea72864..335427c 100644 --- a/Shipping/AdditionalCalculations/PremiumBox.php +++ b/Shipping/AdditionalCalculations/PremiumBox.php @@ -8,25 +8,10 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceFactory; -class PremiumBox implements ICountryShippingCalc +class PremiumBox extends IAdditionalCalc { - private ICountryShippingCalc $calc; - private $price_factory ; - - public function __construct(ICountryShippingCalc $calc) - { - $this->calc = $calc; - $this->price_factory = new PriceFactory(); - } - - public function calculate(IShippingOrder $order): IPrice - { - $shipping_cost = $this->calc->calculate($order); - return $this->decorate($shipping_cost, $order); - } - - protected function decorate(IPrice $shipping_cost, IShippingOrder $order) + protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice { if($order->isPremiumBox() ) { From e984a5caab4f67ff2a102eb9909eedfe782dcf1a Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 27 Sep 2021 15:59:52 +0200 Subject: [PATCH 14/38] refactoring to decorator create abstract decorator and remove repeated code - DRY --- Shipping/ShippingCostCalculator.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index 6ae47c4..dc24761 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -6,15 +6,9 @@ use App\Contracts\IShippingOrder; use App\Contracts\IShippingClient; -use App\Orders\Order; use App\Shipping\AdditionalCalculations\ClientShippingDiscount; use App\Shipping\AdditionalCalculations\FreeDeliveryDays; use App\Shipping\AdditionalCalculations\PremiumBox; -use App\Shipping\CountryCalculators\CountryCalcFactory; - -use App\Shipping\Price\PricePl; -use App\Shipping\Price\PriceUk; -use App\Shipping\Price\PriceUs; use App\Shipping\Price\PriceFactory; class ShippingCostCalculator @@ -26,9 +20,6 @@ public function __construct() } public function calculate(ICountryShippingCalc $country_calc, IShippingClient $order):IPrice { - //all future additional calculations related with shipping only should start/be added here - // $shipping_cost = $country_calc->calculate($order); - //include discounts for special premium days of delivery //IMPORTANT this has to be called before all other discounts calculations //e.g. Free delivery in special day is not equal that the premium box is free ;) From cf362f98a6434d5cc0bf74c60c09d60f595d48d2 Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 28 Sep 2021 09:42:59 +0200 Subject: [PATCH 15/38] small tweaks --- Contracts/IShippingClient.php | 7 ------- Contracts/IShippingOrder.php | 2 +- Main.php | 2 +- Orders/ShippingOrderAdapter.php | 2 +- .../{IAdditionalCalc.php => AdditionalCalc.php} | 2 +- Shipping/AdditionalCalculations/ClientShippingDiscount.php | 2 +- Shipping/AdditionalCalculations/FreeDeliveryDays.php | 2 +- Shipping/AdditionalCalculations/PremiumBox.php | 2 +- Shipping/Price/PriceFactory.php | 4 +++- Shipping/ShippingCostCalculator.php | 3 +-- 10 files changed, 11 insertions(+), 17 deletions(-) delete mode 100644 Contracts/IShippingClient.php rename Shipping/AdditionalCalculations/{IAdditionalCalc.php => AdditionalCalc.php} (91%) diff --git a/Contracts/IShippingClient.php b/Contracts/IShippingClient.php deleted file mode 100644 index da736ba..0000000 --- a/Contracts/IShippingClient.php +++ /dev/null @@ -1,7 +0,0 @@ -create($order_adapter); /*@var IPrice */ - $shipping_cost = (new ShippingCostCalculator())->calculate($country_calculator, $order_adapter, $order_adapter); + $shipping_cost = (new ShippingCostCalculator())->calculate($country_calculator, $order_adapter); return $shipping_cost->getFomatedValue(); } diff --git a/Orders/ShippingOrderAdapter.php b/Orders/ShippingOrderAdapter.php index 7d58c6f..c5ab5be 100644 --- a/Orders/ShippingOrderAdapter.php +++ b/Orders/ShippingOrderAdapter.php @@ -7,7 +7,7 @@ use App\Contracts\IShippingClient; use App\Contracts\IShippingOrder; -class ShippingOrderAdapter implements IShippingOrder, IShippingClient +class ShippingOrderAdapter implements IShippingOrder { private Order $order; diff --git a/Shipping/AdditionalCalculations/IAdditionalCalc.php b/Shipping/AdditionalCalculations/AdditionalCalc.php similarity index 91% rename from Shipping/AdditionalCalculations/IAdditionalCalc.php rename to Shipping/AdditionalCalculations/AdditionalCalc.php index f23c390..747fc5a 100644 --- a/Shipping/AdditionalCalculations/IAdditionalCalc.php +++ b/Shipping/AdditionalCalculations/AdditionalCalc.php @@ -8,7 +8,7 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceFactory; -abstract class IAdditionalCalc implements ICountryShippingCalc +abstract class AdditionalCalc implements ICountryShippingCalc { protected ICountryShippingCalc $calc; diff --git a/Shipping/AdditionalCalculations/ClientShippingDiscount.php b/Shipping/AdditionalCalculations/ClientShippingDiscount.php index 0aa2639..3c1d112 100644 --- a/Shipping/AdditionalCalculations/ClientShippingDiscount.php +++ b/Shipping/AdditionalCalculations/ClientShippingDiscount.php @@ -6,7 +6,7 @@ use \App\Contracts\IPrice; use \App\Shipping\Price\PriceFactory; -class ClientShippingDiscount extends IAdditionalCalc +class ClientShippingDiscount extends AdditionalCalc { protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice { diff --git a/Shipping/AdditionalCalculations/FreeDeliveryDays.php b/Shipping/AdditionalCalculations/FreeDeliveryDays.php index 9bee3f1..9bea7a7 100644 --- a/Shipping/AdditionalCalculations/FreeDeliveryDays.php +++ b/Shipping/AdditionalCalculations/FreeDeliveryDays.php @@ -9,7 +9,7 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceFactory; -class FreeDeliveryDays extends IAdditionalCalc +class FreeDeliveryDays extends AdditionalCalc { protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice { diff --git a/Shipping/AdditionalCalculations/PremiumBox.php b/Shipping/AdditionalCalculations/PremiumBox.php index 335427c..84d22cb 100644 --- a/Shipping/AdditionalCalculations/PremiumBox.php +++ b/Shipping/AdditionalCalculations/PremiumBox.php @@ -8,7 +8,7 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceFactory; -class PremiumBox extends IAdditionalCalc +class PremiumBox extends AdditionalCalc { protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice diff --git a/Shipping/Price/PriceFactory.php b/Shipping/Price/PriceFactory.php index 0f1bc51..f9863bf 100644 --- a/Shipping/Price/PriceFactory.php +++ b/Shipping/Price/PriceFactory.php @@ -1,9 +1,11 @@ price_factory = new PriceFactory(); } - public function calculate(ICountryShippingCalc $country_calc, IShippingClient $order):IPrice + public function calculate(ICountryShippingCalc $country_calc, IShippingOrder $order):IPrice { //include discounts for special premium days of delivery //IMPORTANT this has to be called before all other discounts calculations @@ -31,5 +31,4 @@ public function calculate(ICountryShippingCalc $country_calc, IShippingClient $o return $with_premium_boxing->calculate($order); } - } \ No newline at end of file From 4e656c6c2be7300b73d3011643ecb50c9a3580ac Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 28 Sep 2021 10:39:15 +0200 Subject: [PATCH 16/38] small tweaks --- Main.php | 24 ++++++++++++++----- .../CountryCalculators/CountryCalcFactory.php | 3 +-- Shipping/ShippingCostCalculator.php | 11 +++++---- tests/MainTest.php | 12 ++++++++++ 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/Main.php b/Main.php index 8fef8a0..30fdaee 100644 --- a/Main.php +++ b/Main.php @@ -1,6 +1,7 @@ getWrappedOrder($country_code, $total, $discount, $premium_box); + $shipping_cost = $this->makeShippingCalcultions($order_adapter); + + return $shipping_cost->getFomatedValue(); + } + + private function getWrappedOrder($country_code, $total, $discount = 0, $premium_box = false):IShippingOrder { $immutable_order = new Order($country_code, $total, $discount, $premium_box); //we want to be independent as much as possible from the oryginal messed Order object - $order_adapter = new ShippingOrderAdapter($immutable_order); - - $country_calculator = (new CountryCalcFactory())->create($order_adapter); + /*@var IShippingOrder $order_adapter */ + return new ShippingOrderAdapter($immutable_order); + } - /*@var IPrice */ - $shipping_cost = (new ShippingCostCalculator())->calculate($country_calculator, $order_adapter); + private function makeShippingCalcultions(IShippingOrder $order_adapter):IPrice + { + $calc_factory = new CountryCalcFactory(); + $country_calculator = $calc_factory->create($order_adapter->getCountry()); - return $shipping_cost->getFomatedValue(); + $calculator_facade = new ShippingCostCalculator(); + return $calculator_facade->calculate($country_calculator, $order_adapter); } } \ No newline at end of file diff --git a/Shipping/CountryCalculators/CountryCalcFactory.php b/Shipping/CountryCalculators/CountryCalcFactory.php index 0ff6604..ed7bb9f 100644 --- a/Shipping/CountryCalculators/CountryCalcFactory.php +++ b/Shipping/CountryCalculators/CountryCalcFactory.php @@ -8,9 +8,8 @@ class CountryCalcFactory { - public function create(IShippingOrder $order): ICountryShippingCalc + public function create($country_code): ICountryShippingCalc { - $country_code = $order->getCountry(); switch ($country_code) { case "PL": diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index 6987e8c..866201b 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -13,11 +13,12 @@ class ShippingCostCalculator { - private $price_factory ; - public function __construct() - { - $this->price_factory = new PriceFactory(); - } + /** + * Use country calculator and decorate it with additional calculations + * @param ICountryShippingCalc $country_calc + * @param IShippingOrder $order + * @return IPrice + */ public function calculate(ICountryShippingCalc $country_calc, IShippingOrder $order):IPrice { //include discounts for special premium days of delivery diff --git a/tests/MainTest.php b/tests/MainTest.php index 9410fb3..78ccc71 100644 --- a/tests/MainTest.php +++ b/tests/MainTest.php @@ -49,6 +49,9 @@ public function start_needToPayPLDiscountANDPremiumBox() } /** + * @feature Orders + * @sceanrio Calculate Shipping Cost + * @case to Poland free delivery above order total * @test */ public function start_freeShippingPL() @@ -60,6 +63,9 @@ public function start_freeShippingPL() } /** + * @feature Orders + * @sceanrio Calculate Shipping Cost + * @case to England free delivery above order total * @test */ public function start_freeShippingUK() @@ -71,6 +77,9 @@ public function start_freeShippingUK() } /** + * @feature Orders + * @sceanrio Calculate Shipping Cost + * @case to US free delivery above order total * @test */ public function start_freeShippingUs() @@ -82,6 +91,9 @@ public function start_freeShippingUs() } /** + * @feature Orders + * @sceanrio Calculate Shipping Cost + * @case to other countries - const delivery price in $ * @test */ public function start_costForUnknowCountries() From a39ff71e75f3f9c3eedcf7f8b87d338bc5029817 Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 28 Sep 2021 20:53:43 +0200 Subject: [PATCH 17/38] small tweaks of PremiumBox with its price factory --- .../AdditionalCalculations/PremiumBox.php | 12 +++---- .../PriceBoxFactory.php | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 Shipping/AdditionalCalculations/PriceBoxFactory.php diff --git a/Shipping/AdditionalCalculations/PremiumBox.php b/Shipping/AdditionalCalculations/PremiumBox.php index 84d22cb..0c3770b 100644 --- a/Shipping/AdditionalCalculations/PremiumBox.php +++ b/Shipping/AdditionalCalculations/PremiumBox.php @@ -16,14 +16,10 @@ protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice if($order->isPremiumBox() ) { $price = 0; - switch($shipping_cost->getCurrencyCode()) - { - case "PLN" : $price = 40; break;//PLN; - case "GBP": $price = 20; break; //GBP - case "$": $price = 17; break;//US $ - default: 17; break; // US $ for the rest of the world - } - $price_summary = $shipping_cost->getValue() + $price; + ///get price box per country + $price_per_country = (new PriceBoxFactory())->create($shipping_cost->getCurrencyCode()); + + $price_summary = $shipping_cost->getValue() + $price_per_country->getValue(); $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); } diff --git a/Shipping/AdditionalCalculations/PriceBoxFactory.php b/Shipping/AdditionalCalculations/PriceBoxFactory.php new file mode 100644 index 0000000..1d6c357 --- /dev/null +++ b/Shipping/AdditionalCalculations/PriceBoxFactory.php @@ -0,0 +1,35 @@ +price_factory = new PriceFactory(); + } + + public function create($country_code):IPrice + { + switch($country_code) + { + case "PLN" : $price = 40; break;//PLN; + case "GBP": $price = 20; break; //GBP + case "$": $price = 17; break;//US $ + default: + $price = 17; + $country_code = '$'; + break; // US $ for the rest of the world + } + + return $this->price_factory->create($country_code, $price); + } +} \ No newline at end of file From 92f0ab77d76d38cedd3b413833c0bae7cc039d70 Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 28 Sep 2021 21:43:21 +0200 Subject: [PATCH 18/38] add CustomBox pricing move CountryCalc factory into ShippingCostCalculator.php --- Contracts/ICustomBox.php | 7 ++++ Main.php | 5 +-- .../BoxPricing/CustomBox.php | 37 +++++++++++++++++++ .../{ => BoxPricing}/PremiumBox.php | 4 +- .../{ => BoxPricing}/PriceBoxFactory.php | 2 +- Shipping/ShippingCostCalculator.php | 22 +++++++++-- 6 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 Contracts/ICustomBox.php create mode 100644 Shipping/AdditionalCalculations/BoxPricing/CustomBox.php rename Shipping/AdditionalCalculations/{ => BoxPricing}/PremiumBox.php (80%) rename Shipping/AdditionalCalculations/{ => BoxPricing}/PriceBoxFactory.php (92%) diff --git a/Contracts/ICustomBox.php b/Contracts/ICustomBox.php new file mode 100644 index 0000000..880b6f1 --- /dev/null +++ b/Contracts/ICustomBox.php @@ -0,0 +1,7 @@ +create($order_adapter->getCountry()); - $calculator_facade = new ShippingCostCalculator(); - return $calculator_facade->calculate($country_calculator, $order_adapter); + return $calculator_facade->calculate($order_adapter); } } \ No newline at end of file diff --git a/Shipping/AdditionalCalculations/BoxPricing/CustomBox.php b/Shipping/AdditionalCalculations/BoxPricing/CustomBox.php new file mode 100644 index 0000000..d2d4654 --- /dev/null +++ b/Shipping/AdditionalCalculations/BoxPricing/CustomBox.php @@ -0,0 +1,37 @@ +price = $price; + + if($price->getValue() < 0 ) { + $this->price = $this->price_factory->create($price->getCurrencyCode(), 0); + } + } + + protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice + { + + + $price_summary = $shipping_cost->getValue() + $this->price->getValue(); + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); + + return $shipping_cost; + } +} \ No newline at end of file diff --git a/Shipping/AdditionalCalculations/PremiumBox.php b/Shipping/AdditionalCalculations/BoxPricing/PremiumBox.php similarity index 80% rename from Shipping/AdditionalCalculations/PremiumBox.php rename to Shipping/AdditionalCalculations/BoxPricing/PremiumBox.php index 0c3770b..888f09c 100644 --- a/Shipping/AdditionalCalculations/PremiumBox.php +++ b/Shipping/AdditionalCalculations/BoxPricing/PremiumBox.php @@ -1,11 +1,13 @@ calc_factory = new CountryCalcFactory(); + } + /** * Use country calculator and decorate it with additional calculations * @param ICountryShippingCalc $country_calc * @param IShippingOrder $order * @return IPrice */ - public function calculate(ICountryShippingCalc $country_calc, IShippingOrder $order):IPrice + public function calculate(IShippingOrder $order):IPrice { + $country_calculator = $this->getCountryCalc($order); + //include discounts for special premium days of delivery //IMPORTANT this has to be called before all other discounts calculations //e.g. Free delivery in special day is not equal that the premium box is free ;) - $with_free_days = new FreeDeliveryDays($country_calc); + $with_free_days = new FreeDeliveryDays($country_calculator); $with_client_discount = new ClientShippingDiscount($with_free_days); $with_premium_boxing = new PremiumBox($with_client_discount); @@ -32,4 +43,9 @@ public function calculate(ICountryShippingCalc $country_calc, IShippingOrder $or return $with_premium_boxing->calculate($order); } + private function getCountryCalc(IShippingOrder $order):ICountryShippingCalc + { + return $this->calc_factory->create($order->getCountry()); + } + } \ No newline at end of file From e019d85658792d84dfe4689ad32f282d0d069a74 Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 28 Sep 2021 22:08:13 +0200 Subject: [PATCH 19/38] add Calc director rename country calc into OrderTotal calc --- Contracts/ICalculate.php | 10 +++++++ Contracts/ICalculationsBuilder.php | 10 +++++++ Main.php | 5 ++-- Shipping/CalculationsDirector.php | 27 +++++++++++++++++++ .../CountryCalculators/CountryCalcFactory.php | 8 +++--- .../{CalcPl.php => OrderTotalPl.php} | 2 +- .../{CalcUk.php => OrderTotalUk.php} | 2 +- .../{CalcUs.php => OrderTotalUs.php} | 2 +- .../{CalcWorld.php => OrderTotalWorld.php} | 2 +- 9 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 Contracts/ICalculate.php create mode 100644 Contracts/ICalculationsBuilder.php create mode 100644 Shipping/CalculationsDirector.php rename Shipping/CountryCalculators/{CalcPl.php => OrderTotalPl.php} (89%) rename Shipping/CountryCalculators/{CalcUk.php => OrderTotalUk.php} (90%) rename Shipping/CountryCalculators/{CalcUs.php => OrderTotalUs.php} (90%) rename Shipping/CountryCalculators/{CalcWorld.php => OrderTotalWorld.php} (87%) diff --git a/Contracts/ICalculate.php b/Contracts/ICalculate.php new file mode 100644 index 0000000..4df81ed --- /dev/null +++ b/Contracts/ICalculate.php @@ -0,0 +1,10 @@ +getFomatedValue(); } + /** + * we want to be independent as much as possible from the original messed Order object + */ private function getWrappedOrder($country_code, $total, $discount = 0, $premium_box = false):IShippingOrder { $immutable_order = new Order($country_code, $total, $discount, $premium_box); - //we want to be independent as much as possible from the oryginal messed Order object - /*@var IShippingOrder $order_adapter */ return new ShippingOrderAdapter($immutable_order); } diff --git a/Shipping/CalculationsDirector.php b/Shipping/CalculationsDirector.php new file mode 100644 index 0000000..e843709 --- /dev/null +++ b/Shipping/CalculationsDirector.php @@ -0,0 +1,27 @@ +calc_builder = $calc_builder; + } + + public function calculate():IPrice + { + $this->calc_builder->useOrderTotal(); + $this->calc_builder->useShippingDiscounts(); + $this->calc_builder->useBoxPricing(); + return $this->calc_builder->makeCalculations(); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/CountryCalcFactory.php b/Shipping/CountryCalculators/CountryCalcFactory.php index ed7bb9f..0d121dc 100644 --- a/Shipping/CountryCalculators/CountryCalcFactory.php +++ b/Shipping/CountryCalculators/CountryCalcFactory.php @@ -13,13 +13,13 @@ public function create($country_code): ICountryShippingCalc switch ($country_code) { case "PL": - return new CalcPl(); + return new OrderTotalPl(); case "UK": - return new CalcUk(); + return new OrderTotalUk(); case "US": - return new CalcUs(); + return new OrderTotalUs(); default: - return new CalcWorld(); + return new OrderTotalWorld(); } } } \ No newline at end of file diff --git a/Shipping/CountryCalculators/CalcPl.php b/Shipping/CountryCalculators/OrderTotalPl.php similarity index 89% rename from Shipping/CountryCalculators/CalcPl.php rename to Shipping/CountryCalculators/OrderTotalPl.php index f5488e3..7f67d4d 100644 --- a/Shipping/CountryCalculators/CalcPl.php +++ b/Shipping/CountryCalculators/OrderTotalPl.php @@ -6,7 +6,7 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PricePl; -class CalcPl implements ICountryShippingCalc +class OrderTotalPl implements ICountryShippingCalc { public function calculate(IShippingOrder $order):IPrice { diff --git a/Shipping/CountryCalculators/CalcUk.php b/Shipping/CountryCalculators/OrderTotalUk.php similarity index 90% rename from Shipping/CountryCalculators/CalcUk.php rename to Shipping/CountryCalculators/OrderTotalUk.php index b17f59d..1ae1098 100644 --- a/Shipping/CountryCalculators/CalcUk.php +++ b/Shipping/CountryCalculators/OrderTotalUk.php @@ -6,7 +6,7 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceUk; -class CalcUk implements ICountryShippingCalc +class OrderTotalUk implements ICountryShippingCalc { public function calculate(IShippingOrder $order):IPrice { diff --git a/Shipping/CountryCalculators/CalcUs.php b/Shipping/CountryCalculators/OrderTotalUs.php similarity index 90% rename from Shipping/CountryCalculators/CalcUs.php rename to Shipping/CountryCalculators/OrderTotalUs.php index 95db62a..ee16b96 100644 --- a/Shipping/CountryCalculators/CalcUs.php +++ b/Shipping/CountryCalculators/OrderTotalUs.php @@ -6,7 +6,7 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceUs; -class CalcUs implements ICountryShippingCalc +class OrderTotalUs implements ICountryShippingCalc { public function calculate(IShippingOrder $order):IPrice { diff --git a/Shipping/CountryCalculators/CalcWorld.php b/Shipping/CountryCalculators/OrderTotalWorld.php similarity index 87% rename from Shipping/CountryCalculators/CalcWorld.php rename to Shipping/CountryCalculators/OrderTotalWorld.php index f420767..ca3d83d 100644 --- a/Shipping/CountryCalculators/CalcWorld.php +++ b/Shipping/CountryCalculators/OrderTotalWorld.php @@ -8,7 +8,7 @@ use App\Contracts\IShippingOrder; use App\Shipping\Price\PriceUs; -class CalcWorld implements ICountryShippingCalc +class OrderTotalWorld implements ICountryShippingCalc { public function calculate(IShippingOrder $order): IPrice { From b88b9595528299fe3bd88304d347fe6f8a46b35d Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 28 Sep 2021 23:34:33 +0200 Subject: [PATCH 20/38] first working version with logic separation by countries --- Contracts/ICalculationsBuilder.php | 8 ++-- .../BoxPricing/PremiumBox.php | 30 ------------ .../BoxPricing/PriceBoxFactory.php | 35 -------------- Shipping/CalculationsDirector.php | 15 ++++-- .../AdditionalCalc.php | 2 +- .../BoxPricing/CustomBox.php | 0 .../ClientShippingDiscount.php | 2 +- .../FreeDeliveryDays.php | 2 +- .../BoxPricing/PremiumBoxWorld.php | 26 ++++++++++ .../CalculationsBuilderWorld.php | 48 +++++++++++++++++++ .../OtherCountries}/OrderTotalWorld.php | 2 +- .../Countries/Pl/BoxPricing/PremiumBoxPl.php | 26 ++++++++++ .../Countries/Pl/CalculationsBuilderPl.php | 46 ++++++++++++++++++ .../Pl}/OrderTotalPl.php | 3 +- Shipping/{Price => Countries/Pl}/PricePL.php | 2 +- .../Countries/Uk/BoxPricing/PremiumBoxUk.php | 25 ++++++++++ .../Countries/Uk/CalculationsBuilderUk.php | 48 +++++++++++++++++++ .../Uk}/OrderTotalUk.php | 2 +- .../Countries/Us/BoxPricing/PremiumBoxUs.php | 25 ++++++++++ .../Countries/Us/CalculationsBuilderUs.php | 48 +++++++++++++++++++ .../Us}/OrderTotalUs.php | 2 +- Shipping/CountryCalcFactory.php | 30 ++++++++++++ .../CountryCalculators/CountryCalcFactory.php | 25 ---------- Shipping/Price/PriceFactory.php | 1 + Shipping/ShippingCostCalculator.php | 41 ++-------------- 25 files changed, 350 insertions(+), 144 deletions(-) delete mode 100644 Shipping/AdditionalCalculations/BoxPricing/PremiumBox.php delete mode 100644 Shipping/AdditionalCalculations/BoxPricing/PriceBoxFactory.php rename Shipping/{AdditionalCalculations => CommonCalculations}/AdditionalCalc.php (93%) rename Shipping/{AdditionalCalculations => CommonCalculations}/BoxPricing/CustomBox.php (100%) rename Shipping/{AdditionalCalculations => CommonCalculations}/ClientShippingDiscount.php (94%) rename Shipping/{AdditionalCalculations => CommonCalculations}/FreeDeliveryDays.php (92%) create mode 100644 Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php create mode 100644 Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php rename Shipping/{CountryCalculators => Countries/OtherCountries}/OrderTotalWorld.php (88%) create mode 100644 Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php create mode 100644 Shipping/Countries/Pl/CalculationsBuilderPl.php rename Shipping/{CountryCalculators => Countries/Pl}/OrderTotalPl.php (85%) rename Shipping/{Price => Countries/Pl}/PricePL.php (92%) create mode 100644 Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php create mode 100644 Shipping/Countries/Uk/CalculationsBuilderUk.php rename Shipping/{CountryCalculators => Countries/Uk}/OrderTotalUk.php (91%) create mode 100644 Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php create mode 100644 Shipping/Countries/Us/CalculationsBuilderUs.php rename Shipping/{CountryCalculators => Countries/Us}/OrderTotalUs.php (91%) create mode 100644 Shipping/CountryCalcFactory.php delete mode 100644 Shipping/CountryCalculators/CountryCalcFactory.php diff --git a/Contracts/ICalculationsBuilder.php b/Contracts/ICalculationsBuilder.php index cd57979..95ad2c6 100644 --- a/Contracts/ICalculationsBuilder.php +++ b/Contracts/ICalculationsBuilder.php @@ -3,8 +3,8 @@ interface ICalculationsBuilder { - public function useOrderTotal(); - public function useShippingDiscounts(); - public function useBoxPricing(); - public function makeCalculations():IPrice; + public function useOrderTotal():ICountryShippingCalc; + public function useShippingDiscounts(ICountryShippingCalc $calculations_component); + public function useBoxPricing(ICountryShippingCalc $calculations_component); + public function makeCalculations(ICountryShippingCalc $calculations_component):IPrice; } \ No newline at end of file diff --git a/Shipping/AdditionalCalculations/BoxPricing/PremiumBox.php b/Shipping/AdditionalCalculations/BoxPricing/PremiumBox.php deleted file mode 100644 index 888f09c..0000000 --- a/Shipping/AdditionalCalculations/BoxPricing/PremiumBox.php +++ /dev/null @@ -1,30 +0,0 @@ -isPremiumBox() ) - { - $price = 0; - ///get price box per country - $price_per_country = (new PriceBoxFactory())->create($shipping_cost->getCurrencyCode()); - - $price_summary = $shipping_cost->getValue() + $price_per_country->getValue(); - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); - } - - return $shipping_cost; - } -} \ No newline at end of file diff --git a/Shipping/AdditionalCalculations/BoxPricing/PriceBoxFactory.php b/Shipping/AdditionalCalculations/BoxPricing/PriceBoxFactory.php deleted file mode 100644 index 8154017..0000000 --- a/Shipping/AdditionalCalculations/BoxPricing/PriceBoxFactory.php +++ /dev/null @@ -1,35 +0,0 @@ -price_factory = new PriceFactory(); - } - - public function create($country_code):IPrice - { - switch($country_code) - { - case "PLN" : $price = 40; break;//PLN; - case "GBP": $price = 20; break; //GBP - case "$": $price = 17; break;//US $ - default: - $price = 17; - $country_code = '$'; - break; // US $ for the rest of the world - } - - return $this->price_factory->create($country_code, $price); - } -} \ No newline at end of file diff --git a/Shipping/CalculationsDirector.php b/Shipping/CalculationsDirector.php index e843709..95dc571 100644 --- a/Shipping/CalculationsDirector.php +++ b/Shipping/CalculationsDirector.php @@ -19,9 +19,16 @@ public function __construct(ICalculationsBuilder $calc_builder) public function calculate():IPrice { - $this->calc_builder->useOrderTotal(); - $this->calc_builder->useShippingDiscounts(); - $this->calc_builder->useBoxPricing(); - return $this->calc_builder->makeCalculations(); + //this is the main shipping cost calculation + $calculator = $this->calc_builder->useOrderTotal(); + + //these has to be always calculated as first after total order value + $decorate = $this->calc_builder->useShippingDiscounts($calculator); + + //other calculations + $decorate = $this->calc_builder->useBoxPricing($decorate); + + //get calculations chain result + return $this->calc_builder->makeCalculations($decorate); } } \ No newline at end of file diff --git a/Shipping/AdditionalCalculations/AdditionalCalc.php b/Shipping/CommonCalculations/AdditionalCalc.php similarity index 93% rename from Shipping/AdditionalCalculations/AdditionalCalc.php rename to Shipping/CommonCalculations/AdditionalCalc.php index 747fc5a..b1ebf0c 100644 --- a/Shipping/AdditionalCalculations/AdditionalCalc.php +++ b/Shipping/CommonCalculations/AdditionalCalc.php @@ -1,7 +1,7 @@ isPremiumBox() ) + { + $price_summary = $shipping_cost->getValue() + $this->country_price; + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); + } + + return $shipping_cost; + } +} \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php new file mode 100644 index 0000000..359dddd --- /dev/null +++ b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php @@ -0,0 +1,48 @@ +order = $order; + } + + public function useOrderTotal():ICountryShippingCalc + { + return new OrderTotalWorld(); + } + + public function useShippingDiscounts(ICountryShippingCalc $calculations_component) + { + $with_free_days = new FreeDeliveryDays($calculations_component); + return new ClientShippingDiscount($with_free_days); + } + + public function useBoxPricing(ICountryShippingCalc $calculations_component) + { + if($this->order->isPremiumBox() ) + { + return new PremiumBoxWorld($calculations_component); + } + + return $calculations_component; + } + + public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice + { + return $calculations_component->calculate($this->order); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/OrderTotalWorld.php b/Shipping/Countries/OtherCountries/OrderTotalWorld.php similarity index 88% rename from Shipping/CountryCalculators/OrderTotalWorld.php rename to Shipping/Countries/OtherCountries/OrderTotalWorld.php index ca3d83d..49198e4 100644 --- a/Shipping/CountryCalculators/OrderTotalWorld.php +++ b/Shipping/Countries/OtherCountries/OrderTotalWorld.php @@ -1,7 +1,7 @@ isPremiumBox() ) + { + $price_summary = $shipping_cost->getValue() + $this->country_price; + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); + } + + return $shipping_cost; + } +} \ No newline at end of file diff --git a/Shipping/Countries/Pl/CalculationsBuilderPl.php b/Shipping/Countries/Pl/CalculationsBuilderPl.php new file mode 100644 index 0000000..ab9e4a0 --- /dev/null +++ b/Shipping/Countries/Pl/CalculationsBuilderPl.php @@ -0,0 +1,46 @@ +order = $order; + } + + public function useOrderTotal():ICountryShippingCalc + { + return new OrderTotalPl(); + } + + public function useShippingDiscounts(ICountryShippingCalc $calculations_component) + { + $with_free_days = new FreeDeliveryDays($calculations_component); + return new ClientShippingDiscount($with_free_days); + } + + public function useBoxPricing(ICountryShippingCalc $calculations_component) + { + if($this->order->isPremiumBox() ) + { + return new PremiumBoxPl($calculations_component); + } + + return $calculations_component; + } + + public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice + { + return $calculations_component->calculate($this->order); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/OrderTotalPl.php b/Shipping/Countries/Pl/OrderTotalPl.php similarity index 85% rename from Shipping/CountryCalculators/OrderTotalPl.php rename to Shipping/Countries/Pl/OrderTotalPl.php index 7f67d4d..fdddeb1 100644 --- a/Shipping/CountryCalculators/OrderTotalPl.php +++ b/Shipping/Countries/Pl/OrderTotalPl.php @@ -1,10 +1,9 @@ isPremiumBox() ) + { + $price_summary = $shipping_cost->getValue() + $this->country_price; + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); + } + + return $shipping_cost; + } +} \ No newline at end of file diff --git a/Shipping/Countries/Uk/CalculationsBuilderUk.php b/Shipping/Countries/Uk/CalculationsBuilderUk.php new file mode 100644 index 0000000..3340694 --- /dev/null +++ b/Shipping/Countries/Uk/CalculationsBuilderUk.php @@ -0,0 +1,48 @@ +order = $order; + } + + public function useOrderTotal():ICountryShippingCalc + { + return new OrderTotalUk(); + } + + public function useShippingDiscounts(ICountryShippingCalc $calculations_component) + { + $with_free_days = new FreeDeliveryDays($calculations_component); + return new ClientShippingDiscount($with_free_days); + } + + public function useBoxPricing(ICountryShippingCalc $calculations_component) + { + if($this->order->isPremiumBox() ) + { + return new PremiumBoxUk($calculations_component); + } + + return $calculations_component; + } + + public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice + { + return $calculations_component->calculate($this->order); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/OrderTotalUk.php b/Shipping/Countries/Uk/OrderTotalUk.php similarity index 91% rename from Shipping/CountryCalculators/OrderTotalUk.php rename to Shipping/Countries/Uk/OrderTotalUk.php index 1ae1098..678237c 100644 --- a/Shipping/CountryCalculators/OrderTotalUk.php +++ b/Shipping/Countries/Uk/OrderTotalUk.php @@ -1,5 +1,5 @@ isPremiumBox() ) + { + $price_summary = $shipping_cost->getValue() + $this->country_price; + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); + } + + return $shipping_cost; + } +} \ No newline at end of file diff --git a/Shipping/Countries/Us/CalculationsBuilderUs.php b/Shipping/Countries/Us/CalculationsBuilderUs.php new file mode 100644 index 0000000..49d8934 --- /dev/null +++ b/Shipping/Countries/Us/CalculationsBuilderUs.php @@ -0,0 +1,48 @@ +order = $order; + } + + public function useOrderTotal():ICountryShippingCalc + { + return new OrderTotalUs(); + } + + public function useShippingDiscounts(ICountryShippingCalc $calculations_component) + { + $with_free_days = new FreeDeliveryDays($calculations_component); + return new ClientShippingDiscount($with_free_days); + } + + public function useBoxPricing(ICountryShippingCalc $calculations_component) + { + if($this->order->isPremiumBox() ) + { + return new PremiumBoxUs($calculations_component); + } + + return $calculations_component; + } + + public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice + { + return $calculations_component->calculate($this->order); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/OrderTotalUs.php b/Shipping/Countries/Us/OrderTotalUs.php similarity index 91% rename from Shipping/CountryCalculators/OrderTotalUs.php rename to Shipping/Countries/Us/OrderTotalUs.php index ee16b96..60c51f4 100644 --- a/Shipping/CountryCalculators/OrderTotalUs.php +++ b/Shipping/Countries/Us/OrderTotalUs.php @@ -1,5 +1,5 @@ getCountry()) + { + case "PL": + return new PlBuilder($order); + case "UK": + return new UkBuilder($order); + case "US": + return new UsBuilder($order); + default: + return new OthersBuilder($order); + } + } +} \ No newline at end of file diff --git a/Shipping/CountryCalculators/CountryCalcFactory.php b/Shipping/CountryCalculators/CountryCalcFactory.php deleted file mode 100644 index 0d121dc..0000000 --- a/Shipping/CountryCalculators/CountryCalcFactory.php +++ /dev/null @@ -1,25 +0,0 @@ -calc_factory = new CountryCalcFactory(); - } - - /** - * Use country calculator and decorate it with additional calculations - * @param ICountryShippingCalc $country_calc - * @param IShippingOrder $order - * @return IPrice - */ public function calculate(IShippingOrder $order):IPrice { - $country_calculator = $this->getCountryCalc($order); - - //include discounts for special premium days of delivery - //IMPORTANT this has to be called before all other discounts calculations - //e.g. Free delivery in special day is not equal that the premium box is free ;) - $with_free_days = new FreeDeliveryDays($country_calculator); + $calc_factory = new CountryCalcFactory(); + $country_calculations_builder = $calc_factory->create($order); + $calculations_director = new CalculationsDirector($country_calculations_builder); - $with_client_discount = new ClientShippingDiscount($with_free_days); - $with_premium_boxing = new PremiumBox($with_client_discount); - - return $with_premium_boxing->calculate($order); + return $calculations_director->calculate(); } - - private function getCountryCalc(IShippingOrder $order):ICountryShippingCalc - { - return $this->calc_factory->create($order->getCountry()); - } - } \ No newline at end of file From 0c29892deac0affb4712ac73da39437e122ca851 Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 28 Sep 2021 23:45:32 +0200 Subject: [PATCH 21/38] clean up Price by country classes --- .../OtherCountries/OrderTotalWorld.php | 2 +- .../Countries/OtherCountries/PriceWorld.php | 30 +++++++++++++++++++ Shipping/Countries/Uk/OrderTotalUk.php | 1 - Shipping/{Price => Countries/Uk}/PriceUk.php | 2 +- Shipping/Countries/Us/OrderTotalUs.php | 1 - Shipping/{Price => Countries/Us}/PriceUs.php | 2 +- Shipping/Price/PriceFactory.php | 5 +++- tests/MainTest.php | 2 +- 8 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 Shipping/Countries/OtherCountries/PriceWorld.php rename Shipping/{Price => Countries/Uk}/PriceUk.php (92%) rename Shipping/{Price => Countries/Us}/PriceUs.php (92%) diff --git a/Shipping/Countries/OtherCountries/OrderTotalWorld.php b/Shipping/Countries/OtherCountries/OrderTotalWorld.php index 49198e4..d0d1b35 100644 --- a/Shipping/Countries/OtherCountries/OrderTotalWorld.php +++ b/Shipping/Countries/OtherCountries/OrderTotalWorld.php @@ -13,6 +13,6 @@ class OrderTotalWorld implements ICountryShippingCalc public function calculate(IShippingOrder $order): IPrice { //we don't care for the order total value, always add shipping cost - return new PriceUs(299); + return new PriceWorld(299); } } \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/PriceWorld.php b/Shipping/Countries/OtherCountries/PriceWorld.php new file mode 100644 index 0000000..c4c8ec7 --- /dev/null +++ b/Shipping/Countries/OtherCountries/PriceWorld.php @@ -0,0 +1,30 @@ +value = $value; + } + + public function getValue() + { + return $this->value; + } + + public function getCurrencyCode() + { + return $this->currency_code; + } + + public function getFomatedValue() + { + return $this->currency_code.$this->value; + } +} \ No newline at end of file diff --git a/Shipping/Countries/Uk/OrderTotalUk.php b/Shipping/Countries/Uk/OrderTotalUk.php index 678237c..918e9e9 100644 --- a/Shipping/Countries/Uk/OrderTotalUk.php +++ b/Shipping/Countries/Uk/OrderTotalUk.php @@ -4,7 +4,6 @@ use App\Contracts\ICountryShippingCalc; use App\Contracts\IPrice; use App\Contracts\IShippingOrder; -use App\Shipping\Price\PriceUk; class OrderTotalUk implements ICountryShippingCalc { diff --git a/Shipping/Price/PriceUk.php b/Shipping/Countries/Uk/PriceUk.php similarity index 92% rename from Shipping/Price/PriceUk.php rename to Shipping/Countries/Uk/PriceUk.php index 9c44eaa..f0717a0 100644 --- a/Shipping/Price/PriceUk.php +++ b/Shipping/Countries/Uk/PriceUk.php @@ -1,5 +1,5 @@ start("Nigeria", 2450); - $this->assertEquals('$299', $result); + $this->assertEquals('ETH299', $result); } } \ No newline at end of file From c52a39d3cdf3a78e837fb70a4f975e84cb3b078d Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 28 Sep 2021 23:59:07 +0200 Subject: [PATCH 22/38] extract DRY on builders to abstract class --- .../CommonCalculations/AdditionalCalc.php | 2 +- Shipping/Countries/CalculationsBuilder.php | 37 +++++++++++++++++++ .../CalculationsBuilderWorld.php | 36 ++---------------- .../Countries/Pl/CalculationsBuilderPl.php | 33 ++--------------- .../Countries/Uk/CalculationsBuilderUk.php | 35 ++---------------- .../Countries/Us/CalculationsBuilderUs.php | 35 ++---------------- Shipping/{Price => }/PriceFactory.php | 2 +- 7 files changed, 52 insertions(+), 128 deletions(-) create mode 100644 Shipping/Countries/CalculationsBuilder.php rename Shipping/{Price => }/PriceFactory.php (95%) diff --git a/Shipping/CommonCalculations/AdditionalCalc.php b/Shipping/CommonCalculations/AdditionalCalc.php index b1ebf0c..a520b05 100644 --- a/Shipping/CommonCalculations/AdditionalCalc.php +++ b/Shipping/CommonCalculations/AdditionalCalc.php @@ -6,7 +6,7 @@ use App\Contracts\IPrice; use App\Contracts\IShippingOrder; -use App\Shipping\Price\PriceFactory; +use App\Shipping\PriceFactory; abstract class AdditionalCalc implements ICountryShippingCalc { diff --git a/Shipping/Countries/CalculationsBuilder.php b/Shipping/Countries/CalculationsBuilder.php new file mode 100644 index 0000000..529f747 --- /dev/null +++ b/Shipping/Countries/CalculationsBuilder.php @@ -0,0 +1,37 @@ +order = $order; + } + + public function useShippingDiscounts(ICountryShippingCalc $calculations_component) + { + $with_free_days = new FreeDeliveryDays($calculations_component); + return new ClientShippingDiscount($with_free_days); + } + + public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice + { + return $calculations_component->calculate($this->order); + } + + abstract public function useOrderTotal():ICountryShippingCalc; + + abstract public function useBoxPricing(ICountryShippingCalc $calculations_component); + + +} \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php index 359dddd..4767398 100644 --- a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php +++ b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php @@ -1,48 +1,20 @@ order = $order; - } +class CalculationsBuilderWorld extends CalculationsBuilder +{ public function useOrderTotal():ICountryShippingCalc { return new OrderTotalWorld(); } - public function useShippingDiscounts(ICountryShippingCalc $calculations_component) - { - $with_free_days = new FreeDeliveryDays($calculations_component); - return new ClientShippingDiscount($with_free_days); - } - public function useBoxPricing(ICountryShippingCalc $calculations_component) { - if($this->order->isPremiumBox() ) - { - return new PremiumBoxWorld($calculations_component); - } - - return $calculations_component; - } - - public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice - { - return $calculations_component->calculate($this->order); + return new PremiumBoxWorld($calculations_component); } } \ No newline at end of file diff --git a/Shipping/Countries/Pl/CalculationsBuilderPl.php b/Shipping/Countries/Pl/CalculationsBuilderPl.php index ab9e4a0..124df4a 100644 --- a/Shipping/Countries/Pl/CalculationsBuilderPl.php +++ b/Shipping/Countries/Pl/CalculationsBuilderPl.php @@ -1,46 +1,19 @@ order = $order; - } - public function useOrderTotal():ICountryShippingCalc { return new OrderTotalPl(); } - public function useShippingDiscounts(ICountryShippingCalc $calculations_component) - { - $with_free_days = new FreeDeliveryDays($calculations_component); - return new ClientShippingDiscount($with_free_days); - } - public function useBoxPricing(ICountryShippingCalc $calculations_component) { - if($this->order->isPremiumBox() ) - { - return new PremiumBoxPl($calculations_component); - } - - return $calculations_component; - } - - public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice - { - return $calculations_component->calculate($this->order); + return new PremiumBoxPl($calculations_component); } } \ No newline at end of file diff --git a/Shipping/Countries/Uk/CalculationsBuilderUk.php b/Shipping/Countries/Uk/CalculationsBuilderUk.php index 3340694..80812f2 100644 --- a/Shipping/Countries/Uk/CalculationsBuilderUk.php +++ b/Shipping/Countries/Uk/CalculationsBuilderUk.php @@ -1,48 +1,19 @@ order = $order; - } - public function useOrderTotal():ICountryShippingCalc { return new OrderTotalUk(); } - public function useShippingDiscounts(ICountryShippingCalc $calculations_component) - { - $with_free_days = new FreeDeliveryDays($calculations_component); - return new ClientShippingDiscount($with_free_days); - } - public function useBoxPricing(ICountryShippingCalc $calculations_component) { - if($this->order->isPremiumBox() ) - { - return new PremiumBoxUk($calculations_component); - } - - return $calculations_component; - } - - public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice - { - return $calculations_component->calculate($this->order); + return new PremiumBoxUk($calculations_component); } } \ No newline at end of file diff --git a/Shipping/Countries/Us/CalculationsBuilderUs.php b/Shipping/Countries/Us/CalculationsBuilderUs.php index 49d8934..7e9f9d8 100644 --- a/Shipping/Countries/Us/CalculationsBuilderUs.php +++ b/Shipping/Countries/Us/CalculationsBuilderUs.php @@ -1,48 +1,19 @@ order = $order; - } - public function useOrderTotal():ICountryShippingCalc { return new OrderTotalUs(); } - public function useShippingDiscounts(ICountryShippingCalc $calculations_component) - { - $with_free_days = new FreeDeliveryDays($calculations_component); - return new ClientShippingDiscount($with_free_days); - } - public function useBoxPricing(ICountryShippingCalc $calculations_component) { - if($this->order->isPremiumBox() ) - { - return new PremiumBoxUs($calculations_component); - } - - return $calculations_component; - } - - public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice - { - return $calculations_component->calculate($this->order); + return new PremiumBoxUs($calculations_component); } } \ No newline at end of file diff --git a/Shipping/Price/PriceFactory.php b/Shipping/PriceFactory.php similarity index 95% rename from Shipping/Price/PriceFactory.php rename to Shipping/PriceFactory.php index 224a3e1..ca477a3 100644 --- a/Shipping/Price/PriceFactory.php +++ b/Shipping/PriceFactory.php @@ -1,5 +1,5 @@ Date: Wed, 29 Sep 2021 00:20:03 +0200 Subject: [PATCH 23/38] replace decorator with direct destination methods call --- Contracts/ICalculationsBuilder.php | 7 +++---- Shipping/CalculationsDirector.php | 5 +---- .../CommonCalculations/AdditionalCalc.php | 9 ++++----- Shipping/Countries/CalculationsBuilder.php | 19 +++++++------------ .../CalculationsBuilderWorld.php | 9 +++++---- .../Countries/Pl/CalculationsBuilderPl.php | 9 +++++---- .../Countries/Uk/CalculationsBuilderUk.php | 9 +++++---- .../Countries/Us/CalculationsBuilderUs.php | 9 +++++---- 8 files changed, 35 insertions(+), 41 deletions(-) diff --git a/Contracts/ICalculationsBuilder.php b/Contracts/ICalculationsBuilder.php index 95ad2c6..72a66af 100644 --- a/Contracts/ICalculationsBuilder.php +++ b/Contracts/ICalculationsBuilder.php @@ -3,8 +3,7 @@ interface ICalculationsBuilder { - public function useOrderTotal():ICountryShippingCalc; - public function useShippingDiscounts(ICountryShippingCalc $calculations_component); - public function useBoxPricing(ICountryShippingCalc $calculations_component); - public function makeCalculations(ICountryShippingCalc $calculations_component):IPrice; + public function useOrderTotal():IPrice; + public function useShippingDiscounts(IPrice $price):IPrice; + public function useBoxPricing(IPrice $price):IPrice; } \ No newline at end of file diff --git a/Shipping/CalculationsDirector.php b/Shipping/CalculationsDirector.php index 95dc571..c33c0bf 100644 --- a/Shipping/CalculationsDirector.php +++ b/Shipping/CalculationsDirector.php @@ -26,9 +26,6 @@ public function calculate():IPrice $decorate = $this->calc_builder->useShippingDiscounts($calculator); //other calculations - $decorate = $this->calc_builder->useBoxPricing($decorate); - - //get calculations chain result - return $this->calc_builder->makeCalculations($decorate); + return $this->calc_builder->useBoxPricing($decorate); } } \ No newline at end of file diff --git a/Shipping/CommonCalculations/AdditionalCalc.php b/Shipping/CommonCalculations/AdditionalCalc.php index a520b05..b78700a 100644 --- a/Shipping/CommonCalculations/AdditionalCalc.php +++ b/Shipping/CommonCalculations/AdditionalCalc.php @@ -11,19 +11,18 @@ abstract class AdditionalCalc implements ICountryShippingCalc { - protected ICountryShippingCalc $calc; + protected IPrice $price; protected $price_factory ; - public function __construct(ICountryShippingCalc $calc) + public function __construct(IPrice $price) { - $this->calc = $calc; + $this->price = $price; $this->price_factory = new PriceFactory(); } public function calculate(IShippingOrder $order): IPrice { - $shipping_cost = $this->calc->calculate($order); - return $this->decorate($shipping_cost, $order); + return $this->decorate($this->price, $order); } abstract protected function decorate(IPrice $shipping_cost, IShippingOrder $order): IPrice; diff --git a/Shipping/Countries/CalculationsBuilder.php b/Shipping/Countries/CalculationsBuilder.php index 529f747..3dc43a6 100644 --- a/Shipping/Countries/CalculationsBuilder.php +++ b/Shipping/Countries/CalculationsBuilder.php @@ -3,11 +3,11 @@ use App\Contracts\ICalculationsBuilder; use App\Contracts\ICountryShippingCalc; +use App\Contracts\IPrice; use App\Contracts\IShippingOrder; use App\Shipping\CommonCalculations\ClientShippingDiscount; use App\Shipping\CommonCalculations\FreeDeliveryDays; -use App\Shipping\Countries\Pl\BoxPricing\PremiumBoxPl; -use App\Shipping\Countries\Us\BoxPricing\PremiumBoxUs; + abstract class CalculationsBuilder implements ICalculationsBuilder { @@ -18,20 +18,15 @@ public function __construct(IShippingOrder $order) $this->order = $order; } - public function useShippingDiscounts(ICountryShippingCalc $calculations_component) - { - $with_free_days = new FreeDeliveryDays($calculations_component); - return new ClientShippingDiscount($with_free_days); - } - - public function makeCalculations(ICountryShippingCalc $calculations_component): \App\Contracts\IPrice + public function useShippingDiscounts(IPrice $price): IPrice { - return $calculations_component->calculate($this->order); + $with_free_days = (new FreeDeliveryDays($price))->calculate($this->order); + return (new ClientShippingDiscount($with_free_days))->calculate($this->order); } - abstract public function useOrderTotal():ICountryShippingCalc; + abstract public function useOrderTotal():IPrice; - abstract public function useBoxPricing(ICountryShippingCalc $calculations_component); + abstract public function useBoxPricing(IPrice $price):IPrice; } \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php index 4767398..f7e6435 100644 --- a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php +++ b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php @@ -2,19 +2,20 @@ namespace App\Shipping\Countries\OtherCountries; use App\Contracts\ICountryShippingCalc; +use App\Contracts\IPrice; use App\Shipping\Countries\CalculationsBuilder; use App\Shipping\Countries\OtherCountries\BoxPricing\PremiumBoxWorld; class CalculationsBuilderWorld extends CalculationsBuilder { - public function useOrderTotal():ICountryShippingCalc + public function useOrderTotal():IPrice { - return new OrderTotalWorld(); + return (new OrderTotalWorld())->calculate($this->order); } - public function useBoxPricing(ICountryShippingCalc $calculations_component) + public function useBoxPricing(IPrice $price):IPrice { - return new PremiumBoxWorld($calculations_component); + return (new PremiumBoxWorld($price))->calculate($this->order); } } \ No newline at end of file diff --git a/Shipping/Countries/Pl/CalculationsBuilderPl.php b/Shipping/Countries/Pl/CalculationsBuilderPl.php index 124df4a..aacdfa7 100644 --- a/Shipping/Countries/Pl/CalculationsBuilderPl.php +++ b/Shipping/Countries/Pl/CalculationsBuilderPl.php @@ -2,18 +2,19 @@ namespace App\Shipping\Countries\Pl; use App\Contracts\ICountryShippingCalc; +use App\Contracts\IPrice; use App\Shipping\Countries\CalculationsBuilder; use App\Shipping\Countries\Pl\BoxPricing\PremiumBoxPl; class CalculationsBuilderPl extends CalculationsBuilder { - public function useOrderTotal():ICountryShippingCalc + public function useOrderTotal():IPrice { - return new OrderTotalPl(); + return (new OrderTotalPl())->calculate($this->order); } - public function useBoxPricing(ICountryShippingCalc $calculations_component) + public function useBoxPricing(IPrice $price):IPrice { - return new PremiumBoxPl($calculations_component); + return (new PremiumBoxPl($price))->calculate($this->order); } } \ No newline at end of file diff --git a/Shipping/Countries/Uk/CalculationsBuilderUk.php b/Shipping/Countries/Uk/CalculationsBuilderUk.php index 80812f2..376e4d5 100644 --- a/Shipping/Countries/Uk/CalculationsBuilderUk.php +++ b/Shipping/Countries/Uk/CalculationsBuilderUk.php @@ -2,18 +2,19 @@ namespace App\Shipping\Countries\Uk; use App\Contracts\ICountryShippingCalc; +use App\Contracts\IPrice; use App\Shipping\Countries\CalculationsBuilder; use App\Shipping\Countries\Uk\BoxPricing\PremiumBoxUk; class CalculationsBuilderUk extends CalculationsBuilder { - public function useOrderTotal():ICountryShippingCalc + public function useOrderTotal():IPrice { - return new OrderTotalUk(); + return (new OrderTotalUk())->calculate($this->order); } - public function useBoxPricing(ICountryShippingCalc $calculations_component) + public function useBoxPricing(IPrice $price):IPrice { - return new PremiumBoxUk($calculations_component); + return (new PremiumBoxUk($price))->calculate($this->order); } } \ No newline at end of file diff --git a/Shipping/Countries/Us/CalculationsBuilderUs.php b/Shipping/Countries/Us/CalculationsBuilderUs.php index 7e9f9d8..97a948e 100644 --- a/Shipping/Countries/Us/CalculationsBuilderUs.php +++ b/Shipping/Countries/Us/CalculationsBuilderUs.php @@ -2,18 +2,19 @@ namespace App\Shipping\Countries\Us; use App\Contracts\ICountryShippingCalc; +use App\Contracts\IPrice; use App\Shipping\Countries\CalculationsBuilder; use App\Shipping\Countries\Us\BoxPricing\PremiumBoxUs; class CalculationsBuilderUs extends CalculationsBuilder { - public function useOrderTotal():ICountryShippingCalc + public function useOrderTotal():IPrice { - return new OrderTotalUs(); + return (new OrderTotalUs())->calculate($this->order); } - public function useBoxPricing(ICountryShippingCalc $calculations_component) + public function useBoxPricing(IPrice $price):IPrice { - return new PremiumBoxUs($calculations_component); + return (new PremiumBoxUs($price))->calculate($this->order); } } \ No newline at end of file From b9f6fd1773715156cb9f75a069b4359dfa9f2494 Mon Sep 17 00:00:00 2001 From: andrzej Date: Wed, 29 Sep 2021 06:29:33 +0200 Subject: [PATCH 24/38] DRY - remove multiple buiders into one class first working wersion --- Shipping/Countries/CalculationsBuilder.php | 26 +++++++++++---- .../CalculationsBuilderWorld.php | 21 ------------ .../Countries/Pl/CalculationsBuilderPl.php | 20 ------------ .../Countries/Uk/CalculationsBuilderUk.php | 20 ------------ .../Countries/Us/CalculationsBuilderUs.php | 20 ------------ Shipping/CountryCalcFactory.php | 32 ++++++++++++++----- 6 files changed, 44 insertions(+), 95 deletions(-) delete mode 100644 Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php delete mode 100644 Shipping/Countries/Pl/CalculationsBuilderPl.php delete mode 100644 Shipping/Countries/Uk/CalculationsBuilderUk.php delete mode 100644 Shipping/Countries/Us/CalculationsBuilderUs.php diff --git a/Shipping/Countries/CalculationsBuilder.php b/Shipping/Countries/CalculationsBuilder.php index 3dc43a6..a98b934 100644 --- a/Shipping/Countries/CalculationsBuilder.php +++ b/Shipping/Countries/CalculationsBuilder.php @@ -9,24 +9,38 @@ use App\Shipping\CommonCalculations\FreeDeliveryDays; -abstract class CalculationsBuilder implements ICalculationsBuilder + +class CalculationsBuilder implements ICalculationsBuilder { protected IShippingOrder $order; + protected ICountryShippingCalc $order_total; + protected ICountryShippingCalc $box_pricing; - public function __construct(IShippingOrder $order) + public function __construct(IShippingOrder $order, ICountryShippingCalc $box_pricing, ICountryShippingCalc $order_total) { $this->order = $order; + $this->order_total = $order_total; + $this->box_pricing = $box_pricing; } public function useShippingDiscounts(IPrice $price): IPrice { - $with_free_days = (new FreeDeliveryDays($price))->calculate($this->order); - return (new ClientShippingDiscount($with_free_days))->calculate($this->order); + $free_days_decorator = (new FreeDeliveryDays($price))->calculate($this->order); + return (new ClientShippingDiscount($free_days_decorator))->calculate($this->order); + } + + public function useOrderTotal():IPrice + { + return $this->order_total->calculate($this->order); } - abstract public function useOrderTotal():IPrice; + public function useBoxPricing(IPrice $price):IPrice + { + $box_pricing_class = get_class($this->box_pricing); + $premium_box_decorator = new $box_pricing_class($price); - abstract public function useBoxPricing(IPrice $price):IPrice; + return $premium_box_decorator->calculate($this->order); + } } \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php deleted file mode 100644 index f7e6435..0000000 --- a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php +++ /dev/null @@ -1,21 +0,0 @@ -calculate($this->order); - } - - public function useBoxPricing(IPrice $price):IPrice - { - return (new PremiumBoxWorld($price))->calculate($this->order); - } -} \ No newline at end of file diff --git a/Shipping/Countries/Pl/CalculationsBuilderPl.php b/Shipping/Countries/Pl/CalculationsBuilderPl.php deleted file mode 100644 index aacdfa7..0000000 --- a/Shipping/Countries/Pl/CalculationsBuilderPl.php +++ /dev/null @@ -1,20 +0,0 @@ -calculate($this->order); - } - - public function useBoxPricing(IPrice $price):IPrice - { - return (new PremiumBoxPl($price))->calculate($this->order); - } -} \ No newline at end of file diff --git a/Shipping/Countries/Uk/CalculationsBuilderUk.php b/Shipping/Countries/Uk/CalculationsBuilderUk.php deleted file mode 100644 index 376e4d5..0000000 --- a/Shipping/Countries/Uk/CalculationsBuilderUk.php +++ /dev/null @@ -1,20 +0,0 @@ -calculate($this->order); - } - - public function useBoxPricing(IPrice $price):IPrice - { - return (new PremiumBoxUk($price))->calculate($this->order); - } -} \ No newline at end of file diff --git a/Shipping/Countries/Us/CalculationsBuilderUs.php b/Shipping/Countries/Us/CalculationsBuilderUs.php deleted file mode 100644 index 97a948e..0000000 --- a/Shipping/Countries/Us/CalculationsBuilderUs.php +++ /dev/null @@ -1,20 +0,0 @@ -calculate($this->order); - } - - public function useBoxPricing(IPrice $price):IPrice - { - return (new PremiumBoxUs($price))->calculate($this->order); - } -} \ No newline at end of file diff --git a/Shipping/CountryCalcFactory.php b/Shipping/CountryCalcFactory.php index f2f8ce1..6e24d98 100644 --- a/Shipping/CountryCalcFactory.php +++ b/Shipping/CountryCalcFactory.php @@ -4,27 +4,43 @@ namespace App\Shipping; use App\Contracts\ICalculationsBuilder; -use App\Contracts\ICountryShippingCalc; use App\Contracts\IShippingOrder; +use App\Shipping\CommonCalculations\AdditionalCalc; +use App\Shipping\Countries\CalculationsBuilder; +use App\Shipping\Countries\OtherCountries\BoxPricing\PremiumBoxWorld; use App\Shipping\Countries\OtherCountries\CalculationsBuilderWorld as OthersBuilder; -use App\Shipping\Countries\Pl\CalculationsBuilderPl as PlBuilder; -use App\Shipping\Countries\Uk\CalculationsBuilderUk as UkBuilder; -use App\Shipping\Countries\Us\CalculationsBuilderUs as UsBuilder; +use App\Shipping\Countries\OtherCountries\OrderTotalWorld; +use App\Shipping\Countries\OtherCountries\PriceWorld; +use App\Shipping\Countries\Pl\BoxPricing\PremiumBoxPl; +use App\Shipping\Countries\Pl\OrderTotalPl; +use App\Shipping\Countries\Pl\PricePl; +use App\Shipping\Countries\Uk\BoxPricing\PremiumBoxUk; +use App\Shipping\Countries\Uk\OrderTotalUk; +use App\Shipping\Countries\Uk\PriceUk; +use App\Shipping\Countries\Us\BoxPricing\PremiumBoxUs; +use App\Shipping\Countries\Us\OrderTotalUs; +use App\Shipping\Countries\Us\PriceUs; + class CountryCalcFactory { public function create(IShippingOrder $order): ICalculationsBuilder { + switch ($order->getCountry()) { case "PL": - return new PlBuilder($order); + $price = new PricePl(0); + return new CalculationsBuilder($order, new PremiumBoxPl($price), new OrderTotalPl()); case "UK": - return new UkBuilder($order); + $price = new PriceUk(0); + return new CalculationsBuilder($order, new PremiumBoxUk($price), new OrderTotalUk()); case "US": - return new UsBuilder($order); + $price = new PriceUs(0); + return new CalculationsBuilder($order, new PremiumBoxUs($price), new OrderTotalUs()); default: - return new OthersBuilder($order); + $price = new PriceWorld(0); + return new CalculationsBuilder($order, new PremiumBoxWorld($price), new OrderTotalWorld()); } } } \ No newline at end of file From 8bb4f07e83b91951e2c22f1592db08f8f6302378 Mon Sep 17 00:00:00 2001 From: andrzej Date: Wed, 29 Sep 2021 06:32:17 +0200 Subject: [PATCH 25/38] make factory more readable --- Shipping/CountryCalcFactory.php | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Shipping/CountryCalcFactory.php b/Shipping/CountryCalcFactory.php index 6e24d98..76b4645 100644 --- a/Shipping/CountryCalcFactory.php +++ b/Shipping/CountryCalcFactory.php @@ -31,16 +31,30 @@ public function create(IShippingOrder $order): ICalculationsBuilder { case "PL": $price = new PricePl(0); - return new CalculationsBuilder($order, new PremiumBoxPl($price), new OrderTotalPl()); + $premium_box = new PremiumBoxPl($price); + $order_total = new OrderTotalPl(); + break; + case "UK": $price = new PriceUk(0); - return new CalculationsBuilder($order, new PremiumBoxUk($price), new OrderTotalUk()); + $premium_box = new PremiumBoxUk($price); + $order_total = new OrderTotalUk(); + break; + case "US": $price = new PriceUs(0); - return new CalculationsBuilder($order, new PremiumBoxUs($price), new OrderTotalUs()); + $premium_box = new PremiumBoxUs($price); + $order_total = new OrderTotalUs(); + break; + default: $price = new PriceWorld(0); - return new CalculationsBuilder($order, new PremiumBoxWorld($price), new OrderTotalWorld()); + $premium_box = new PremiumBoxWorld($price); + $order_total = new OrderTotalWorld(); + break; + } + + return new CalculationsBuilder($order, $premium_box, $order_total); } } \ No newline at end of file From fe4e02aeff7812da7572e080a47967b839820c66 Mon Sep 17 00:00:00 2001 From: andrzej Date: Wed, 29 Sep 2021 06:41:03 +0200 Subject: [PATCH 26/38] make factory more readable --- Shipping/Countries/CalculationsBuilder.php | 2 +- Shipping/CountryCalcFactory.php | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Shipping/Countries/CalculationsBuilder.php b/Shipping/Countries/CalculationsBuilder.php index a98b934..367a576 100644 --- a/Shipping/Countries/CalculationsBuilder.php +++ b/Shipping/Countries/CalculationsBuilder.php @@ -37,8 +37,8 @@ public function useOrderTotal():IPrice public function useBoxPricing(IPrice $price):IPrice { $box_pricing_class = get_class($this->box_pricing); - $premium_box_decorator = new $box_pricing_class($price); + $premium_box_decorator = new $box_pricing_class($price); return $premium_box_decorator->calculate($this->order); } diff --git a/Shipping/CountryCalcFactory.php b/Shipping/CountryCalcFactory.php index 76b4645..1ac7a2c 100644 --- a/Shipping/CountryCalcFactory.php +++ b/Shipping/CountryCalcFactory.php @@ -5,10 +5,8 @@ use App\Contracts\ICalculationsBuilder; use App\Contracts\IShippingOrder; -use App\Shipping\CommonCalculations\AdditionalCalc; use App\Shipping\Countries\CalculationsBuilder; use App\Shipping\Countries\OtherCountries\BoxPricing\PremiumBoxWorld; -use App\Shipping\Countries\OtherCountries\CalculationsBuilderWorld as OthersBuilder; use App\Shipping\Countries\OtherCountries\OrderTotalWorld; use App\Shipping\Countries\OtherCountries\PriceWorld; use App\Shipping\Countries\Pl\BoxPricing\PremiumBoxPl; From 35505a67ef012e3ab69ee398d2aa8c420425e659 Mon Sep 17 00:00:00 2001 From: andrzej Date: Wed, 29 Sep 2021 06:47:56 +0200 Subject: [PATCH 27/38] add missing method to shipping order interface --- Contracts/IShippingOrder.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Contracts/IShippingOrder.php b/Contracts/IShippingOrder.php index cb94f9d..7554ef8 100644 --- a/Contracts/IShippingOrder.php +++ b/Contracts/IShippingOrder.php @@ -8,4 +8,5 @@ public function getTotalPl(); public function getTotalUk(); public function getTotalUs(); public function getShippingDiscount(); + public function isPremiumBox():bool; } \ No newline at end of file From 268817bd46656d07f67fe31b4f6a9b1c08a3a961 Mon Sep 17 00:00:00 2001 From: andrzej Date: Wed, 29 Sep 2021 07:15:42 +0200 Subject: [PATCH 28/38] extract separate interface for box pricing DRY - simplify PremiumBox decorators --- Contracts/IShippingBox.php | 10 +++++++ Contracts/IShippingOrder.php | 3 ++- Orders/BoxingPropertiesAdapter.php | 22 ++++++++++++++++ Orders/ShippingOrderAdapter.php | 7 +++-- .../BoxPricing/PremiumBox.php | 26 +++++++++++++++++++ .../BoxPricing/PremiumBoxWorld.php | 18 ++----------- .../Countries/Pl/BoxPricing/PremiumBoxPl.php | 18 ++----------- .../Countries/Uk/BoxPricing/PremiumBoxUk.php | 18 ++----------- .../Countries/Us/BoxPricing/PremiumBoxUs.php | 18 ++----------- 9 files changed, 73 insertions(+), 67 deletions(-) create mode 100644 Contracts/IShippingBox.php create mode 100644 Orders/BoxingPropertiesAdapter.php create mode 100644 Shipping/CommonCalculations/BoxPricing/PremiumBox.php diff --git a/Contracts/IShippingBox.php b/Contracts/IShippingBox.php new file mode 100644 index 0000000..9ae9ef6 --- /dev/null +++ b/Contracts/IShippingBox.php @@ -0,0 +1,10 @@ +order = $order; + } + + public function isPremiumBox():bool + { + return $this->order->isPremiumBox(); + } +} \ No newline at end of file diff --git a/Orders/ShippingOrderAdapter.php b/Orders/ShippingOrderAdapter.php index c5ab5be..3ae3aff 100644 --- a/Orders/ShippingOrderAdapter.php +++ b/Orders/ShippingOrderAdapter.php @@ -4,16 +4,19 @@ namespace App\Orders; +use App\Contracts\IShippingBox; use App\Contracts\IShippingClient; use App\Contracts\IShippingOrder; class ShippingOrderAdapter implements IShippingOrder { private Order $order; + private IShippingBox $boxing; public function __construct($order) { $this->order = $order; + $this->boxing = new BoxingPropertiesAdapter($order); } public function getCountry() @@ -51,8 +54,8 @@ public function getShippingDiscount() } } - public function isPremiumBox():bool + public function getBoxingProperties(): IShippingBox { - return $this->order->isPremiumBox(); + return $this->boxing; } } \ No newline at end of file diff --git a/Shipping/CommonCalculations/BoxPricing/PremiumBox.php b/Shipping/CommonCalculations/BoxPricing/PremiumBox.php new file mode 100644 index 0000000..db52d3d --- /dev/null +++ b/Shipping/CommonCalculations/BoxPricing/PremiumBox.php @@ -0,0 +1,26 @@ +getBoxingProperties(); + + if($boxing_properties->isPremiumBox() ) + { + $price_summary = $shipping_cost->getValue() + $this->country_price; + $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); + } + + return $shipping_cost; + } +} \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php b/Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php index b0681b2..4cc6805 100644 --- a/Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php +++ b/Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php @@ -3,24 +3,10 @@ namespace App\Shipping\Countries\OtherCountries\BoxPricing; +use App\Shipping\AdditionalCalculations\BoxPricing\PremiumBox; -use App\Contracts\IPrice; -use App\Contracts\IShippingOrder; -use App\Shipping\CommonCalculations\AdditionalCalc; - -class PremiumBoxWorld extends AdditionalCalc +class PremiumBoxWorld extends PremiumBox { protected $country_price = 17; - - protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice - { - if($order->isPremiumBox() ) - { - $price_summary = $shipping_cost->getValue() + $this->country_price; - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); - } - - return $shipping_cost; - } } \ No newline at end of file diff --git a/Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php b/Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php index 2383d8e..ba12c9a 100644 --- a/Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php +++ b/Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php @@ -3,24 +3,10 @@ namespace App\Shipping\Countries\Pl\BoxPricing; +use App\Shipping\AdditionalCalculations\BoxPricing\PremiumBox; -use App\Contracts\IPrice; -use App\Contracts\IShippingOrder; -use App\Shipping\CommonCalculations\AdditionalCalc; - - -class PremiumBoxPl extends AdditionalCalc +class PremiumBoxPl extends PremiumBox { protected $country_price = 40; - protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice - { - if($order->isPremiumBox() ) - { - $price_summary = $shipping_cost->getValue() + $this->country_price; - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); - } - - return $shipping_cost; - } } \ No newline at end of file diff --git a/Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php b/Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php index a0f3185..2a6fa0b 100644 --- a/Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php +++ b/Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php @@ -3,23 +3,9 @@ namespace App\Shipping\Countries\Uk\BoxPricing; +use App\Shipping\AdditionalCalculations\BoxPricing\PremiumBox; -use App\Contracts\IPrice; -use App\Contracts\IShippingOrder; -use App\Shipping\CommonCalculations\AdditionalCalc; - -class PremiumBoxUk extends AdditionalCalc +class PremiumBoxUk extends PremiumBox { protected $country_price = 20; - - protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice - { - if($order->isPremiumBox() ) - { - $price_summary = $shipping_cost->getValue() + $this->country_price; - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); - } - - return $shipping_cost; - } } \ No newline at end of file diff --git a/Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php b/Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php index 201bd8d..914ab95 100644 --- a/Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php +++ b/Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php @@ -3,23 +3,9 @@ namespace App\Shipping\Countries\Us\BoxPricing; -use App\Contracts\IPrice; -use App\Contracts\IShippingOrder; -use App\Shipping\CommonCalculations\AdditionalCalc; +use App\Shipping\AdditionalCalculations\BoxPricing\PremiumBox; - -class PremiumBoxUs extends AdditionalCalc +class PremiumBoxUs extends PremiumBox { protected $country_price = 17; - - protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice - { - if($order->isPremiumBox() ) - { - $price_summary = $shipping_cost->getValue() + $this->country_price; - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); - } - - return $shipping_cost; - } } \ No newline at end of file From ae38d488ba3d151ac15d73f95374b893543376b0 Mon Sep 17 00:00:00 2001 From: andrzej Date: Wed, 29 Sep 2021 07:20:55 +0200 Subject: [PATCH 29/38] fix wrong namespaces --- Shipping/CommonCalculations/BoxPricing/PremiumBox.php | 2 +- .../Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php | 2 +- Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php | 2 +- Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php | 2 +- Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Shipping/CommonCalculations/BoxPricing/PremiumBox.php b/Shipping/CommonCalculations/BoxPricing/PremiumBox.php index db52d3d..401202a 100644 --- a/Shipping/CommonCalculations/BoxPricing/PremiumBox.php +++ b/Shipping/CommonCalculations/BoxPricing/PremiumBox.php @@ -1,7 +1,7 @@ Date: Wed, 29 Sep 2021 09:55:56 +0200 Subject: [PATCH 30/38] add new box type for UK create specified country calculator builders --- Contracts/IShippingBox.php | 2 +- Main.php | 4 ++-- Orders/BoxingPropertiesAdapter.php | 6 +++-- Orders/Order.php | 10 ++++---- .../BoxPricing/PremiumBox.php | 6 +++-- Shipping/Countries/CalculationsBuilder.php | 20 ++++------------ .../BoxPricing/PremiumBoxWorld.php | 10 +++++++- .../CalculationsBuilderWorld.php | 14 +++++++++++ .../Countries/Pl/BoxPricing/PremiumBoxPl.php | 9 +++++++- .../Countries/Pl/CalculationsBuilderPl.php | 16 +++++++++++++ .../Countries/Uk/BoxPricing/PremiumBoxUk.php | 10 +++++++- .../Uk/BoxPricing/UefaChampionBox.php | 19 +++++++++++++++ .../Countries/Uk/CalculationsBuilderUk.php | 19 +++++++++++++++ .../Countries/Us/BoxPricing/PremiumBoxUs.php | 10 +++++++- .../Countries/Us/CalculationsBuilderUs.php | 15 ++++++++++++ Shipping/CountryCalcFactory.php | 23 ++++++++----------- tests/MainTest.php | 16 ++++++++++++- 17 files changed, 162 insertions(+), 47 deletions(-) create mode 100644 Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php create mode 100644 Shipping/Countries/Pl/CalculationsBuilderPl.php create mode 100644 Shipping/Countries/Uk/BoxPricing/UefaChampionBox.php create mode 100644 Shipping/Countries/Uk/CalculationsBuilderUk.php create mode 100644 Shipping/Countries/Us/CalculationsBuilderUs.php diff --git a/Contracts/IShippingBox.php b/Contracts/IShippingBox.php index 9ae9ef6..5aaddff 100644 --- a/Contracts/IShippingBox.php +++ b/Contracts/IShippingBox.php @@ -6,5 +6,5 @@ interface IShippingBox { - public function isPremiumBox():bool; + public function getType():string; } \ No newline at end of file diff --git a/Main.php b/Main.php index 28cd0b2..3f8a9c6 100644 --- a/Main.php +++ b/Main.php @@ -10,9 +10,9 @@ class Main { - public function start($country_code, $total, $discount = 0, $premium_box = false) + public function start($country_code, $total, $discount = 0, $box_type = 'DEFAULT') { - $order_adapter = $this->getWrappedOrder($country_code, $total, $discount, $premium_box); + $order_adapter = $this->getWrappedOrder($country_code, $total, $discount, $box_type); $shipping_cost = $this->makeShippingCalcultions($order_adapter); return $shipping_cost->getFomatedValue(); diff --git a/Orders/BoxingPropertiesAdapter.php b/Orders/BoxingPropertiesAdapter.php index 9b4515e..0ebab09 100644 --- a/Orders/BoxingPropertiesAdapter.php +++ b/Orders/BoxingPropertiesAdapter.php @@ -15,8 +15,10 @@ public function __construct(Order $order) $this->order = $order; } - public function isPremiumBox():bool + public function getType(): string { - return $this->order->isPremiumBox(); + //remember we are working with dummy data + //probably in real situtation you will get the type from database using the order_id + return $this->order->boxType(); } } \ No newline at end of file diff --git a/Orders/Order.php b/Orders/Order.php index 2b5d4cb..744cbb1 100644 --- a/Orders/Order.php +++ b/Orders/Order.php @@ -16,14 +16,14 @@ class Order private $country = "PL"; private $total = 50; private $shipping_discount = 0; - private $premium_box = false; + private $box_type = "DEFAULT"; - public function __construct($country_code, $total, $shipping_discount, $premium_box) + public function __construct($country_code, $total, $shipping_discount, $box_type) { $this->country = $country_code; $this->total = $total; $this->shipping_discount = $shipping_discount; - $this->premium_box = $premium_box; + $this->box_type = $box_type; } public function getCountry() @@ -65,9 +65,9 @@ public function getClientShippingDiscountWORLD() return 0; } - public function isPremiumBox() + public function boxType() { - return $this->premium_box; + return $this->box_type; } //please assume that there will be a lot more of code inside of this class //imagine the worst code which you ever seen... this one is worse diff --git a/Shipping/CommonCalculations/BoxPricing/PremiumBox.php b/Shipping/CommonCalculations/BoxPricing/PremiumBox.php index 401202a..360f3de 100644 --- a/Shipping/CommonCalculations/BoxPricing/PremiumBox.php +++ b/Shipping/CommonCalculations/BoxPricing/PremiumBox.php @@ -10,14 +10,16 @@ abstract class PremiumBox extends AdditionalCalc { + abstract protected function getCurrentType(); + abstract protected function getCountryPrice(); protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice { $boxing_properties = $order->getBoxingProperties(); - if($boxing_properties->isPremiumBox() ) + if($boxing_properties->getType() === $this->getCurrentType()) { - $price_summary = $shipping_cost->getValue() + $this->country_price; + $price_summary = $shipping_cost->getValue() + $this->getCountryPrice(); $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); } diff --git a/Shipping/Countries/CalculationsBuilder.php b/Shipping/Countries/CalculationsBuilder.php index 367a576..d8d7219 100644 --- a/Shipping/Countries/CalculationsBuilder.php +++ b/Shipping/Countries/CalculationsBuilder.php @@ -10,37 +10,25 @@ -class CalculationsBuilder implements ICalculationsBuilder +abstract class CalculationsBuilder implements ICalculationsBuilder { protected IShippingOrder $order; protected ICountryShippingCalc $order_total; - protected ICountryShippingCalc $box_pricing; - public function __construct(IShippingOrder $order, ICountryShippingCalc $box_pricing, ICountryShippingCalc $order_total) + public function __construct(IShippingOrder $order, ICountryShippingCalc $order_total) { $this->order = $order; $this->order_total = $order_total; - $this->box_pricing = $box_pricing; } public function useShippingDiscounts(IPrice $price): IPrice { - $free_days_decorator = (new FreeDeliveryDays($price))->calculate($this->order); - return (new ClientShippingDiscount($free_days_decorator))->calculate($this->order); + $free_days = (new FreeDeliveryDays($price))->calculate($this->order); + return (new ClientShippingDiscount($free_days))->calculate($this->order); } public function useOrderTotal():IPrice { return $this->order_total->calculate($this->order); } - - public function useBoxPricing(IPrice $price):IPrice - { - $box_pricing_class = get_class($this->box_pricing); - - $premium_box_decorator = new $box_pricing_class($price); - return $premium_box_decorator->calculate($this->order); - } - - } \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php b/Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php index 0e28e52..5756bc6 100644 --- a/Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php +++ b/Shipping/Countries/OtherCountries/BoxPricing/PremiumBoxWorld.php @@ -8,5 +8,13 @@ class PremiumBoxWorld extends PremiumBox { - protected $country_price = 17; + protected function getCurrentType() + { + return "PREMIUM_BOX"; + } + + protected function getCountryPrice() + { + return 17; + } } \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php new file mode 100644 index 0000000..b688ab0 --- /dev/null +++ b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php @@ -0,0 +1,14 @@ +calculate($this->order); + } +} \ No newline at end of file diff --git a/Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php b/Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php index 7a1b36a..c5a51e2 100644 --- a/Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php +++ b/Shipping/Countries/Pl/BoxPricing/PremiumBoxPl.php @@ -7,6 +7,13 @@ class PremiumBoxPl extends PremiumBox { - protected $country_price = 40; + protected function getCurrentType() + { + return "PREMIUM_BOX"; + } + protected function getCountryPrice() + { + return 40; + } } \ No newline at end of file diff --git a/Shipping/Countries/Pl/CalculationsBuilderPl.php b/Shipping/Countries/Pl/CalculationsBuilderPl.php new file mode 100644 index 0000000..ffe4624 --- /dev/null +++ b/Shipping/Countries/Pl/CalculationsBuilderPl.php @@ -0,0 +1,16 @@ +calculate($this->order); + } +} \ No newline at end of file diff --git a/Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php b/Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php index 95a4cb8..8d71fed 100644 --- a/Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php +++ b/Shipping/Countries/Uk/BoxPricing/PremiumBoxUk.php @@ -7,5 +7,13 @@ class PremiumBoxUk extends PremiumBox { - protected $country_price = 20; + protected function getCurrentType() + { + return "PREMIUM_BOX"; + } + + protected function getCountryPrice() + { + return 20; + } } \ No newline at end of file diff --git a/Shipping/Countries/Uk/BoxPricing/UefaChampionBox.php b/Shipping/Countries/Uk/BoxPricing/UefaChampionBox.php new file mode 100644 index 0000000..6b8ed28 --- /dev/null +++ b/Shipping/Countries/Uk/BoxPricing/UefaChampionBox.php @@ -0,0 +1,19 @@ +calculate($this->order); + $with_uefa_champion = (new UefaChampionBox($with_premium_box))->calculate($this->order); + + return $with_uefa_champion; + } +} \ No newline at end of file diff --git a/Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php b/Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php index 5cf1c84..993dc9f 100644 --- a/Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php +++ b/Shipping/Countries/Us/BoxPricing/PremiumBoxUs.php @@ -7,5 +7,13 @@ class PremiumBoxUs extends PremiumBox { - protected $country_price = 17; + protected function getCurrentType() + { + return "PREMIUM_BOX"; + } + + protected function getCountryPrice() + { + return 17; + } } \ No newline at end of file diff --git a/Shipping/Countries/Us/CalculationsBuilderUs.php b/Shipping/Countries/Us/CalculationsBuilderUs.php new file mode 100644 index 0000000..3d83509 --- /dev/null +++ b/Shipping/Countries/Us/CalculationsBuilderUs.php @@ -0,0 +1,15 @@ +calculate($this->order); + } +} \ No newline at end of file diff --git a/Shipping/CountryCalcFactory.php b/Shipping/CountryCalcFactory.php index 1ac7a2c..2cbf0f5 100644 --- a/Shipping/CountryCalcFactory.php +++ b/Shipping/CountryCalcFactory.php @@ -7,15 +7,19 @@ use App\Contracts\IShippingOrder; use App\Shipping\Countries\CalculationsBuilder; use App\Shipping\Countries\OtherCountries\BoxPricing\PremiumBoxWorld; +use App\Shipping\Countries\OtherCountries\CalculationsBuilderWorld; use App\Shipping\Countries\OtherCountries\OrderTotalWorld; use App\Shipping\Countries\OtherCountries\PriceWorld; use App\Shipping\Countries\Pl\BoxPricing\PremiumBoxPl; +use App\Shipping\Countries\Pl\CalculationsBuilderPl; use App\Shipping\Countries\Pl\OrderTotalPl; use App\Shipping\Countries\Pl\PricePl; use App\Shipping\Countries\Uk\BoxPricing\PremiumBoxUk; +use App\Shipping\Countries\Uk\CalculationsBuilderUk; use App\Shipping\Countries\Uk\OrderTotalUk; use App\Shipping\Countries\Uk\PriceUk; use App\Shipping\Countries\Us\BoxPricing\PremiumBoxUs; +use App\Shipping\Countries\Us\CalculationsBuilderUs; use App\Shipping\Countries\Us\OrderTotalUs; use App\Shipping\Countries\Us\PriceUs; @@ -28,31 +32,22 @@ public function create(IShippingOrder $order): ICalculationsBuilder switch ($order->getCountry()) { case "PL": - $price = new PricePl(0); - $premium_box = new PremiumBoxPl($price); $order_total = new OrderTotalPl(); - break; + return new CalculationsBuilderPl($order, $order_total); case "UK": - $price = new PriceUk(0); - $premium_box = new PremiumBoxUk($price); $order_total = new OrderTotalUk(); - break; + return new CalculationsBuilderUk($order, $order_total); case "US": - $price = new PriceUs(0); - $premium_box = new PremiumBoxUs($price); $order_total = new OrderTotalUs(); - break; + return new CalculationsBuilderUs($order, $order_total); default: - $price = new PriceWorld(0); - $premium_box = new PremiumBoxWorld($price); + $order_total = new OrderTotalWorld(); - break; + return new CalculationsBuilderWorld($order, $order_total); } - - return new CalculationsBuilder($order, $premium_box, $order_total); } } \ No newline at end of file diff --git a/tests/MainTest.php b/tests/MainTest.php index 2abb4a6..653492a 100644 --- a/tests/MainTest.php +++ b/tests/MainTest.php @@ -43,7 +43,7 @@ public function start_needToPayPLDiscount() public function start_needToPayPLDiscountANDPremiumBox() { $main = new Main(); - $result = $main->start("PL", 50, 10, true); + $result = $main->start("PL", 50, 10, 'PREMIUM_BOX'); $this->assertEquals('55PLN', $result); } @@ -76,6 +76,20 @@ public function start_freeShippingUK() $this->assertEquals('0GBP', $result); } + /** + * @feature Orders + * @sceanrio Calculate Shipping Cost + * @case to England free delivery above order total + * @test + */ + public function start_freeShippingUK_championsBox() + { + $main = new Main(); + $result = $main->start("UK", 450, 0, 'UEFA_CHAMPION'); + + $this->assertEquals('40GBP', $result); + } + /** * @feature Orders * @sceanrio Calculate Shipping Cost From a1bdb18add70db946a4158780fcfd4c15bc885f7 Mon Sep 17 00:00:00 2001 From: andrzej Date: Wed, 29 Sep 2021 10:19:06 +0200 Subject: [PATCH 31/38] rollback decorator inside builders --- Contracts/ICalculationsBuilder.php | 7 ++-- Shipping/CalculationsDirector.php | 6 ++- .../CommonCalculations/AdditionalCalc.php | 9 +++-- .../BoxPricing/CustomBox.php | 37 ------------------- Shipping/Countries/CalculationsBuilder.php | 17 ++++++--- .../CalculationsBuilderWorld.php | 8 ++-- .../Countries/Pl/CalculationsBuilderPl.php | 9 +++-- .../Countries/Uk/CalculationsBuilderUk.php | 10 ++--- .../Countries/Us/CalculationsBuilderUs.php | 9 +++-- 9 files changed, 46 insertions(+), 66 deletions(-) delete mode 100644 Shipping/CommonCalculations/BoxPricing/CustomBox.php diff --git a/Contracts/ICalculationsBuilder.php b/Contracts/ICalculationsBuilder.php index 72a66af..3313b62 100644 --- a/Contracts/ICalculationsBuilder.php +++ b/Contracts/ICalculationsBuilder.php @@ -3,7 +3,8 @@ interface ICalculationsBuilder { - public function useOrderTotal():IPrice; - public function useShippingDiscounts(IPrice $price):IPrice; - public function useBoxPricing(IPrice $price):IPrice; + public function useOrderTotal():ICountryShippingCalc; + public function useShippingDiscounts(ICountryShippingCalc $calculations_component):ICountryShippingCalc; + public function useBoxPricing(ICountryShippingCalc $calculations_component):ICountryShippingCalc; + public function makeCalculations(ICountryShippingCalc $calculations_component):IPrice; } \ No newline at end of file diff --git a/Shipping/CalculationsDirector.php b/Shipping/CalculationsDirector.php index c33c0bf..e5b3029 100644 --- a/Shipping/CalculationsDirector.php +++ b/Shipping/CalculationsDirector.php @@ -23,9 +23,11 @@ public function calculate():IPrice $calculator = $this->calc_builder->useOrderTotal(); //these has to be always calculated as first after total order value - $decorate = $this->calc_builder->useShippingDiscounts($calculator); + $discount_decorations = $this->calc_builder->useShippingDiscounts($calculator); //other calculations - return $this->calc_builder->useBoxPricing($decorate); + $boxing_decorations = $this->calc_builder->useBoxPricing($discount_decorations); + + return $this->calc_builder->makeCalculations($boxing_decorations); } } \ No newline at end of file diff --git a/Shipping/CommonCalculations/AdditionalCalc.php b/Shipping/CommonCalculations/AdditionalCalc.php index b78700a..4b02d27 100644 --- a/Shipping/CommonCalculations/AdditionalCalc.php +++ b/Shipping/CommonCalculations/AdditionalCalc.php @@ -11,18 +11,19 @@ abstract class AdditionalCalc implements ICountryShippingCalc { - protected IPrice $price; + protected ICountryShippingCalc $calc; protected $price_factory ; - public function __construct(IPrice $price) + public function __construct(ICountryShippingCalc $calculations_component) { - $this->price = $price; + $this->calc = $calculations_component; $this->price_factory = new PriceFactory(); } public function calculate(IShippingOrder $order): IPrice { - return $this->decorate($this->price, $order); + $shipping_cost = $this->calc->calculate($order); + return $this->decorate($shipping_cost, $order); } abstract protected function decorate(IPrice $shipping_cost, IShippingOrder $order): IPrice; diff --git a/Shipping/CommonCalculations/BoxPricing/CustomBox.php b/Shipping/CommonCalculations/BoxPricing/CustomBox.php deleted file mode 100644 index d2d4654..0000000 --- a/Shipping/CommonCalculations/BoxPricing/CustomBox.php +++ /dev/null @@ -1,37 +0,0 @@ -price = $price; - - if($price->getValue() < 0 ) { - $this->price = $this->price_factory->create($price->getCurrencyCode(), 0); - } - } - - protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice - { - - - $price_summary = $shipping_cost->getValue() + $this->price->getValue(); - $shipping_cost = $this->price_factory->create($shipping_cost->getCurrencyCode(), $price_summary); - - return $shipping_cost; - } -} \ No newline at end of file diff --git a/Shipping/Countries/CalculationsBuilder.php b/Shipping/Countries/CalculationsBuilder.php index d8d7219..00d7c3e 100644 --- a/Shipping/Countries/CalculationsBuilder.php +++ b/Shipping/Countries/CalculationsBuilder.php @@ -21,14 +21,21 @@ public function __construct(IShippingOrder $order, ICountryShippingCalc $order_t $this->order_total = $order_total; } - public function useShippingDiscounts(IPrice $price): IPrice + public function useShippingDiscounts(ICountryShippingCalc $calculations_component):ICountryShippingCalc { - $free_days = (new FreeDeliveryDays($price))->calculate($this->order); - return (new ClientShippingDiscount($free_days))->calculate($this->order); + $free_days_decorator = new FreeDeliveryDays($calculations_component); + $client_discount_decorator = new ClientShippingDiscount($free_days_decorator); + + return $client_discount_decorator; + } + + public function useOrderTotal():ICountryShippingCalc + { + return $this->order_total; } - public function useOrderTotal():IPrice + public function makeCalculations(ICountryShippingCalc $calculations_component): IPrice { - return $this->order_total->calculate($this->order); + return $calculations_component->calculate($this->order); } } \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php index b688ab0..363b278 100644 --- a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php +++ b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php @@ -1,14 +1,16 @@ calculate($this->order); + $box_price_decorator = new PremiumBoxWorld($calculations_component); + + return $box_price_decorator; } } \ No newline at end of file diff --git a/Shipping/Countries/Pl/CalculationsBuilderPl.php b/Shipping/Countries/Pl/CalculationsBuilderPl.php index ffe4624..75bcf5c 100644 --- a/Shipping/Countries/Pl/CalculationsBuilderPl.php +++ b/Shipping/Countries/Pl/CalculationsBuilderPl.php @@ -1,16 +1,17 @@ calculate($this->order); + $box_price_decorator = new PremiumBoxPl($calculations_component); + + return $box_price_decorator; } } \ No newline at end of file diff --git a/Shipping/Countries/Uk/CalculationsBuilderUk.php b/Shipping/Countries/Uk/CalculationsBuilderUk.php index f7b4bbe..cec57f0 100644 --- a/Shipping/Countries/Uk/CalculationsBuilderUk.php +++ b/Shipping/Countries/Uk/CalculationsBuilderUk.php @@ -1,7 +1,7 @@ calculate($this->order); - $with_uefa_champion = (new UefaChampionBox($with_premium_box))->calculate($this->order); + $premium_box_decorator = new PremiumBoxUk($calculations_component); + $uefa_champion_decorator = new UefaChampionBox($premium_box_decorator); - return $with_uefa_champion; + return $uefa_champion_decorator; } } \ No newline at end of file diff --git a/Shipping/Countries/Us/CalculationsBuilderUs.php b/Shipping/Countries/Us/CalculationsBuilderUs.php index 3d83509..cbe37bb 100644 --- a/Shipping/Countries/Us/CalculationsBuilderUs.php +++ b/Shipping/Countries/Us/CalculationsBuilderUs.php @@ -1,15 +1,18 @@ calculate($this->order); + $box_price_decorator = new PremiumBoxUs($calculations_component); + + return $box_price_decorator; } } \ No newline at end of file From 395c37c52424c29c99cf1118a4ef0f0fabb42118 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 4 Oct 2021 12:27:44 +0200 Subject: [PATCH 32/38] pass boxing properties in a proper way (without friend of my friend rule breaking) The boxing is extracted as separated decorator (and it's nto a part of AdditionalCalculations line) --- Contracts/IBoxingCalculation.php | 10 +++++++ Contracts/ICalculationsBuilder.php | 4 +-- Contracts/IPrice.php | 1 + Main.php | 22 +++++++------- Shipping/CalculationsDirector.php | 4 +-- .../BoxPricing/PremiumBox.php | 25 +++++++++++++--- Shipping/CommonCalculations/Price.php | 23 ++++++++++++++ Shipping/Countries/CalculationsBuilder.php | 14 +++++++-- .../BoxPricing/DefaultBoxWorld.php | 29 ++++++++++++++++++ .../CalculationsBuilderWorld.php | 9 ++++-- .../Countries/OtherCountries/PriceWorld.php | 4 +-- .../Countries/Pl/BoxPricing/DefaultBoxPl.php | 29 ++++++++++++++++++ .../Countries/Pl/CalculationsBuilderPl.php | 9 ++++-- Shipping/Countries/Pl/PricePL.php | 5 ++-- .../Countries/Uk/BoxPricing/DefaultBoxUk.php | 30 +++++++++++++++++++ .../Countries/Uk/CalculationsBuilderUk.php | 8 +++-- Shipping/Countries/Uk/PriceUk.php | 4 +-- .../Countries/Us/BoxPricing/DefaultBoxUs.php | 30 +++++++++++++++++++ .../Countries/Us/CalculationsBuilderUs.php | 7 +++-- Shipping/Countries/Us/PriceUs.php | 4 +-- Shipping/CountryCalcFactory.php | 12 ++++---- Shipping/ShippingCostCalculator.php | 7 +++-- 22 files changed, 243 insertions(+), 47 deletions(-) create mode 100644 Contracts/IBoxingCalculation.php create mode 100644 Shipping/CommonCalculations/Price.php create mode 100644 Shipping/Countries/OtherCountries/BoxPricing/DefaultBoxWorld.php create mode 100644 Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php create mode 100644 Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php create mode 100644 Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php diff --git a/Contracts/IBoxingCalculation.php b/Contracts/IBoxingCalculation.php new file mode 100644 index 0000000..06e1335 --- /dev/null +++ b/Contracts/IBoxingCalculation.php @@ -0,0 +1,10 @@ +getWrappedOrder($country_code, $total, $discount, $box_type); - $shipping_cost = $this->makeShippingCalcultions($order_adapter); + $immutable_order = $this->getOrder($country_code, $total, $discount, $box_type); + $order_adapter = new ShippingOrderAdapter($immutable_order); + $boxing_properties = new BoxingPropertiesAdapter($immutable_order); + + $shipping_cost = $this->makeShippingCalcultions($order_adapter, $boxing_properties); return $shipping_cost->getFomatedValue(); } - /** - * we want to be independent as much as possible from the original messed Order object - */ - private function getWrappedOrder($country_code, $total, $discount = 0, $premium_box = false):IShippingOrder + private function getOrder($country_code, $total, $discount = 0, $premium_box = false):Order { - $immutable_order = new Order($country_code, $total, $discount, $premium_box); - - return new ShippingOrderAdapter($immutable_order); + return new Order($country_code, $total, $discount, $premium_box); } - private function makeShippingCalcultions(IShippingOrder $order_adapter):IPrice + private function makeShippingCalcultions(IShippingOrder $order_adapter, IShippingBox $boxing_properties):IPrice { $calculator_facade = new ShippingCostCalculator(); - return $calculator_facade->calculate($order_adapter); + return $calculator_facade->calculate($order_adapter, $boxing_properties); } } \ No newline at end of file diff --git a/Shipping/CalculationsDirector.php b/Shipping/CalculationsDirector.php index e5b3029..66b47e6 100644 --- a/Shipping/CalculationsDirector.php +++ b/Shipping/CalculationsDirector.php @@ -26,8 +26,8 @@ public function calculate():IPrice $discount_decorations = $this->calc_builder->useShippingDiscounts($calculator); //other calculations - $boxing_decorations = $this->calc_builder->useBoxPricing($discount_decorations); + $boxing_decorations = $this->calc_builder->useBoxPricing(); - return $this->calc_builder->makeCalculations($boxing_decorations); + return $this->calc_builder->makeCalculations($discount_decorations, $boxing_decorations); } } \ No newline at end of file diff --git a/Shipping/CommonCalculations/BoxPricing/PremiumBox.php b/Shipping/CommonCalculations/BoxPricing/PremiumBox.php index 360f3de..d0db2d8 100644 --- a/Shipping/CommonCalculations/BoxPricing/PremiumBox.php +++ b/Shipping/CommonCalculations/BoxPricing/PremiumBox.php @@ -4,19 +4,36 @@ namespace App\Shipping\CommonCalculations\BoxPricing; +use App\Contracts\IBoxingCalculation; +use App\Contracts\ICountryShippingCalc; use App\Contracts\IPrice; +use App\Contracts\IShippingBox; use App\Contracts\IShippingOrder; -use App\Shipping\CommonCalculations\AdditionalCalc; +use App\Shipping\PriceFactory; -abstract class PremiumBox extends AdditionalCalc + +abstract class PremiumBox implements IBoxingCalculation { abstract protected function getCurrentType(); abstract protected function getCountryPrice(); + protected IBoxingCalculation $default_price; + + protected $price_factory ; - protected function decorate(IPrice $shipping_cost, IShippingOrder $order):IPrice + public function __construct(IBoxingCalculation $calculations_component) { - $boxing_properties = $order->getBoxingProperties(); + $this->default_price = $calculations_component; + $this->price_factory = new PriceFactory(); + } + public function calculate(IShippingBox $boxing_properties): IPrice + { + $shipping_cost = $this->default_price->calculate($boxing_properties); + return $this->decorate($shipping_cost, $boxing_properties); + } + + protected function decorate(IPrice $shipping_cost, IShippingBox $boxing_properties):IPrice + { if($boxing_properties->getType() === $this->getCurrentType()) { $price_summary = $shipping_cost->getValue() + $this->getCountryPrice(); diff --git a/Shipping/CommonCalculations/Price.php b/Shipping/CommonCalculations/Price.php new file mode 100644 index 0000000..9845687 --- /dev/null +++ b/Shipping/CommonCalculations/Price.php @@ -0,0 +1,23 @@ +getCurrencyCode() === $this->getCurrencyCode()) + { + $this->value = $value->getValue() + $this->getValue(); + return $this; + } + + throw new \Exception("Trying to add different currencies is not allowed"); + } +} \ No newline at end of file diff --git a/Shipping/Countries/CalculationsBuilder.php b/Shipping/Countries/CalculationsBuilder.php index 00d7c3e..76a6292 100644 --- a/Shipping/Countries/CalculationsBuilder.php +++ b/Shipping/Countries/CalculationsBuilder.php @@ -1,9 +1,11 @@ order = $order; $this->order_total = $order_total; + $this->boxing_properties = $boxing_properties; } public function useShippingDiscounts(ICountryShippingCalc $calculations_component):ICountryShippingCalc @@ -34,8 +38,12 @@ public function useOrderTotal():ICountryShippingCalc return $this->order_total; } - public function makeCalculations(ICountryShippingCalc $calculations_component): IPrice + public function makeCalculations(ICountryShippingCalc $calculations_component, IBoxingCalculation $boxing_component): IPrice { - return $calculations_component->calculate($this->order); + $shipping_cost = $calculations_component->calculate($this->order); + $boxing_cost = $boxing_component->calculate($this->boxing_properties); + + //todo + return $shipping_cost->add($boxing_cost); } } \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/BoxPricing/DefaultBoxWorld.php b/Shipping/Countries/OtherCountries/BoxPricing/DefaultBoxWorld.php new file mode 100644 index 0000000..7347c53 --- /dev/null +++ b/Shipping/Countries/OtherCountries/BoxPricing/DefaultBoxWorld.php @@ -0,0 +1,29 @@ +price_factory = new PriceFactory(); + } + + public function calculate(IShippingBox $boxing_properties): IPrice + { + return $this->price_factory->create("ETH", $this->getCountryPrice()); + } + + protected function getCountryPrice() + { + return 0; + } +} \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php index 363b278..2ee7f04 100644 --- a/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php +++ b/Shipping/Countries/OtherCountries/CalculationsBuilderWorld.php @@ -1,15 +1,18 @@ boxing_properties); + $box_price_decorator = new PremiumBoxWorld($default_box); return $box_price_decorator; } diff --git a/Shipping/Countries/OtherCountries/PriceWorld.php b/Shipping/Countries/OtherCountries/PriceWorld.php index c4c8ec7..e0e87dd 100644 --- a/Shipping/Countries/OtherCountries/PriceWorld.php +++ b/Shipping/Countries/OtherCountries/PriceWorld.php @@ -2,10 +2,10 @@ namespace App\Shipping\Countries\OtherCountries; use App\Contracts\IPrice; +use App\Shipping\CommonCalculations\Price; -class PriceWorld implements IPrice +class PriceWorld extends Price { - private $value = 0; private $currency_code = 'ETH'; public function __construct(float $value) diff --git a/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php b/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php new file mode 100644 index 0000000..909e292 --- /dev/null +++ b/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php @@ -0,0 +1,29 @@ +price_factory = new PriceFactory(); + } + + public function calculate(IShippingBox $boxing_properties): IPrice + { + return $this->price_factory->create("PLN", $this->getCountryPrice()); + } + + protected function getCountryPrice() + { + return 0; + } +} \ No newline at end of file diff --git a/Shipping/Countries/Pl/CalculationsBuilderPl.php b/Shipping/Countries/Pl/CalculationsBuilderPl.php index 75bcf5c..bb12b56 100644 --- a/Shipping/Countries/Pl/CalculationsBuilderPl.php +++ b/Shipping/Countries/Pl/CalculationsBuilderPl.php @@ -1,16 +1,21 @@ boxing_properties); + + $box_price_decorator = new PremiumBoxPl($default_box); return $box_price_decorator; } diff --git a/Shipping/Countries/Pl/PricePL.php b/Shipping/Countries/Pl/PricePL.php index d773be7..8cdaee1 100644 --- a/Shipping/Countries/Pl/PricePL.php +++ b/Shipping/Countries/Pl/PricePL.php @@ -2,10 +2,10 @@ namespace App\Shipping\Countries\Pl; use App\Contracts\IPrice; +use App\Shipping\CommonCalculations\Price; -class PricePl implements IPrice +class PricePl extends Price implements IPrice { - private $value = 0; private $currency_code = 'PLN'; public function __construct(float $value) @@ -27,4 +27,5 @@ public function getFomatedValue() { return $this->value.$this->currency_code; } + } \ No newline at end of file diff --git a/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php b/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php new file mode 100644 index 0000000..74ed16c --- /dev/null +++ b/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php @@ -0,0 +1,30 @@ +price_factory = new PriceFactory(); + } + + public function calculate(IShippingBox $boxing_properties): IPrice + { + return $this->price_factory->create("GBP", $this->getCountryPrice()); + } + + protected function getCountryPrice() + { + return 0; + } +} \ No newline at end of file diff --git a/Shipping/Countries/Uk/CalculationsBuilderUk.php b/Shipping/Countries/Uk/CalculationsBuilderUk.php index cec57f0..cb4b014 100644 --- a/Shipping/Countries/Uk/CalculationsBuilderUk.php +++ b/Shipping/Countries/Uk/CalculationsBuilderUk.php @@ -1,17 +1,21 @@ boxing_properties); + $premium_box_decorator = new PremiumBoxUk($default_box); $uefa_champion_decorator = new UefaChampionBox($premium_box_decorator); return $uefa_champion_decorator; diff --git a/Shipping/Countries/Uk/PriceUk.php b/Shipping/Countries/Uk/PriceUk.php index f0717a0..6368a80 100644 --- a/Shipping/Countries/Uk/PriceUk.php +++ b/Shipping/Countries/Uk/PriceUk.php @@ -2,10 +2,10 @@ namespace App\Shipping\Countries\Uk; use App\Contracts\IPrice; +use App\Shipping\CommonCalculations\Price; -class PriceUk implements IPrice +class PriceUk extends Price { - private $value = 0; private $currency_code = 'GBP'; public function __construct(float $value) diff --git a/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php b/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php new file mode 100644 index 0000000..35f4217 --- /dev/null +++ b/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php @@ -0,0 +1,30 @@ +price_factory = new PriceFactory(); + } + + public function calculate(IShippingBox $boxing_properties): IPrice + { + return $this->price_factory->create("$", $this->getCountryPrice()); + } + + protected function getCountryPrice() + { + return 0; + } +} \ No newline at end of file diff --git a/Shipping/Countries/Us/CalculationsBuilderUs.php b/Shipping/Countries/Us/CalculationsBuilderUs.php index cbe37bb..9325100 100644 --- a/Shipping/Countries/Us/CalculationsBuilderUs.php +++ b/Shipping/Countries/Us/CalculationsBuilderUs.php @@ -1,17 +1,20 @@ boxing_properties); + $box_price_decorator = new PremiumBoxUs($default_box); return $box_price_decorator; } diff --git a/Shipping/Countries/Us/PriceUs.php b/Shipping/Countries/Us/PriceUs.php index c4b7298..6f97203 100644 --- a/Shipping/Countries/Us/PriceUs.php +++ b/Shipping/Countries/Us/PriceUs.php @@ -2,10 +2,10 @@ namespace App\Shipping\Countries\Us; use App\Contracts\IPrice; +use App\Shipping\CommonCalculations\Price; -class PriceUs implements IPrice +class PriceUs extends Price { - private $value = 0; private $currency_code = '$'; public function __construct(float $value) diff --git a/Shipping/CountryCalcFactory.php b/Shipping/CountryCalcFactory.php index 2cbf0f5..cc8ca02 100644 --- a/Shipping/CountryCalcFactory.php +++ b/Shipping/CountryCalcFactory.php @@ -4,6 +4,7 @@ namespace App\Shipping; use App\Contracts\ICalculationsBuilder; +use App\Contracts\IShippingBox; use App\Contracts\IShippingOrder; use App\Shipping\Countries\CalculationsBuilder; use App\Shipping\Countries\OtherCountries\BoxPricing\PremiumBoxWorld; @@ -26,27 +27,26 @@ class CountryCalcFactory { - public function create(IShippingOrder $order): ICalculationsBuilder + public function create(IShippingOrder $order, IShippingBox $boxing_properties): ICalculationsBuilder { switch ($order->getCountry()) { case "PL": $order_total = new OrderTotalPl(); - return new CalculationsBuilderPl($order, $order_total); + return new CalculationsBuilderPl($order, $order_total, $boxing_properties); case "UK": $order_total = new OrderTotalUk(); - return new CalculationsBuilderUk($order, $order_total); + return new CalculationsBuilderUk($order, $order_total, $boxing_properties); case "US": $order_total = new OrderTotalUs(); - return new CalculationsBuilderUs($order, $order_total); + return new CalculationsBuilderUs($order, $order_total, $boxing_properties); default: - $order_total = new OrderTotalWorld(); - return new CalculationsBuilderWorld($order, $order_total); + return new CalculationsBuilderWorld($order, $order_total, $boxing_properties); } } diff --git a/Shipping/ShippingCostCalculator.php b/Shipping/ShippingCostCalculator.php index f4c29dd..de4b114 100644 --- a/Shipping/ShippingCostCalculator.php +++ b/Shipping/ShippingCostCalculator.php @@ -3,14 +3,17 @@ use App\Contracts\ICountryShippingCalc; use App\Contracts\IPrice; +use App\Contracts\IShippingBox; use App\Contracts\IShippingOrder; +use App\Shipping\Countries\Us\PriceUs; + class ShippingCostCalculator { - public function calculate(IShippingOrder $order):IPrice + public function calculate(IShippingOrder $order, IShippingBox $boxing_properties):IPrice { $calc_factory = new CountryCalcFactory(); - $country_calculations_builder = $calc_factory->create($order); + $country_calculations_builder = $calc_factory->create($order, $boxing_properties); $calculations_director = new CalculationsDirector($country_calculations_builder); return $calculations_director->calculate(); From ba351b0a19a5b99ff7c3f4d393baa3d13e94a20e Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 4 Oct 2021 12:40:24 +0200 Subject: [PATCH 33/38] move abstract calculation builder to proper directory --- .../CalculationsBuilder.php | 5 +---- .../Countries/OtherCountries/CalculationsBuilderWorld.php | 2 +- Shipping/Countries/Pl/CalculationsBuilderPl.php | 4 +--- Shipping/Countries/Uk/CalculationsBuilderUk.php | 5 ++--- Shipping/Countries/Us/CalculationsBuilderUs.php | 3 +-- 5 files changed, 6 insertions(+), 13 deletions(-) rename Shipping/{Countries => CommonCalculations}/CalculationsBuilder.php (90%) diff --git a/Shipping/Countries/CalculationsBuilder.php b/Shipping/CommonCalculations/CalculationsBuilder.php similarity index 90% rename from Shipping/Countries/CalculationsBuilder.php rename to Shipping/CommonCalculations/CalculationsBuilder.php index 76a6292..95cf376 100644 --- a/Shipping/Countries/CalculationsBuilder.php +++ b/Shipping/CommonCalculations/CalculationsBuilder.php @@ -1,5 +1,5 @@ Date: Mon, 4 Oct 2021 12:48:34 +0200 Subject: [PATCH 34/38] refactor hardcoded values into const variables --- Countries.php | 13 +++++++++++++ Currencies.php | 13 +++++++++++++ .../OtherCountries/BoxPricing/DefaultBoxWorld.php | 3 ++- Shipping/Countries/OtherCountries/PriceWorld.php | 3 ++- Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php | 3 ++- Shipping/Countries/Pl/PricePL.php | 3 ++- Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php | 3 ++- Shipping/Countries/Uk/PriceUk.php | 3 ++- Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php | 3 ++- Shipping/Countries/Us/PriceUs.php | 3 ++- Shipping/CountryCalcFactory.php | 7 ++++--- 11 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 Countries.php create mode 100644 Currencies.php diff --git a/Countries.php b/Countries.php new file mode 100644 index 0000000..ef42010 --- /dev/null +++ b/Countries.php @@ -0,0 +1,13 @@ +price_factory->create("ETH", $this->getCountryPrice()); + return $this->price_factory->create(Currencies::ETH, $this->getCountryPrice()); } protected function getCountryPrice() diff --git a/Shipping/Countries/OtherCountries/PriceWorld.php b/Shipping/Countries/OtherCountries/PriceWorld.php index e0e87dd..7f75395 100644 --- a/Shipping/Countries/OtherCountries/PriceWorld.php +++ b/Shipping/Countries/OtherCountries/PriceWorld.php @@ -2,11 +2,12 @@ namespace App\Shipping\Countries\OtherCountries; use App\Contracts\IPrice; +use App\Currencies; use App\Shipping\CommonCalculations\Price; class PriceWorld extends Price { - private $currency_code = 'ETH'; + private $currency_code = Currencies::ETH; public function __construct(float $value) { diff --git a/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php b/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php index 909e292..27075d7 100644 --- a/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php +++ b/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php @@ -6,6 +6,7 @@ use App\Contracts\IBoxingCalculation; use App\Contracts\IPrice; use App\Contracts\IShippingBox; +use App\Currencies; use App\Shipping\PriceFactory; class DefaultBoxPl implements IBoxingCalculation @@ -19,7 +20,7 @@ public function __construct() public function calculate(IShippingBox $boxing_properties): IPrice { - return $this->price_factory->create("PLN", $this->getCountryPrice()); + return $this->price_factory->create(Currencies::PLN, $this->getCountryPrice()); } protected function getCountryPrice() diff --git a/Shipping/Countries/Pl/PricePL.php b/Shipping/Countries/Pl/PricePL.php index 8cdaee1..c3c7d5e 100644 --- a/Shipping/Countries/Pl/PricePL.php +++ b/Shipping/Countries/Pl/PricePL.php @@ -2,11 +2,12 @@ namespace App\Shipping\Countries\Pl; use App\Contracts\IPrice; +use App\Currencies; use App\Shipping\CommonCalculations\Price; class PricePl extends Price implements IPrice { - private $currency_code = 'PLN'; + private $currency_code = Currencies::PLN; public function __construct(float $value) { diff --git a/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php b/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php index 74ed16c..2896cc6 100644 --- a/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php +++ b/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php @@ -6,6 +6,7 @@ use App\Contracts\IBoxingCalculation; use App\Contracts\IPrice; use App\Contracts\IShippingBox; +use App\Currencies; use App\Shipping\CommonCalculations\BoxPricing\PremiumBox; use App\Shipping\PriceFactory; @@ -20,7 +21,7 @@ public function __construct() public function calculate(IShippingBox $boxing_properties): IPrice { - return $this->price_factory->create("GBP", $this->getCountryPrice()); + return $this->price_factory->create(Currencies::GBP, $this->getCountryPrice()); } protected function getCountryPrice() diff --git a/Shipping/Countries/Uk/PriceUk.php b/Shipping/Countries/Uk/PriceUk.php index 6368a80..18611be 100644 --- a/Shipping/Countries/Uk/PriceUk.php +++ b/Shipping/Countries/Uk/PriceUk.php @@ -2,11 +2,12 @@ namespace App\Shipping\Countries\Uk; use App\Contracts\IPrice; +use App\Currencies; use App\Shipping\CommonCalculations\Price; class PriceUk extends Price { - private $currency_code = 'GBP'; + private $currency_code = Currencies::GBP; public function __construct(float $value) { diff --git a/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php b/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php index 35f4217..33bdb93 100644 --- a/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php +++ b/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php @@ -6,6 +6,7 @@ use App\Contracts\IBoxingCalculation; use App\Contracts\IPrice; use App\Contracts\IShippingBox; +use App\Currencies; use App\Shipping\CommonCalculations\BoxPricing\PremiumBox; use App\Shipping\PriceFactory; @@ -20,7 +21,7 @@ public function __construct() public function calculate(IShippingBox $boxing_properties): IPrice { - return $this->price_factory->create("$", $this->getCountryPrice()); + return $this->price_factory->create(Currencies::US, $this->getCountryPrice()); } protected function getCountryPrice() diff --git a/Shipping/Countries/Us/PriceUs.php b/Shipping/Countries/Us/PriceUs.php index 6f97203..c7f4a2b 100644 --- a/Shipping/Countries/Us/PriceUs.php +++ b/Shipping/Countries/Us/PriceUs.php @@ -2,11 +2,12 @@ namespace App\Shipping\Countries\Us; use App\Contracts\IPrice; +use App\Currencies; use App\Shipping\CommonCalculations\Price; class PriceUs extends Price { - private $currency_code = '$'; + private $currency_code = Currencies::US; public function __construct(float $value) { diff --git a/Shipping/CountryCalcFactory.php b/Shipping/CountryCalcFactory.php index cc8ca02..673271f 100644 --- a/Shipping/CountryCalcFactory.php +++ b/Shipping/CountryCalcFactory.php @@ -6,6 +6,7 @@ use App\Contracts\ICalculationsBuilder; use App\Contracts\IShippingBox; use App\Contracts\IShippingOrder; +use App\Countries; use App\Shipping\Countries\CalculationsBuilder; use App\Shipping\Countries\OtherCountries\BoxPricing\PremiumBoxWorld; use App\Shipping\Countries\OtherCountries\CalculationsBuilderWorld; @@ -32,15 +33,15 @@ public function create(IShippingOrder $order, IShippingBox $boxing_properties): switch ($order->getCountry()) { - case "PL": + case Countries::PL: $order_total = new OrderTotalPl(); return new CalculationsBuilderPl($order, $order_total, $boxing_properties); - case "UK": + case Countries::UK: $order_total = new OrderTotalUk(); return new CalculationsBuilderUk($order, $order_total, $boxing_properties); - case "US": + case Countries::US: $order_total = new OrderTotalUs(); return new CalculationsBuilderUs($order, $order_total, $boxing_properties); From fee760ce4344356a6834561b8debb69d398469d5 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 4 Oct 2021 12:50:31 +0200 Subject: [PATCH 35/38] refactor hardcoded values into const variables --- Countries.php | 1 + tests/MainTest.php | 17 +++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Countries.php b/Countries.php index ef42010..79c2922 100644 --- a/Countries.php +++ b/Countries.php @@ -9,5 +9,6 @@ class Countries public const PL = "PL"; public const UK = "UK"; public const US = "US"; + public const NIGERIA = "NIGERIA"; } \ No newline at end of file diff --git a/tests/MainTest.php b/tests/MainTest.php index 653492a..724e4bb 100644 --- a/tests/MainTest.php +++ b/tests/MainTest.php @@ -1,6 +1,7 @@ start("PL", 50); + $result = $main->start(Countries::PL, 50); $this->assertEquals('25PLN', $result); } @@ -29,7 +30,7 @@ public function start_needToPayPL() public function start_needToPayPLDiscount() { $main = new Main(); - $result = $main->start("PL", 50, 10); + $result = $main->start(Countries::PL, 50, 10); $this->assertEquals('15PLN', $result); } @@ -43,7 +44,7 @@ public function start_needToPayPLDiscount() public function start_needToPayPLDiscountANDPremiumBox() { $main = new Main(); - $result = $main->start("PL", 50, 10, 'PREMIUM_BOX'); + $result = $main->start(Countries::PL, 50, 10, 'PREMIUM_BOX'); $this->assertEquals('55PLN', $result); } @@ -57,7 +58,7 @@ public function start_needToPayPLDiscountANDPremiumBox() public function start_freeShippingPL() { $main = new Main(); - $result = $main->start("PL", 150); + $result = $main->start(Countries::PL, 150); $this->assertEquals('0PLN', $result); } @@ -71,7 +72,7 @@ public function start_freeShippingPL() public function start_freeShippingUK() { $main = new Main(); - $result = $main->start("UK", 450); + $result = $main->start(Countries::UK, 450); $this->assertEquals('0GBP', $result); } @@ -85,7 +86,7 @@ public function start_freeShippingUK() public function start_freeShippingUK_championsBox() { $main = new Main(); - $result = $main->start("UK", 450, 0, 'UEFA_CHAMPION'); + $result = $main->start(Countries::UK, 450, 0, 'UEFA_CHAMPION'); $this->assertEquals('40GBP', $result); } @@ -99,7 +100,7 @@ public function start_freeShippingUK_championsBox() public function start_freeShippingUs() { $main = new Main(); - $result = $main->start("US", 2450); + $result = $main->start(Countries::US, 2450); $this->assertEquals('$0', $result); } @@ -113,7 +114,7 @@ public function start_freeShippingUs() public function start_costForUnknowCountries() { $main = new Main(); - $result = $main->start("Nigeria", 2450); + $result = $main->start(Countries::NIGERIA, 2450); $this->assertEquals('ETH299', $result); } From ef14fca15f86f933f5b57a423dbb641083736cfa Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 4 Oct 2021 12:51:45 +0200 Subject: [PATCH 36/38] refactor hardcoded values into const variables --- Shipping/PriceFactory.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Shipping/PriceFactory.php b/Shipping/PriceFactory.php index ca477a3..82df66d 100644 --- a/Shipping/PriceFactory.php +++ b/Shipping/PriceFactory.php @@ -2,6 +2,8 @@ namespace App\Shipping; use App\Contracts\IPrice; +use App\Countries; +use App\Currencies; use App\Shipping\Countries\OtherCountries\PriceWorld; use App\Shipping\Countries\Pl\PricePl; use App\Shipping\Countries\Uk\PriceUk; @@ -13,12 +15,15 @@ public function create($country_code, float $value):IPrice { switch ($country_code) { - case "PLN": + case Currencies::PLN: return new PricePl($value); - case "GBP": + + case Currencies::GBP: return new PriceUk($value); - case "$": + + case Currencies::US: return new PriceUs($value); + default: return new PriceWorld($value); } From dcced5af230ea8606c97c74434f3b53474a19905 Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 4 Oct 2021 13:04:06 +0200 Subject: [PATCH 37/38] DRY - extract defaultBox code --- .../BoxPricing/DefaultBox.php | 30 +++++++++++++++++++ .../BoxPricing/DefaultBoxWorld.php | 22 ++++---------- .../Countries/Pl/BoxPricing/DefaultBoxPl.php | 18 ++++------- .../Countries/Uk/BoxPricing/DefaultBoxUk.php | 18 ++++------- .../Countries/Us/BoxPricing/DefaultBoxUs.php | 18 ++++------- 5 files changed, 54 insertions(+), 52 deletions(-) create mode 100644 Shipping/CommonCalculations/BoxPricing/DefaultBox.php diff --git a/Shipping/CommonCalculations/BoxPricing/DefaultBox.php b/Shipping/CommonCalculations/BoxPricing/DefaultBox.php new file mode 100644 index 0000000..0f00336 --- /dev/null +++ b/Shipping/CommonCalculations/BoxPricing/DefaultBox.php @@ -0,0 +1,30 @@ +price_factory = new PriceFactory(); + } + + public function calculate(IShippingBox $boxing_properties): IPrice + { + return $this->price_factory->create($this->getCurrency(), $this->getCountryPrice()); + } + + +} \ No newline at end of file diff --git a/Shipping/Countries/OtherCountries/BoxPricing/DefaultBoxWorld.php b/Shipping/Countries/OtherCountries/BoxPricing/DefaultBoxWorld.php index 685ed03..d12b72c 100644 --- a/Shipping/Countries/OtherCountries/BoxPricing/DefaultBoxWorld.php +++ b/Shipping/Countries/OtherCountries/BoxPricing/DefaultBoxWorld.php @@ -3,28 +3,18 @@ namespace App\Shipping\Countries\OtherCountries\BoxPricing; -use App\Contracts\IBoxingCalculation; -use App\Contracts\IPrice; -use App\Contracts\IShippingBox; use App\Currencies; -use App\Shipping\PriceFactory; +use App\Shipping\CommonCalculations\BoxPricing\DefaultBox; -class DefaultBoxWorld implements IBoxingCalculation +class DefaultBoxWorld extends DefaultBox { - protected $price_factory ; - - public function __construct() - { - $this->price_factory = new PriceFactory(); - } - - public function calculate(IShippingBox $boxing_properties): IPrice + protected function getCountryPrice() { - return $this->price_factory->create(Currencies::ETH, $this->getCountryPrice()); + return 0; } - protected function getCountryPrice() + protected function getCurrency() { - return 0; + return Currencies::ETH; } } \ No newline at end of file diff --git a/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php b/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php index 27075d7..b9516bb 100644 --- a/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php +++ b/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php @@ -7,24 +7,18 @@ use App\Contracts\IPrice; use App\Contracts\IShippingBox; use App\Currencies; +use App\Shipping\CommonCalculations\BoxPricing\DefaultBox; use App\Shipping\PriceFactory; -class DefaultBoxPl implements IBoxingCalculation +class DefaultBoxPl extends DefaultBox { - protected $price_factory ; - - public function __construct() - { - $this->price_factory = new PriceFactory(); - } - - public function calculate(IShippingBox $boxing_properties): IPrice + protected function getCountryPrice() { - return $this->price_factory->create(Currencies::PLN, $this->getCountryPrice()); + return 0; } - protected function getCountryPrice() + protected function getCurrency() { - return 0; + return Currencies::PLN; } } \ No newline at end of file diff --git a/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php b/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php index 2896cc6..432f2aa 100644 --- a/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php +++ b/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php @@ -7,25 +7,19 @@ use App\Contracts\IPrice; use App\Contracts\IShippingBox; use App\Currencies; +use App\Shipping\CommonCalculations\BoxPricing\DefaultBox; use App\Shipping\CommonCalculations\BoxPricing\PremiumBox; use App\Shipping\PriceFactory; -class DefaultBoxUk implements IBoxingCalculation +class DefaultBoxUk extends DefaultBox { - protected $price_factory ; - - public function __construct() - { - $this->price_factory = new PriceFactory(); - } - - public function calculate(IShippingBox $boxing_properties): IPrice + protected function getCountryPrice() { - return $this->price_factory->create(Currencies::GBP, $this->getCountryPrice()); + return 0; } - protected function getCountryPrice() + protected function getCurrency() { - return 0; + return Currencies::GBP; } } \ No newline at end of file diff --git a/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php b/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php index 33bdb93..7ffa273 100644 --- a/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php +++ b/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php @@ -7,25 +7,19 @@ use App\Contracts\IPrice; use App\Contracts\IShippingBox; use App\Currencies; +use App\Shipping\CommonCalculations\BoxPricing\DefaultBox; use App\Shipping\CommonCalculations\BoxPricing\PremiumBox; use App\Shipping\PriceFactory; -class DefaultBoxUs implements IBoxingCalculation +class DefaultBoxUs extends DefaultBox { - protected $price_factory ; - - public function __construct() - { - $this->price_factory = new PriceFactory(); - } - - public function calculate(IShippingBox $boxing_properties): IPrice + protected function getCountryPrice() { - return $this->price_factory->create(Currencies::US, $this->getCountryPrice()); + return 0; } - protected function getCountryPrice() + protected function getCurrency() { - return 0; + return Currencies::US; } } \ No newline at end of file From 57ac0408e3798034eb02d3a476a3d29287a6cb8c Mon Sep 17 00:00:00 2001 From: andrzej Date: Mon, 4 Oct 2021 13:12:31 +0200 Subject: [PATCH 38/38] small tweaks --- Shipping/CommonCalculations/BoxPricing/DefaultBox.php | 1 - Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php | 5 +---- Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php | 5 ----- Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php | 5 ----- 4 files changed, 1 insertion(+), 15 deletions(-) diff --git a/Shipping/CommonCalculations/BoxPricing/DefaultBox.php b/Shipping/CommonCalculations/BoxPricing/DefaultBox.php index 0f00336..cfad859 100644 --- a/Shipping/CommonCalculations/BoxPricing/DefaultBox.php +++ b/Shipping/CommonCalculations/BoxPricing/DefaultBox.php @@ -6,7 +6,6 @@ use App\Contracts\IBoxingCalculation; use App\Contracts\IPrice; use App\Contracts\IShippingBox; -use App\Currencies; use App\Shipping\PriceFactory; abstract class DefaultBox implements IBoxingCalculation diff --git a/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php b/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php index b9516bb..bdf49b0 100644 --- a/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php +++ b/Shipping/Countries/Pl/BoxPricing/DefaultBoxPl.php @@ -3,12 +3,9 @@ namespace App\Shipping\Countries\Pl\BoxPricing; -use App\Contracts\IBoxingCalculation; -use App\Contracts\IPrice; -use App\Contracts\IShippingBox; use App\Currencies; use App\Shipping\CommonCalculations\BoxPricing\DefaultBox; -use App\Shipping\PriceFactory; + class DefaultBoxPl extends DefaultBox { diff --git a/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php b/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php index 432f2aa..e279cc6 100644 --- a/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php +++ b/Shipping/Countries/Uk/BoxPricing/DefaultBoxUk.php @@ -3,13 +3,8 @@ namespace App\Shipping\Countries\Uk\BoxPricing; -use App\Contracts\IBoxingCalculation; -use App\Contracts\IPrice; -use App\Contracts\IShippingBox; use App\Currencies; use App\Shipping\CommonCalculations\BoxPricing\DefaultBox; -use App\Shipping\CommonCalculations\BoxPricing\PremiumBox; -use App\Shipping\PriceFactory; class DefaultBoxUk extends DefaultBox { diff --git a/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php b/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php index 7ffa273..9ccbc5a 100644 --- a/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php +++ b/Shipping/Countries/Us/BoxPricing/DefaultBoxUs.php @@ -3,13 +3,8 @@ namespace App\Shipping\Countries\Us\BoxPricing; -use App\Contracts\IBoxingCalculation; -use App\Contracts\IPrice; -use App\Contracts\IShippingBox; use App\Currencies; use App\Shipping\CommonCalculations\BoxPricing\DefaultBox; -use App\Shipping\CommonCalculations\BoxPricing\PremiumBox; -use App\Shipping\PriceFactory; class DefaultBoxUs extends DefaultBox {