/** * @covers Model_Shipping_Item::filter_discounted_items * @dataProvider data_filter_discounted_items */ public function test_filter_discounted_items($items, $expected_ids) { $total = new Jam_Price(10, 'GBP'); $shipping_items = array(); foreach ($items as $id => $return_is_discounted) { $shipping_group = $this->getMock('Model_Shipping_Group', array('is_discounted'), array('shipping_group')); $shipping_group->expects($this->once())->method('is_discounted')->with($this->identicalTo($total))->will($this->returnValue($return_is_discounted)); $shipping_item = Jam::build('shipping_item', array('id' => $id, 'shipping_group' => $shipping_group)); $shipping_items[] = $shipping_item; } $filtered = Model_Shipping_Item::filter_discounted_items($shipping_items, $total); $this->assertEquals($expected_ids, $this->ids($filtered)); }
public function total_price() { $total = $this->total_purchase_price(); $items = $this->available_items(); $items = Model_Shipping_Item::filter_discounted_items($items, $total); $groups = Array_Util::group_by($items, function ($item) { return $item->group_key(); }); $group_prices = array_map(function ($grouped_items) use($total) { $prices = Model_Shipping_Item::relative_prices($grouped_items); return Jam_Price::sum($prices, $total->currency(), $total->monetary(), $total->display_currency()); }, $groups); return Jam_Price::sum($group_prices, $total->currency(), $total->monetary(), $total->display_currency()); }