Alterando a definição de um Produto

Todos os produtos cadastrados no Commerce Server 2007 são baseados em uma definição. Esta definição determina quais propriedades estarão disponíveis para cada tipo de produto (ex.: televisão, CD, computadores, etc):

A product definition describes products in your catalog. It is a collection of properties that specifies the information that is stored for the product.

Uma vez cadastrado um produto associado a uma definição, não é possível alterar este relacionamento. Portanto, no Commerce Server, quando um produto é criado como uma televisão, por exemplo, ele sempre será uma televisão.

Isso parece extremamente óbvio em um cenário onde os cadastros de produtos não passam por um workflow de edição.
Imagine que duas pessoas diferentes são responsáveis pelo cadastro de um produto: um responsável por inserir os dados no Commerce Server e outro responsável por editar as informações e publicar o produto para venda:

product_workflow

Neste cenário, o primeiro passo é o cadastro básico de produtos. Este responsável não tem informações específicas do produto e, por esse motivo, o cadastro de TODOS os produtos é realizado com uma definição básica, DefinicaoBase, por exemplo.

O segundo passo é responsável por analisar o produto, inserir as informações específicas (que provavelmente vem de outra base), editar as existentes e publicar o produto após aprovação. A partir deste ponto, o produto tem uma definição específica, Televisao, por exemplo.

Este cenário não é atendido nativamente pelo Commerce.
Para realizar este processo utilizando os métodos / serviços disponibilzados, o produto tem que ser removido do Commerce e inserido com as mesmas informações, a não ser o tipo de definição.

Se levarmos em conta que catálogos com 80.000 produtos não são dificeis de serem encontrados, este processo teria um custo extremamente alto e lento, o que impactaria diretamente nos benefícios de se ter um ferramente como o Commerce Server 2007.

Solução Alternativa

Uma saída é desenvolver uma solução customizada, através de Procedures na base de catálogo e classes para acesso.

Como diria Jeff Lynch, Sometimes You Have to Write Some Code!

Antes de mostrar a solução, tenho que apresentar os problemas da outra abordagem:

1.    O método para alteração de definição não tem lógica.

Temos que concordar que para alterar uma definição de um produto, não tem lógica removê-lo e adicioná-lo com as mesmas informações, a não ser a definição deste produto.

2.    O processo é realizado via Agent.

Todo o processo de alteração (alias, remoção e criação) do produto é realizado via Agent, o que gera um impacto muito grande de performance quando pensamos em um número expressivo de produtos em um catálogo.

3.    Muito suscetível a erros e inconsistências

Este processo possibilita que a transferência dos dados do produto a ser removido para o produto a ser criado (os mesmos ) gere inconsistências nos dados, já que não é difícil que as informações se percam no meio do caminho.

Portanto, o objetivo aqui é criar um mecanismo logicamente correto, com boa performance e que garanta a consistência dos dados, contando ainda com segurança e controle transacional.

A solução é simples: 
-    Criar uma procedure que faça a alteração de definição de um produto, fazendo todas as consistências necessárias;
-    Criar classes para expor a procedure, além de efetuar controle de concorrência, transacão (além do Banco de Dados) e validações prévias;
-    Criar serviços para expor esta funcionalidade através de Agents, assim como os web services do Commerce.

product_workflow_2

Por questões de apresentação, os códigos não serão expostos aqui neste post. Se você deseja obter os códigos-fonte para referência, entre em contato através do andre@nospam.andrenobre.com.br. (lembre-se de remover a palavra nospam no endereço).

Abraços!
-- André

No Comments