Esempio n. 1
0
 /**
  * convert cart positions in order positions
  *
  * @return void
  *
  * @author Sebastian Diel <*****@*****.**>,
  *         Sascha Koehler <*****@*****.**>
  * @since 15.11.2014
  */
 public function convertShoppingCartPositionsToOrderPositions()
 {
     if ($this->extend('updateConvertShoppingCartPositionsToOrderPositions')) {
         return true;
     }
     $member = SilvercartCustomer::currentUser();
     if ($member instanceof Member) {
         $silvercartShoppingCart = $member->getCart();
         $silvercartShoppingCart->setPaymentMethodID($this->SilvercartPaymentMethodID);
         $silvercartShoppingCart->setShippingMethodID($this->SilvercartShippingMethodID);
         $shoppingCartPositions = SilvercartShoppingCartPosition::get()->filter('SilvercartShoppingCartID', $member->SilvercartShoppingCartID);
         if ($shoppingCartPositions->exists()) {
             foreach ($shoppingCartPositions as $shoppingCartPosition) {
                 $product = $shoppingCartPosition->SilvercartProduct();
                 if ($product) {
                     $orderPosition = new SilvercartOrderPosition();
                     $orderPosition->objectCreated = true;
                     $orderPosition->Price->setAmount($shoppingCartPosition->getPrice(true)->getAmount());
                     $orderPosition->Price->setCurrency($shoppingCartPosition->getPrice(true)->getCurrency());
                     $orderPosition->PriceTotal->setAmount($shoppingCartPosition->getPrice()->getAmount());
                     $orderPosition->PriceTotal->setCurrency($shoppingCartPosition->getPrice()->getCurrency());
                     $orderPosition->Tax = $shoppingCartPosition->getTaxAmount(true);
                     $orderPosition->TaxTotal = $shoppingCartPosition->getTaxAmount();
                     $orderPosition->TaxRate = $product->getTaxRate();
                     $orderPosition->ProductDescription = $product->LongDescription;
                     $orderPosition->Quantity = $shoppingCartPosition->Quantity;
                     $orderPosition->numberOfDecimalPlaces = $product->SilvercartQuantityUnit()->numberOfDecimalPlaces;
                     $orderPosition->ProductNumber = $shoppingCartPosition->getProductNumberShop();
                     $orderPosition->Title = $product->Title;
                     $orderPosition->SilvercartOrderID = $this->ID;
                     $orderPosition->IsNonTaxable = $member->doesNotHaveToPayTaxes();
                     $orderPosition->SilvercartProductID = $product->ID;
                     $orderPosition->log = false;
                     $this->extend('onBeforeConvertSingleShoppingCartPositionToOrderPosition', $shoppingCartPosition, $orderPosition);
                     $orderPosition->write();
                     // Call hook method on product if available
                     if ($product->hasMethod('ShoppingCartConvert')) {
                         $product->ShoppingCartConvert($this, $orderPosition);
                     }
                     // decrement stock quantity of the product
                     if (SilvercartConfig::EnableStockManagement()) {
                         $product->decrementStockQuantity($shoppingCartPosition->Quantity);
                     }
                     $this->extend('onAfterConvertSingleShoppingCartPositionToOrderPosition', $shoppingCartPosition, $orderPosition);
                     $result = SilvercartPlugin::call($this, 'convertShoppingCartPositionToOrderPosition', array($shoppingCartPosition, $orderPosition), true, array());
                     if (!empty($result)) {
                         $orderPosition = $result[0];
                     }
                     $orderPosition->write();
                     unset($orderPosition);
                 }
             }
             // Get taxable positions from registered modules
             $registeredModules = $member->getCart()->callMethodOnRegisteredModules('ShoppingCartPositions', array($member->getCart(), $member, true));
             foreach ($registeredModules as $moduleName => $moduleOutput) {
                 foreach ($moduleOutput as $modulePosition) {
                     $orderPosition = new SilvercartOrderPosition();
                     if ($this->IsPriceTypeGross()) {
                         if ($modulePosition->Price instanceof Money) {
                             $price = $modulePosition->Price->getAmount();
                         } else {
                             $price = $modulePosition->Price;
                         }
                         $orderPosition->Price->setAmount($price);
                     } else {
                         if ($modulePosition->Price instanceof Money) {
                             $price = $modulePosition->PriceNet->getAmount();
                         } else {
                             $price = $modulePosition->PriceNet;
                         }
                         $orderPosition->Price->setAmount($price);
                     }
                     $orderPosition->Price->setCurrency($modulePosition->Currency);
                     if ($this->IsPriceTypeGross()) {
                         $orderPosition->PriceTotal->setAmount($modulePosition->PriceTotal);
                     } else {
                         $orderPosition->PriceTotal->setAmount($modulePosition->PriceNetTotal);
                     }
                     $orderPosition->PriceTotal->setCurrency($modulePosition->Currency);
                     $orderPosition->Tax = 0;
                     $orderPosition->TaxTotal = $modulePosition->TaxAmount;
                     $orderPosition->TaxRate = $modulePosition->TaxRate;
                     $orderPosition->ProductDescription = $modulePosition->LongDescription;
                     $orderPosition->Quantity = $modulePosition->Quantity;
                     $orderPosition->Title = $modulePosition->Name;
                     if ($modulePosition->isChargeOrDiscount) {
                         $orderPosition->isChargeOrDiscount = true;
                         $orderPosition->chargeOrDiscountModificationImpact = $modulePosition->chargeOrDiscountModificationImpact;
                     }
                     $orderPosition->SilvercartOrderID = $this->ID;
                     $orderPosition->write();
                     unset($orderPosition);
                 }
             }
             // Get charges and discounts for product values
             if ($silvercartShoppingCart->HasChargesAndDiscountsForProducts()) {
                 $chargesAndDiscountsForProducts = $silvercartShoppingCart->ChargesAndDiscountsForProducts();
                 foreach ($chargesAndDiscountsForProducts as $chargeAndDiscountForProduct) {
                     $orderPosition = new SilvercartOrderPosition();
                     $orderPosition->Price->setAmount($chargeAndDiscountForProduct->Price->getAmount());
                     $orderPosition->Price->setCurrency($chargeAndDiscountForProduct->Price->getCurrency());
                     $orderPosition->PriceTotal->setAmount($chargeAndDiscountForProduct->Price->getAmount());
                     $orderPosition->PriceTotal->setCurrency($chargeAndDiscountForProduct->Price->getCurrency());
                     $orderPosition->isChargeOrDiscount = true;
                     $orderPosition->chargeOrDiscountModificationImpact = $chargeAndDiscountForProduct->sumModificationImpact;
                     $orderPosition->Tax = $chargeAndDiscountForProduct->SilvercartTax->Title;
                     if ($this->IsPriceTypeGross()) {
                         $orderPosition->TaxTotal = $chargeAndDiscountForProduct->Price->getAmount() - $chargeAndDiscountForProduct->Price->getAmount() / (100 + $chargeAndDiscountForProduct->SilvercartTax->Rate) * 100;
                     } else {
                         $orderPosition->TaxTotal = $chargeAndDiscountForProduct->Price->getAmount() / 100 * (100 + $chargeAndDiscountForProduct->SilvercartTax->Rate) - $chargeAndDiscountForProduct->Price->getAmount();
                     }
                     $orderPosition->TaxRate = $chargeAndDiscountForProduct->SilvercartTax->Rate;
                     $orderPosition->ProductDescription = $chargeAndDiscountForProduct->Name;
                     $orderPosition->Quantity = 1;
                     $orderPosition->ProductNumber = $chargeAndDiscountForProduct->sumModificationProductNumber;
                     $orderPosition->Title = $chargeAndDiscountForProduct->Name;
                     $orderPosition->SilvercartOrderID = $this->ID;
                     $orderPosition->write();
                     unset($orderPosition);
                 }
             }
             // Get nontaxable positions from registered modules
             $registeredModulesNonTaxablePositions = $member->getCart()->callMethodOnRegisteredModules('ShoppingCartPositions', array($member->getCart(), $member, false));
             foreach ($registeredModulesNonTaxablePositions as $moduleName => $moduleOutput) {
                 foreach ($moduleOutput as $modulePosition) {
                     $orderPosition = new SilvercartOrderPosition();
                     if ($this->IsPriceTypeGross()) {
                         $orderPosition->Price->setAmount($modulePosition->Price);
                     } else {
                         $orderPosition->Price->setAmount($modulePosition->PriceNet);
                     }
                     $orderPosition->Price->setCurrency($modulePosition->Currency);
                     if ($this->IsPriceTypeGross()) {
                         $orderPosition->PriceTotal->setAmount($modulePosition->PriceTotal);
                     } else {
                         $orderPosition->PriceTotal->setAmount($modulePosition->PriceNetTotal);
                     }
                     $orderPosition->PriceTotal->setCurrency($modulePosition->Currency);
                     $orderPosition->Tax = 0;
                     $orderPosition->TaxTotal = $modulePosition->TaxAmount;
                     $orderPosition->TaxRate = $modulePosition->TaxRate;
                     $orderPosition->ProductDescription = $modulePosition->LongDescription;
                     $orderPosition->Quantity = $modulePosition->Quantity;
                     $orderPosition->Title = $modulePosition->Name;
                     $orderPosition->SilvercartOrderID = $this->ID;
                     $orderPosition->write();
                     unset($orderPosition);
                 }
             }
             // Get charges and discounts for shopping cart total
             if ($silvercartShoppingCart->HasChargesAndDiscountsForTotal()) {
                 $chargesAndDiscountsForTotal = $silvercartShoppingCart->ChargesAndDiscountsForTotal();
                 foreach ($chargesAndDiscountsForTotal as $chargeAndDiscountForTotal) {
                     $orderPosition = new SilvercartOrderPosition();
                     $orderPosition->Price->setAmount($chargeAndDiscountForTotal->Price->getAmount());
                     $orderPosition->Price->setCurrency($chargeAndDiscountForTotal->Price->getCurrency());
                     $orderPosition->PriceTotal->setAmount($chargeAndDiscountForTotal->Price->getAmount());
                     $orderPosition->PriceTotal->setCurrency($chargeAndDiscountForTotal->Price->getCurrency());
                     $orderPosition->isChargeOrDiscount = true;
                     $orderPosition->chargeOrDiscountModificationImpact = $chargeAndDiscountForTotal->sumModificationImpact;
                     $orderPosition->Tax = $chargeAndDiscountForTotal->SilvercartTax->Title;
                     if ($this->IsPriceTypeGross()) {
                         $orderPosition->TaxTotal = $chargeAndDiscountForTotal->Price->getAmount() - $chargeAndDiscountForTotal->Price->getAmount() / (100 + $chargeAndDiscountForTotal->SilvercartTax->Rate) * 100;
                     } else {
                         $orderPosition->TaxTotal = $chargeAndDiscountForTotal->Price->getAmount() / 100 * (100 + $chargeAndDiscountForTotal->SilvercartTax->Rate) - $chargeAndDiscountForTotal->Price->getAmount();
                     }
                     $orderPosition->TaxRate = $chargeAndDiscountForTotal->SilvercartTax->Rate;
                     $orderPosition->ProductDescription = $chargeAndDiscountForTotal->Name;
                     $orderPosition->Quantity = 1;
                     $orderPosition->ProductNumber = $chargeAndDiscountForTotal->sumModificationProductNumber;
                     $orderPosition->Title = $chargeAndDiscountForTotal->Name;
                     $orderPosition->SilvercartOrderID = $this->ID;
                     $orderPosition->write();
                     unset($orderPosition);
                 }
             }
             // Convert positions of registered modules
             $member->getCart()->callMethodOnRegisteredModules('ShoppingCartConvert', array(SilvercartCustomer::currentUser()->getCart(), SilvercartCustomer::currentUser(), $this));
             $this->extend('onAfterConvertShoppingCartPositionsToOrderPositions', $silvercartShoppingCart);
             // Delete the shoppingcart positions
             foreach ($shoppingCartPositions as $shoppingCartPosition) {
                 $shoppingCartPosition->delete();
             }
             $this->write();
         }
         SilvercartPlugin::call($this, 'convertShoppingCartPositionsToOrderPositions', array($this), true);
     }
 }
 /**
  * Returns the position of the product in cart
  * 
  * @param int $cartID Cart ID to check positions for
  * 
  * @return SilvercartShoppingCartPosition
  * 
  * @author Sebastian Diel <*****@*****.**>
  * @since 15.11.2014
  */
 public function getPositionInCart($cartID = null)
 {
     if (is_null($cartID) && SilvercartCustomer::currentUser() instanceof Member) {
         $cartID = SilvercartCustomer::currentUser()->getCart()->ID;
     }
     if (!array_key_exists($cartID, $this->positionInCart)) {
         $this->positionInCart[$cartID] = SilvercartShoppingCartPosition::get()->filter(array('SilvercartProductID' => $this->ID, 'SilvercartShoppingCartID' => $cartID))->first();
         $this->extend('updatePositionInCart', $this->positionInCart[$cartID]);
     }
     return $this->positionInCart[$cartID];
 }
 /**
  * deletes all shopping cart positions when cart is deleted
  *
  * @author Sascha Koehler <*****@*****.**>
  * @since 22.10.2010
  * @return void
  */
 public function onBeforeDelete()
 {
     parent::onBeforeDelete();
     $shoppingCartPositions = SilvercartShoppingCartPosition::get()->filter('SilvercartShoppingCartID', $this->ID);
     if ($shoppingCartPositions->exists()) {
         foreach ($shoppingCartPositions as $obj) {
             $obj->delete();
         }
     }
 }