Code Snippets : créer une nouvelle commande

  • De le 24 mars 2013
  • Difficulté : 3/4

Code Snippets : créer une nouvelle commande Il peut parfois être utile de créer un nouveau client puis de générer une commande directement depuis un module. Cet article est un aide mémoire pour la création complète d'une commande : client, produits, méthode de paiement, méthode de livraison, adresses... Code rédigé à partir de Magento CE 1.7.0.2.

Cette méthode permet de créer manuellement une commande sans quote associé. Il s'agit d'un exemple qu'il conviendra d'adapter selon le besoin.

Création du client

La première étape est de créer le nouveau client s'il n'existe pas.

Nouveau client

$customer = Mage::getModel('customer/customer');

$email = 'contact@domain.com';

$customer->setWebsiteId(Mage::app()->getWebsite()->getId());
$customer->loadByEmail($email);

if(!$customer->getId()) {

    /* Obligatoire */
    $customer->setGroupId(1); // General
    $customer->setEmail($email);
    $customer->setFirstname('Jean');
    $customer->setLastname('Dupond');
    $customer->setPassword('123456');
    
    /* Optionnel */
    $customer->setPrefix('Prefix');
    $customer->setSuffix('Suffix');
    $customer->setMiddlename('Paul');
    $customer->setTaxvat('123456789');
    $customer->setDob('1980-03-12');
    $customer->setGender(1); // 1 : Male, 2 : Female

    $customer->setConfirmation(null);
    $customer->save();

}

Génération d'une nouvelle commande

L'identifiant du client est maintenant connu, nous pouvons initialiser la commande.

Initialisation de la commande

Ces variables serviront à renseigner les montants de la commande. Nous les utiliserons lors de la sélection de la méthode de livraison, puis de l'ajout des produits.

Déclaration des variables

$orderTotalInclTax = 0;
$orderTotalTax = 0;
$orderTotalQty = 0;
$orderTotalWeight = 0;
$orderSubtotalExclTax = 0;
$orderSubtotalInclTax = 0;

Pour l'initialisation nous renseignons le Store Id associé, le numéro de commande et les informations relatives à la devise. Aucun quote n'est généré pour cette création de commande, son identifiant sera nul. Nous considérons également que la commande n'est pas une commande virtuel.

Initialisation

$storeId = $customer->getStoreId();

$store = Mage::app()->getStore($storeId);

$incrementId = Mage::getSingleton('eav/config')
               ->getEntityType('order')
               ->fetchNewIncrementId($storeId);

$globalCurrencyCode = Mage::app()->getBaseCurrencyCode();
$baseCurrency = $store->getBaseCurrency();
$currentCurrency = $store->getCurrentCurrency();

$order = Mage::getModel('sales/order')
         ->setState(Mage_Sales_Model_Order::STATE_NEW)
         ->setIncrementId($incrementId)
         ->setStoreId($storeId)
         ->setQuoteId(0)
         ->setIsVirtual(0)
         ->setBaseToGlobalRate($baseCurrency->getRate($globalCurrencyCode))
         ->setBaseToOrderRate($baseCurrency->getRate($currentCurrency))
         ->setStoreToBaseRate($baseCurrency->getRate($globalCurrencyCode)) // Deprecated
         ->setStoreToOrderRate($baseCurrency->getRate($currentCurrency)) // Deprecated
         ->setGlobalCurrencyCode($globalCurrencyCode)
         ->setBaseCurrencyCode($baseCurrency->getCode())
         ->setStoreCurrencyCode($baseCurrency->getCode())
         ->setOrderCurrencyCode($baseCurrency->getCode());

Association des données client

Le client précédemment instancié doit être associé à la commande.

Données client

$order->setCustomerEmail($customer->getEmail())
      ->setCustomerFirstname($customer->getFirstname())
      ->setCustomerLastname($customer->getLastname())
      ->setCustomerGroupId($customer->getGroupId())
      ->setCustomerIsGuest(0)
      ->setCustomer($customer);

Adresse de facturation

Adresse

$billingAddress = Mage::getModel('sales/order_address');

/* Obligatoire */
$billingAddress->setStoreId($storeId)
               ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
               ->setCustomerId($customer->getId())
               ->setFirstname('Jean')
               ->setLastname('Dupond')
               ->setStreet('52 rue Magento')
               ->setCity('Lille')
               ->setPostcode('59000')
               ->setTelephone('0310203040');

/* Region */
$region = Mage::getModel('directory/region')->loadByCode(59, 'FR'); // 59 - Nord

if($region->getRegionId()) {
    $billingAddress->setCountryId($region->getCountryId())
                   ->setRegion($region->getDefaultName())
                   ->setRegionId($region->getRegionId());
}

/* Optionnel */
$billingAddress->setPrefix('Prefix')
               ->setMiddlename('Paul')
               ->setSuffix('Suffix')
               ->setCompany('Magentix')
               ->setFax('0310203041')
               ->setVatId('123456789');

$order->setBillingAddress($billingAddress);

Adresse de livraison

Adresse

$shippingAddress = Mage::getModel('sales/order_address');

/* Obligatoire */
$shippingAddress->setStoreId($storeId)
                ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
                ->setCustomerId($customer->getId())
                ->setFirstname('Jean')
                ->setLastname('Dupond')
                ->setStreet('52 rue Magento')
                ->setCity('Lille')
                ->setPostcode('59000')
                ->setTelephone('0310203040');

/* Region */
$region = Mage::getModel('directory/region')->loadByCode(59, 'FR'); // 59 - Nord

if($region->getRegionId()) {
    $shippingAddress->setCountryId($region->getCountryId())
                    ->setRegion($region->getDefaultName())
                    ->setRegionId($region->getRegionId());
}

/* Optionnel */
$shippingAddress->setPrefix('Prefix')
                ->setMiddlename('Paul')
                ->setSuffix('Suffix')
                ->setCompany('Magentix')
                ->setFax('0310203041')
                ->setVatId('123456789');

$order->setShippingAddress($shippingAddress);

Méthode de livraison

Pour la méthode de livraison il nous faut récupérer les informations depuis la configuration. Pour simplifier, nous considérons que :

  • La méthode de livraison est Flatrate
  • Le montant de livraison est hors taxe
  • Le montant de livraison est fixe pour la commande

Nous appliquons la TVA selon la classe de taxe associée dans la configuration.

Méthode de livraison

$carrierTitle = Mage::getStoreConfig('carriers/flatrate/title');
$methodName = Mage::getStoreConfig('carriers/flatrate/name');

$order->setShippingMethod('flatrate_flatrate');
$order->setShippingDescription($carrierTitle.' - '.$methodName);

$taxClassId = Mage::getStoreConfig('tax/classes/shipping_tax_class');

$taxCalculation = Mage::getSingleton('tax/calculation');
$storeTaxRequest = $taxCalculation->getRateOriginRequest($store);
$taxPercent = $taxCalculation->getRate($storeTaxRequest->setProductClassId($taxClassId));

$shippingPriceExclTax = Mage::getStoreConfig('carriers/flatrate/price');
$shippingPriceInclTax = $shippingPriceExclTax * 1+($taxPercent/100);
$shippingTaxAmount = $shippingPriceInclTax - $shippingPriceExclTax;

$order->setShippingAmount($shippingPriceExclTax)
      ->setBaseShippingAmount($shippingPriceExclTax)
      ->setShippingTaxAmount($shippingTaxAmount)
      ->setBaseShippingTaxAmount($shippingTaxAmount)
      ->setShippingInclTax($shippingPriceInclTax)
      ->setBaseShippingInclTax($shippingPriceInclTax)
      ->setShippingDiscountAmount(0)
      ->setBaseShippingDiscountAmount(0);

$orderTotalInclTax += $shippingPriceInclTax;
$orderTotalTax += $shippingTaxAmount;

Méthode de paiement

La méthode de paiement choisie est chèque (checkmo).

Méthode de paiement

$orderPayment = Mage::getModel('sales/order_payment')
                ->setStoreId($storeId)
                ->setMethod('checkmo');

