Embalagem Loja

Integração Básica do RUB — entidade obrigatória, de contexto Loja. Na API pública é representada pelo objeto prices[] (schema StorePrice) dentro de ProductStore (JSON 1:1) e pelo schema ProductStorePrice na importação massiva (CSV) em /product-store/v1/price.

O que é uma Embalagem Loja

A Embalagem Loja é o preço de venda de cada Embalagem de um produto em cada loja: a unidade de refrigerante a R$ 4,99 na loja 30001; o pack com 6 a R$ 27,90 na mesma loja; a unidade a R$ 5,29 na loja 30002. Ela é o encontro de três coisas: um Produto (Loja), uma Embalagem e um preço.

O preço é uma das informações mais sensíveis da operação de loja, e é em torno dele que o RUB executa a auditoria de etiquetas:

  • O RUB conhece o preço vigente de cada Embalagem em cada loja (via Embalagem Loja).
  • O colaborador percorre a gôndola lendo etiquetas; o dispositivo compara o preço exposto com o preço vigente.
  • Se houver divergência (etiqueta com preço antigo, etiqueta ausente, preço de promoção encerrada), o RUB gera uma tarefa de troca de etiqueta.
  • Quando o ERP envia um novo preço, o RUB identifica automaticamente que a etiqueta na gôndola está desatualizada e gera a tarefa antes que o cliente perceba a diferença no caixa.

A Embalagem Loja também alimenta a consulta de preço nos dispositivos (leitura do código de barras mostra o preço da Embalagem correspondente) e a impressão de etiquetas.

Preço unitário × preço da Embalagem

Cada Embalagem Loja carrega dois valores:

  • PRECO_EMBALAGEM — o valor total pago pela Embalagem (o pack com 6 custa R$ 27,90).
  • PRECO_UNITARIO — o valor por unidade dentro dessa Embalagem (R$ 27,90 / 6 = R$ 4,65).

Isso permite exibir na etiqueta "Pack c/ 6 — R$ 27,90 (R$ 4,65/un)" e comparar o preço unitário entre Embalagens — por exemplo, para destacar que o pack é mais barato por unidade do que a lata avulsa.

graph LR
    PROD["Produto @ Loja 30001<br/>8801 CERVEJA LATA"]
    PROD --> EL1["Embalagem Loja QTD = 1<br/>unit 4,99 / emb 4,99"]
    PROD --> EL12["Embalagem Loja QTD = 12<br/>unit 4,65 / emb 55,80"]
    PROD --> EL24["Embalagem Loja QTD = 24<br/>unit 4,49 / emb 107,76"]

Modelo de dados

CampoTipoObrigatórioDescrição
ID_LOJAINTEIROSimCódigo de identificação da Loja.
PRODUTOTEXTO(32)SimCódigo do Produto ao qual a Embalagem pertence.
QTDDECIMALSimQuantidade total da Embalagem (aceita fração) — deve corresponder a uma Embalagem existente.
PRECO_UNITARIONUMERICO(14,6)SimPreço de uma unidade nesta Embalagem.
PRECO_EMBALAGEMNUMERICO(14,6)SimPreço total da Embalagem.
ATIVOINTEIRONãoIndica se a Embalagem está ativa na Loja (0-Não / 1-Sim).

Chave e identidade

A chave é composta: ID_LOJA + PRODUTO + QTD. Reenviar a chave atualiza os preços — é exatamente assim que uma alteração de preço é integrada.

Relacionamentos

  • Uma Embalagem Loja pertence a um Produto (Loja) e a uma Embalagem.
  • Um Produto (Loja) possui uma ou mais Embalagens Loja (ao menos a unitária).
  • Depende do Produto (Loja) e da Embalagem já existirem.

Equivalência na API

ConceitoJSON 1:1 (ProductStore.prices[])CSV massivo (ProductStorePrice)TipoObrigatório
ID_LOJA(implícito — store do produto-loja)storeintegerSim
PRODUTO(implícito — product do produto-loja)productstringSim
QTDquantityquantitynumberSim
PRECO_UNITARIOunit_priceunit_pricenumberNão
PRECO_EMBALAGEMpackage_pricepackage_pricenumberNão
ATIVOactiveactivebooleanNão
—store_codes[]/product-store/v1/barcode-storeobject[]Não
—propertiescolunas extrasobjectNão

