Example #1
0
 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)');
 }
Example #2
0
 /**
  * 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');
 }