Se você criar um produto digital para pré venda (é necessário um módulo para isso) e por acaso ainda não tenha o link ou arquivo que será usado no produto, mas você precisa criar o product e liberar para seus clientes comprarem (pré venda). Provavelmente você usará um link como "http://DEFINIR// ou somente escrever "DEFINIR" ou fazer o upload de um arquivo que não é o correto já que os clientes não poderão baixar. Isso também se aplica a backorders ou pedidos normais que por algum motivo você quer que os clientes possam comprar, mas o link/arquivo não estará disponível até certa data.
Também se aplica caso você queira atualizar um link ou arquivo que possa trocar e você precisa que todos os seus clientes tenham o novo link/arquivo atualizados. Infelizmente o Magento não atualiza os pedidos com os novos links/arquivos e isso é BEM chato quando você tem vários pedidos com os exemplos dados. Para resolver o problema eu resolvi criar um módulo que faz justamente isso. Quando você atualiza o link/arquivo do produto, ele atualiza TODOS os pedidos com aquele produto.
Esta é a tabela no banco de dados responsável pelos items comprados com links/arquivos: downloadable_link_purchased_item
Eu fiz um pedido teste em uma loja no meu ambiente local e eu verifiquei o link_url desta tabela e podemos ver o link do pedido:
SELECT link_url FROM downloadable_link_purchased_item;
+----------------------+
| link_url |
+----------------------+
| http://tbd/somefile.zip |
+----------------------+
1 row in set (0.00 sec)
E também podemos confirmar que o link é do produto:
SELECT product_id, sku, link_url
-> FROM downloadable_link
-> INNER JOIN catalog_product_entity
-> WHERE entity_id = 3;
+------------+-----------------+----------------------+
| product_id | sku | link_url |
+------------+-----------------+----------------------+
| 3 | digital_product | http://tbd/somefile.zip |
+------------+-----------------+----------------------+
Também podemos confirmar que há um pedido com esse produto:
SELECT c.product_id, b.sku, c.link_url, b.order_id
-> FROM downloadable_link c
-> INNER JOIN catalog_product_entity a
-> INNER JOIN sales_flat_order_item b
-> WHERE entity_id = 3;
+------------+-----------------+----------------------+----------+
| product_id | sku | link_url | order_id |
+------------+-----------------+----------------------+----------+
| 3 | digital_product | http://tbd/somefile.zip | 1 |
+------------+-----------------+----------------------+----------+
Agora eu irei atualizar o link do produto de somefile.zip para myrealfile.zip no admin do Magento e iremos ver que nada acontece para o pedido na tabela downloadable_link_purchased_item.
Primeiro vamos verificar o downloadable_link para ter certeza que o link foi atualizado:
SELECT link_url FROM downloadable_link WHERE product_id = 3;
+---------------------------+
| link_url |
+---------------------------+
| http://tbd/myrealfile.zip |
+---------------------------+
Ok, então o produto tem o novo link, so the product has the new link. Agora vamos ver os pedidos:
SELECT item_id, link_url FROM downloadable_link_purchased_item;
+---------+-------------------------+
| item_id | link_url |
+---------+-------------------------+
| 1 | http://tbd/somefile.zip |
+---------+-------------------------+
Bom, parece que ainda está com o link antigo, mas novos pedidos vão utilizar myrealfile.zip. Mas seria ótimo se ao atualizar o link ou arquivo do produto também atualizasse os pedidos. E é justamente por isso que criei o módulo MageBR_UpdateLinksPurchased e é totalmente gratuito para utilizar. Você pode fazer o download da versão mais nova aqui: here: https://github.com/CajuCLC/MageBR_UpdateLinksPurchased/releases/latest
Ou se deseja contribuir para deixar o módulo ainda melhor: https://github.com/CajuCLC/MageBR_UpdateLinksPurchased
Após instalar o módulo e atualizar os caches, vamos modificar um produto digital novamente, agora iremos mudar o link de myrealfile.zip para updatedlink.zip.
Vamos conferir se o produto tem o novo link:
SELECT link_url FROM downloadable_link WHERE product_id = 3;
+----------------------------+
| link_url |
+----------------------------+
| http://tbd/updatedlink.zip |
+----------------------------+
E o pedido também dever ter o novo link:
SELECT item_id, link_url FROM downloadable_link_purchased_item;
+---------+----------------------------+
| item_id | link_url |
+---------+----------------------------+
| 1 | http://tbd/updatedlink.zip |
+---------+----------------------------+
Pronto, todos os pedidos irão ter o novo link ou arquivo. MAS ainda não terminamos. Se você receber um erro ao tentar salvar o produto dizendo que order id não pode ser NULL, significa que você tem pedidos que foram deletados e não cancelados. Quando você deleta um pedido acaba deixando várias outras coisas sem estar relacionada a um pedido (NULL). Você pode checar rodando as queries abaixo:
SELECT * FROM downloadable_link_purchased WHERE order_id IS NULL;
SELECT * FROM downloadable_link_purchased_item WHERE order_item_id IS NULL;
Se qualquer query retornou algo, então você precisa remover elas. Na maioria das vezes não há problema, mas por favor criei um backup e tenha certeza que você pode deletar. Não nos responsabilizamos por qualquer problema.
DELETE FROM downloadable_link_purchased_item WHERE order_item_id IS NULL;
DELETE FROM downloadable_link_purchased WHERE order_id IS NULL;
E chegamos ao final, tudo estará funcionando como deve agora.
Caso tenha gostado deste tutorial e módulo, por favor compartilhe.