Exemplos de uso

Cenário 1 — Preços de um produto na loja (JSON 1:1)

Ao ativar a cerveja 8801 na loja 30001, o ERP envia os preços das três Embalagens junto com o vínculo:

POST /empresa/api/rest/product-store/v1
{
  "store": 30001,
  "product": "8801",
  "active": true,
  "cost": 3.10,
  "prices": [
    { "quantity": 1,  "unit_price": 4.99, "package_price": 4.99,   "active": true },
    { "quantity": 12, "unit_price": 4.65, "package_price": 55.80,  "active": true },
    { "quantity": 24, "unit_price": 4.49, "package_price": 107.76, "active": true }
  ]
}

Cenário 2 — Alteração de preço em regime (JSON 1:1)

A lata subiu para R$ 5,29 na loja 30001. O ERP reenvia apenas a Embalagem afetada, pela rota com identificadores no path:

POST /empresa/api/rest/product-store/v1/30001/8801
{
  "prices": [
    { "quantity": 1, "unit_price": 5.29, "package_price": 5.29, "active": true }
  ]
}

Imediatamente o RUB passa a considerar a etiqueta "R$ 4,99" da gôndola como desatualizada e gera a tarefa de troca para a equipe da loja.

Cenário 3 — Carga massiva de preços (CSV)

Na carga inicial, ou na virada de preços semanal, todos os preços da rede são enviados em um arquivo plano, uma linha por loja × produto × quantidade:

POST /empresa/api/rest/product-store/v1/price
Content-Type: text/csv

"store";"product";"quantity";"unit_price";"package_price";"active"
"30001";"8801";"1";"5.29";"5.29";"true"
"30001";"8801";"12";"4.65";"55.80";"true"
"30001";"8801";"24";"4.49";"107.76";"true"
"30002";"8801";"1";"5.49";"5.49";"true"
"30001";"4482";"1";"24.99";"24.99";"true"
"30001";"4482";"6";"23.99";"143.94";"true"
"30001";"7301";"1000";"0.0499";"49.90";"true"

A resposta BulkResponse (id, total, accepted, errors[]) aponta linhas rejeitadas — por exemplo, quantity sem Embalagem correspondente no produto.

Cenário 4 — Produto de peso variável

Para a mussarela (produto 7301, unidade = grama), o preço por quilo é expresso na Embalagem de 1000 g: unit_price é o preço da grama e package_price é o preço do quilo:

POST /empresa/api/rest/product-store/v1/30001/7301
{
  "prices": [ { "quantity": 1000, "unit_price": 0.0499, "package_price": 49.90, "active": true } ]
}

Cenário 5 — Encerrando a venda de uma Embalagem

A loja 30002 deixa de vender a caixa com 24. A Embalagem Loja é inativada, sem remover a Embalagem do produto (que continua válida para recebimento):

POST /empresa/api/rest/product-store/v1/30002/8801
{
  "prices": [ { "quantity": 24, "active": false } ]
}

Boas práticas

  • Envie o preço assim que ele mudar no ERP — a auditoria de etiquetas só é útil se o RUB souber o preço vigente antes do cliente.
  • Garanta que quantity corresponda a uma Embalagem já cadastrada para o produto; caso contrário a linha é rejeitada.
  • Informe unit_price e package_price de forma consistente (package_price = unit_price × quantity); o RUB usa ambos na etiqueta.
  • Use active: false para encerrar a venda de uma Embalagem em uma loja, preservando o histórico.
  • Prefira CSV para viradas de preço em massa (milhares de linhas) e JSON 1:1 para ajustes pontuais durante o dia.

Referência na API

O contrato técnico completo dos endpoints de Preços por Loja (propriedades prices[] no schema ProductStore no envio JSON 1:1, endpoint dedicado /product-store/v1/price para carga massiva CSV e exemplos de requisição/resposta) encontra-se documentado no Swagger oficial: