Atualização de preços em grupo

Escrito por Mario SAM

Algumas vezes precisamos revisar nossa estratégia de preços e ver o que a concorrência anda fazendo, e a partir destas informações tomar decisões de ajuste de preço – para mais ou para menos.

E em uma situação como esta precisamos aplicar atualizações de preço em massa. Selecionar um grupo inteiro de produtos, seja uma categoria, um tipo de produto, ou até mesmo a loja inteira.

O Magento oferece algumas alternativas para solucionar este problema, mas nenhuma delas é boa o suficiente. Por isso vou apresentar neste post algumas dessas opções, e no final uma solução que eu criei e que pode ser perfeitamente o que você procura.

Solução 1 – Além da imaginação

Digamos que essa foi uma solução criativa que eu tive anos atrás quando o Magento ainda estava na versão 1.2 ou 1.3. Não vou mostrar detalhes de como foi feito porque existem maneiras melhores de fazer, mas basicamente foi feita uma adaptação de um módulo nativo do sistema.

A necessidade do cliente era atualizar rapidamente (com urgência) todos os produtos do estoque (mais de 3.000 itens) em 10%.

Bom, muita gente deve saber que o Magento possui um sistema de taxas e impostos (americano) que não é aproveitado aqui no Brasil. Mas que nesse caso eu aproveitei para aplicar 10% de acréscimo em todos os produtos da loja, de forma totalmente transparente ao cliente.

Tudo que eu precisei fazer – além de criar o imposto – foram alguns ajustes no leiaute para ocultar a mensagem “valor do imposto %“.

E o cliente ficou feliz porque agora ele poderia alterar o valor de todos os produtos automaticamente, bastante apenas alterar o valor do imposto quando quisesse.

Solução 2 – Outros sistemas

Essa é outra idéia que funciona e que já foi testada, mas que não vou entrar em detalhes porque pode haver muitas variações. Trata-se de utilizar outro módulo nativo do sistema.

Dessa vez o módulo de importação/exportação de produtos. No caso, você começa exportando os produtos da sua loja para um arquivo csv, que pode ser editado como uma planilha eletrônica. E se você tem experiência com planilhas, consegue atualizar o preço dos produtos rapidamente.

Terminado as alterações, basta enviar o arquivo de volta ao Magento usando o módulo de importação de produtos. O sistema vai atualizar o preço de todos os produtos que ele encontrar na planilha.

O interessante desse modelo de atualização, é que você não precisa fazer uma exportação de dados pelo Magento. Se você possui outros sistemas de controle de estoque – como um ERP por exemplo – esse ERP pode gerar a planilha com os preços atualizados, e depois basta você importar no Magento.

Solução 3 – Quase bom

Muita gente não deve saber, mas o Magento já possui um sistema interno de atualização de preços em massa. Não só de preços, na verdade atualização de diversos atributos dos produtos selecionados. Veja em:

Catálogo > Gerenciar Produtos

Selecione os produtos que deseja alterar o preço, e depois no campo “Ações” selecione a opção “Atualizar Atributos“, e clique em Enviar.

atualizar atributos

Você vai ver diversos atributos do produto que podem ser modificados simultaneamente para os produtos selecionados na tela anterior. Basta informar o novo valor, marcar o checkboxAlterar“, e clicar em Salvar.

alterar atributo preço

Aparentemente perfeito, certo!? Errado.

Essa solução funciona bem se os produtos são fáceis de selecionar, e se você deseja aplicar exatamente o mesmo preço em vários produtos. O sistema até oferece algumas opções de filtros na listagem de produtos, mas insatisfatória.

Digamos que você tem 3.000 produtos, e deseja acrescentar 5 reais ou 10% em todos os produtos da categoria X, que é formado por 200 produtos, e cada produto possui um preço diferente – e deve continuar diferente.

Se você pensou: “Aplica a solução número 1 das taxas e impostos“. É porque ainda não conheceu minha última criação.

Solução 4 – Ninja attack

Batizei essa solução de “ninja attack” porque vamos atacar direto na fonte, e com técnicas avançadas. Por isso fica o aviso: se você não sabe qual a diferença entre database e banco de dados, não tente fazer isso em casa.

A solução é um SQL que eu criei para atualizar os preços na tabela. Mas eu preciso explicar os comandos para que você possa personalizar o script às suas necessidades.

