Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Módulo BestSeller Magento - Somando produtos configuráveis ​​e adicionando-os novamente


Obrigado por postar esse código de exemplo! Consegui usá-lo para criar uma solução que deve funcionar bem para nós dois.

Descobri que as vendas de produtos configuráveis ​​estão sendo somadas corretamente, mas não estão sendo incluídas nos resultados; seus produtos filhos aparecem em vez disso. Minha solução foi incluir produtos configuráveis, fazer uma junção à esquerda no catalog_product_super_link table e filtre qualquer coisa que tenha um parent_id . Aqui estão as alterações que você precisará fazer:

Collection.php:
    public function addOrderedQty($from = '', $to = '', $getComplexProducts=false, $getComplexChildProducts = true, $getRemovedProducts = true)
    {
        $qtyOrderedTableName = $this->getTable('sales/order_item');
        $qtyOrderedFieldName = 'qty_ordered';

        $productIdFieldName = 'product_id';

        if (!$getComplexProducts) {
            $compositeTypeIds = Mage::getSingleton('catalog/product_type')->getCompositeTypes();
            $productTypes = $this->getConnection()->quoteInto(' AND (e.type_id NOT IN (?))', $compositeTypeIds);
        } else {
            $productTypes = '';
        }

        if ($from != '' && $to != '') {
            $dateFilter = " AND `order`.created_at BETWEEN '{$from}' AND '{$to}'";
        } else {
            $dateFilter = "";
        }

        $this->getSelect()->reset()->from(
            array('order_items' => $qtyOrderedTableName),
            array(
                'ordered_qty' => "SUM(order_items.{$qtyOrderedFieldName})",
                'order_items_name' => 'order_items.name'
            )
        );

         $_joinCondition = $this->getConnection()->quoteInto(
                'order.entity_id = order_items.order_id AND order.state<>?', Mage_Sales_Model_Order::STATE_CANCELED
         );
         $_joinCondition .= $dateFilter;
         $this->getSelect()->joinInner(
            array('order' => $this->getTable('sales/order')),
            $_joinCondition,
            array()
         );

         // Add join to get the parent id for configurables
         $this->getSelect()->joinLeft(
             array('cpsl' => $this->getTable('catalog/product_super_link')),
             'cpsl.product_id = order_items.product_id',
             'cpsl.parent_id'
         );

        if(!$getComplexChildProducts)
            $this->getSelect()->having('parent_id IS NULL');

        if($getRemovedProducts)
        {
             $this->getSelect()
                ->joinLeft(array('e' => $this->getProductEntityTableName()),
                    "e.entity_id = order_items.{$productIdFieldName} AND e.entity_type_id = {$this->getProductEntityTypeId()}{$productTypes}")
                ->group('order_items.product_id');
        }
        else
        {
            $this->getSelect()
                ->joinInner(array('e' => $this->getProductEntityTableName()),
                    "e.entity_id = order_items.{$productIdFieldName} AND e.entity_type_id = {$this->getProductEntityTypeId()}{$productTypes}")
                ->group('e.entity_id');
        }


        $this->getSelect()->having('ordered_qty > 0');

        // This line is for debug purposes, in case you'd like to see what the SQL looks like
        // $x = $this->getSelect()->__toString();

        return $this;
    }

List.php - Encontre as duas linhas a seguir...
$bestsellers->addOrderedQty($startDate, $todayDate, true);
$bestsellers->addOrderedQty('', '', true);

... e altere-os para:
$bestsellers->addOrderedQty($startDate, $todayDate, true, false, false);
$bestsellers->addOrderedQty('', '', true, false, false);

Minhas alterações adicionaram dois novos parâmetros opcionais, ambos padronizados como true , para não quebrar a funcionalidade existente.
  • Quando $getComplexChildProducts está definido como false , todos os itens filhos do produto configurável serão removidos dos resultados.
  • $getRemovedProducts determina se os produtos encomendados anteriormente (que foram excluídos do Magento) também devem aparecer.

Observe que as estatísticas do seu relatório precisarão estar atualizadas para obter resultados precisos.

Espero que isto ajude! Deixe-me saber se você tiver alguma dúvida.