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)'); }
/** * Do action 'Create' * * @return void */ protected function doActionCreate() { $postedData = \XLite\Core\Request::getInstance()->getData(); $data = $this->getElementsData($postedData); if (!empty($data[\XLite\Model\ZoneElement::ZONE_ELEMENT_COUNTRY])) { $zoneName = trim($postedData['zone_name']); if (!empty($zoneName)) { // Create new zone with specified name $zone = new \XLite\Model\Zone(); $zone->setZoneName($zoneName); \XLite\Core\Database::getEM()->persist($zone); \XLite\Core\Database::getEM()->flush(); // Get zone_id of just created zone $zoneId = $zone->getZoneId(); if (isset($zoneId)) { // Insert new elements from POST $zone = $this->addElements($zone, $data); \XLite\Core\Database::getEM()->persist($zone); \XLite\Core\Database::getEM()->flush(); \XLite\Core\Database::getRepo('XLite\\Model\\Zone')->cleanCache(); \XLite\Core\TopMessage::addInfo('New zone has been created successfully'); $this->redirect('admin.php?target=shipping_zones&zoneid=' . $zoneId); } else { \XLite\Core\TopMessage::addError('New zone was not created due to internal error'); } } else { \XLite\Core\TopMessage::addError('Could not create zone with empty name. Please specify it.'); } } else { \XLite\Core\TopMessage::addError('The countries list for zone is empty. Please specify it.'); } $this->redirect('admin.php?target=shipping_zones&mode=add'); }