UPDATE `catalog_product_entity_decimal` AS preco
    SET preco.`value` = AVISO NUM. 1
WHERE EXISTS (
    SELECT *
        FROM `catalog_category_product` AS categoria
    WHERE categoria.`product_id`=preco.`entity_id`
        AND preco.`attribute_id`= AVISO NUM. 2
        AND categoria.`category_id`= AVISO NUM. 3
);

AVISO NUM. 1 – É o valor que você pretende aplicar aos produtos. Pode ser um valor fixo igual para todos os produtos selecionados. Pode ser o valor atual do produto acrescido (ou subtraído) de um valor real. Ou pode ser o valor atual do produto acrescido (ou subtraído) de um valor percentual – você decide.

AVISO NUM. 2 – Esse campo é um caso sério, pois se trata justamente do atributo “price” que queremos alterar. E a cada versão do Magento, o attribute_id deste campo pode mudar. Eu verifiquei o seguinte:

Magento CE 1.4.2.0 - valor = 64
Magento CE 1.5.1.0 - valor = 64
Magento CE 1.6.2.0 - valor = 99
Magento CE 1.7.0.2 - valor = 75
Para saber qual o valor do attribute_id basta olhar a tabela eav_attribute.

AVISO NUM. 3 – Essa condição não é obrigatória. Mas caso você queira selecionar apenas os produtos de determinada categoria, basta informar o ID da categoria aqui.

Dentro da cláusula WHERE é onde você cria os seus filtros, no exemplo acima eu criei um filtro para categorias que não existe no sistema do Magento.

Os exemplos

Informar o mesmo preço de 50 reais para todos os produtos que pertencem a categoria 4 (quatro) no Magento CE 1.4.2.0 ou 1.5.1.0:

UPDATE `catalog_product_entity_decimal` AS preco
    SET preco.`value` = 50
WHERE EXISTS (
    SELECT *
        FROM `catalog_category_product` AS categoria
    WHERE categoria.`product_id`=preco.`entity_id`
        AND preco.`attribute_id` = 64
        AND categoria.`category_id` = 4
);

Acrescentar 20 reais ao preço normal de todos os produtos da categoria 8 (oito) no Magento CE 1.6.2.0:

UPDATE `catalog_product_entity_decimal` AS preco
    SET preco.`value` = preco.`value`+20
WHERE EXISTS (
    SELECT *
        FROM `catalog_category_product` AS categoria
    WHERE categoria.`product_id`=preco.`entity_id`
        AND preco.`attribute_id` = 99
        AND categoria.`category_id` = 8
);

Nesse poderíamos subtrair 20 reais, basta alterar o sinal de + (mais) para – (menos).

E para acrescentar 10% sobre o valor dos produtos da categoria 3 (três) no Magento CE 1.7.0.2:

UPDATE `catalog_product_entity_decimal` AS preco
    SET preco.`value` = preco.`value`+((preco.`value`/100)*10)
WHERE EXISTS (
    SELECT *
        FROM `catalog_category_product` AS categoria
    WHERE categoria.`product_id`=preco.`entity_id`
        AND preco.`attribute_id` = 75
        AND categoria.`category_id` = 3
);

Nesse caso também poderia ser dado um desconto de 10% alterando o sinal de + (mais) pelo sinal de – (menos).

Extras

Obviamente estes scripts devem ser executados por um SGBD, como o Sequel Pro ou phpMyAdmin.

Vou aproveitar para deixar um script de consulta, caso você queira verificar se os preços foram atualizados, ou quais preços devem ser atualizados:

SELECT *
    FROM `catalog_product_entity_decimal` AS preco
    LEFT JOIN `catalog_category_product` AS categoria
        ON categoria.`product_id`=preco.`entity_id`
WHERE
    preco.`attribute_id`=75
    /* AND categoria.`category_id`=2 */;

O LEFT antes da palavra JOIN permite que você visualize os produtos que não pertencem a nenhuma categoria.

Atenção! Eu não me responsabilizo por suas ações. Você foi avisado de que este código é avançado. Faça testes e tenha sempre um backup dos dados que serão alterados.

Em caso de dúvidas, use o fórum da Escola Magento.

Sucesso!

O Autor

Mario SAM

Desenvolvedor Magento com certificação M1 Developer e M1 FrontEnd Developer. Graduado em Web Design e Programação, pós-graduado em Gestão de Projetos e TI. Não sou matemático mas estou aqui para somar.