$order->setPayment($orderPayment);

Ajout des produits

Nous considérons pour les produits que le prix est saisi hors taxe. Nous appliquons la TVA selon la classe de taxe associée. Le produit ajouté est un produit simple sans option.

Produits

$products = array(
    '1' => array('qty' => 2)
);

foreach ($products as $id => $params) {
    $product = Mage::getModel('catalog/product')->load($id);
    
    $priceExclTax = $product->getPrice();
    $priceInclTax = Mage::helper('tax')->getPrice($product, $product->getPrice(),true,$shippingAddress,$billingAddress,null,$storeId,false);
    
    $totalExclTax = $priceExclTax * $params['qty'];
    $totalInclTax = $priceInclTax * $params['qty'];
    
    $taxAmount = $totalInclTax - $totalExclTax;
    
    $taxPercent = $product->getTaxPercent();
    if (is_null($taxPercent)) {
        $taxClassId = $product->getTaxClassId();
        if($taxClassId) {
            $taxCalculation = Mage::getSingleton('tax/calculation');
            $request = $taxCalculation->getRateRequest($shippingAddress, $billingAddress, null, $storeId);
            $taxPercent = $taxCalculation->getRate($request->setProductClassId($taxClassId));
        }
    }

    $orderItem = Mage::getModel('sales/order_item')
                 ->setStoreId($storeId)
                 ->setQuoteItemId(0)
                 ->setQuoteParentItemId(null)
                 ->setProductId($id)
                 ->setProductType($product->getTypeId())
                 ->setQtyBackordered(null)
                 ->setTotalQtyOrdered($params['qty'])
                 ->setQtyOrdered($params['qty'])
                 ->setName($product->getName())
                 ->setSku($product->getSku())
                 ->setPrice($priceExclTax)
                 ->setIsVirtual(0)
                 ->setWeight($product->getWeight())
                 ->setRowWeight($product->getWeight()*$params['qty'])
                 ->setIsQtyDecimal(0)
                 ->setTaxAmount($taxAmount)
                 ->setTaxPercent($taxPercent)
                 ->setBaseTaxAmount($taxAmount)
                 ->setBasePrice($priceExclTax)
                 ->setOriginalPrice($priceExclTax)
                 ->setRowTotal($totalExclTax)
                 ->setBaseRowTotal($totalExclTax)
                 ->setPriceInclTax($priceInclTax)
                 ->setBasePriceInclTax($priceInclTax)
                 ->setRowTotalInclTax($totalInclTax)
                 ->setBaseRowTotalInclTax($totalInclTax);

    $order->addItem($orderItem);

    $orderTotalInclTax += $totalInclTax;
    $orderTotalTax += $taxAmount;
    $orderSubtotalExclTax += $totalExclTax;
    $orderSubtotalInclTax += $totalInclTax;
    $orderTotalQty += $params['qty'];
    $orderTotalWeight += $product->getWeight()*$params['qty'];
}

Montants de la commande

Nous pouvons enfin appliquer les montants à la commande.

Montants

$order->setGrandTotal($orderTotalInclTax)
      ->setBaseGrandTotal($orderTotalInclTax)
      ->setSubtotal($orderSubtotalExclTax)
      ->setBaseSubtotal($orderSubtotalExclTax)
      ->setSubtotalInclTax($orderSubtotalInclTax)
      ->setBaseSubtotalInclTax($orderSubtotalInclTax)
      ->setTaxAmount($orderTotalTax)
      ->setBaseTaxAmount($orderTotalTax)
      ->setTotalQtyOrdered($orderTotalQty)
      ->setWeight($orderTotalWeight)
      ->setDiscountAmount(0)
      ->setBaseDiscountAmount(0);

Enregistrement de la commande

Transaction

$transaction = Mage::getModel('core/resource_transaction');

$transaction->addObject($order);
$transaction->addCommitCallback(array($order, 'place'));
$transaction->addCommitCallback(array($order, 'save'));
$transaction->save();
commentaires

Commentez cet article : Code Snippets : créer une nouvelle commande