/** * Add elements into the specified zone * * @param \XLite\Model\Zone $zone Zone object * @param array $data Array of elements: array(<elementType> => array(value1, value2, value3...)) * * @return \XLite\Model\Zone */ public function addElements($zone, $data) { foreach ($data as $elementType => $elements) { if (is_array($elements) && !empty($elements)) { foreach ($elements as $elementValue) { $newElement = new \XLite\Model\ZoneElement(); $newElement->setElementValue($elementValue); $newElement->setElementType($elementType); $newElement->setZone($zone); $zone->addZoneElements($newElement); } } } return $zone; }
public function testCalculation() { $tax = \XLite\Core\Database::getRepo('XLite\\Module\\CDev\\VAT\\Model\\Tax')->getTax(); foreach ($tax->getRates() as $rate) { $rate->setTax(null); \XLite\Core\Database::getEM()->remove($rate); } $tax->getRates()->clear(); $tax = \XLite\Core\Database::getRepo('XLite\\Module\\CDev\\SalesTax\\Model\\Tax')->getTax(); foreach ($tax->getRates() as $rate) { \XLite\Core\Database::getEM()->remove($rate); } $tax->getRates()->clear(); $rate = new \XLite\Module\CDev\SalesTax\Model\Tax\Rate(); $rate->setValue(10); $rate->setPosition(1); \XLite\Core\Database::getEM()->persist($rate); $tax->addRates($rate); $rate->setTax($tax); \XLite\Core\Database::getEM()->flush(); $order = $this->getTestOrder(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.1); $this->assertEquals($etalon, $cost, 'check tax cost 10%'); // 10% $rate = new \XLite\Module\CDev\SalesTax\Model\Tax\Rate(); $rate->setValue(20); $rate->setPosition(2); \XLite\Core\Database::getEM()->persist($rate); $tax->addRates($rate); $rate->setTax($tax); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.1); $this->assertEquals($etalon, $cost, 'check tax cost 10% #2'); // 20% $rate->setPosition(0); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.2); $this->assertEquals($etalon, $cost, 'check tax cost 20%'); // Limit by membership (order) $memberships = \XLite\Core\Database::getRepo('XLite\\Model\\Membership')->findAll(); $membership = array_shift($memberships); $membership2 = array_shift($memberships); $order->getProfile()->setMembership($membership); $rate->setMembership($membership); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.2); $this->assertEquals($etalon, $cost, 'check tax cost 20% (membership)'); // Limit by membership (order and rate) $rate->setMembership($membership2); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.1); $this->assertEquals($etalon, $cost, 'check tax cost 10% (membership)'); // Limit by product class (rate) $rate->setMembership(null); foreach (\XLite\Core\Database::getRepo('XLite\\Model\\ProductClass')->findAll() as $pc) { \XLite\Core\Database::getEM()->remove($pc); } $pc = new \XLite\Model\ProductClass(); $pc->setName('Test PC'); \XLite\Core\Database::getEM()->persist($pc); $rate->setProductClass($pc); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.1); $this->assertEquals($etalon, $cost, 'check tax cost 10% (pc)'); // Limit by product class (item and rate) $order->getItems()->get(0)->getProduct()->addClasses($pc); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.2); $this->assertEquals($etalon, $cost, 'check tax cost 20% (pc)'); // Limit by product class (only item) $rate->setProductClass(null); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.2); $this->assertEquals($etalon, $cost, 'check tax cost 20% (pc)'); // Remove test product class $order->getItems()->get(0)->getProduct()->getClasses()->removeElement($pc); \XLite\Core\Database::getEM()->remove($pc); \XLite\Core\Database::getEM()->flush(); // Zone (order) foreach (\XLite\Core\Database::getRepo('XLite\\Model\\Zone')->findAll() as $z) { \XLite\Core\Database::getEM()->remove($z); } $z = new \XLite\Model\Zone(); $z->setZoneName('Test zone'); $e = new \XLite\Model\ZoneElement(); $e->setElementValue('AF'); $e->setElementType('C'); $z->addZoneElements($e); \XLite\Core\Database::getEM()->persist($z); $rate->setZone($z); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.1); $this->assertEquals($etalon, $cost, 'check tax cost 10% (zone)'); // Zone (order and rate) $country = \XLite\Core\Database::getRepo('XLite\\Model\\Country')->findOneBy(array('code' => 'AF')); $order->getProfile()->getBillingAddress()->setCountry($country); \XLite\Core\Database::getEM()->flush(); $order->calculate(); $cost = $order->getCurrency()->formatValue($order->getSurchargeSumByType('tax')); $etalon = $order->getCurrency()->formatValue($order->getSubtotal() * 0.2); $this->assertEquals($etalon, $cost, 'check tax cost 20% (zone)'); }
/** * testGetZoneAddresses * * @return void * @access public * @see ____func_see____ * @since 1.0.0 */ public function testGetZoneAddresses() { $zone = \XLite\Core\Database::getRepo('XLite\\Model\\Zone')->findOneBy(array('zone_name' => 'New York area')); $this->assertNotNull($zone, 'check zone'); $zoneElement = new \XLite\Model\ZoneElement(); $zoneElement->setElementValue('addr'); $zoneElement->setElementType('A'); $zoneElement->setZone($zone); $zone->addZoneElements($zoneElement); $addresses = $zone->getZoneAddresses(); $this->assertTrue(in_array('addr', $addresses), 'addr is not found in zone definition'); }