LocalInventory
são as informações de inventário associadas a um determinado local, identificado pelo respetivo place_id
. Por exemplo, pode criar um LocalInventory
para uma loja ou uma região onde um determinado preço está disponível.
LocalInventory
tem os seguintes campos:
LocalInventory.price_info
LocalInventory.attributes
LocalInventory.fulfillment_types
As entradas LocalInventory
existentes são visíveis através de Product.local_inventories
(com exceção de fulfillment_types
, que, para retrocompatibilidade, está disponível através de Product.fulfillment_info
). Este campo é apenas de saída. A definição
Product.local_inventories
para as APIs CRUD Product
ou SetInventory
não tem
qualquer efeito.
Cada par (LocalInventory.place_id,
LocalInventory.fulfillment_types[...])
aponta para o mesmo par (fulfillment_info.place_ids, fulfillment_info.type)
mencionado na documentação de atualização do inventário. fulfillment_types
atualizado por AddLocalInventories
e RemoveLocalInventories
reflete um mapeamento de cada ID do local para uma lista de tipos de processamento que suporta, enquanto fulfillment_info
atualizado por
AddFulfillmentPlaces
e
RemoveFulfillmentPlaces
reflete um mapeamento de cada
tipo de processamento específico para uma lista de IDs de locais que suportam esse tipo.
No entanto, ambos os tipos de APIs estão a modificar as mesmas informações de processamento subjacentes, e o efeito de ambos os tipos de APIs vai refletir-se em Product.fulfillment_info
.
Métodos de atualização do inventário local
As alterações às informações de inventário local de um produto podem ocorrer com muito mais frequência do que as alterações às informações do respetivo catálogo. É disponibilizado um conjunto especializado de métodos para processar grandes volumes de atualizações específicas do inventário local. Estes métodos são assíncronos devido a otimizações posteriores que suportam centenas de atualizações simultâneas por produto, sem sacrificar o desempenho.
AddLocalInventories
AddLocalInventories
pode ser usado para criar inventários locais em novos locais (representados com novos place_id
s) ou atualizar campos existentes em inventários locais existentes. Os campos adicionados ou atualizados na lista de LocalInventory
entradas no corpo do pedido podem ser especificados através de AddLocalInventoriesRequest.add_mask
. Os valores add_mask
válidos são:
price_info
: substituiLocalInventory.price_info
.attributes
: substitui todos osLocalInventory.attributes
. Os atributos existentes que não são mencionados no corpo do pedido são removidos.attributes.PLACEHOLDER_NAME
: substitui apenas o atributo personalizado especificado. Se não for fornecido um nome de atributo existente no pedido, o atributo é eliminado. É possível especificar váriosattributes.PLACEHOLDER_NAME
, desde que cada nome de atributo seja diferente. No entanto,AddLocalInventoriesRequest.add_mask
não pode incluir o valorattributes
e os valoresattributes.PLACEHOLDER_NAME
no mesmo pedido.fulfillment_types
: substitui todos os tipos de processamento suportados. Os tipos de processamento existentes que não são mencionados no corpo do pedido são removidos.
Proto
{ product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" local_inventories: { place_id: "store1" price_info: { currency_code: "USD" price: 100 original_price: 110 cost: 95 } fulfillment_types: "pickup-in-store" fulfillment_types: "ship-to-store" } local_inventories: { place_id: "store2" price_info: { currency_code: "USD" price: 200 original_price: 210 cost: 195 } attributes: { key: "attr1", value: { text: "store2_value" } } fulfillment_types: "custom-type-1" } add_mask: { paths: "price_info" paths: "attributes.attr1" paths: "fulfillment_types" } add_time: { seconds: 100 nanos: 100 } allow_missing: true }
Este exemplo AddLocalInventoriesRequest
adiciona ou atualiza dois inventários locais
com os IDs dos estabelecimentos "store1"
e "store2"
para o produto especificado. Se store1
existir e store2
não existir antes do pedido, o pedido atualiza os campos de store1
e cria store2
com os valores dos campos indicados.
Este AddLocalInventoriesRequest.add_mask
especifica que price_info
, um único atributo personalizado com o nome "attr1"
e fulfillment_types
devem ser atualizados com os valores fornecidos no AddLocalInventoriesRequest.local_inventories
.
attributes
são atributos associados a um local com um nome e valores personalizáveis. Uma vez que LocalInventory
de store1
não fornece o valor de attr1
no pedido, o atributo personalizado attr1
vai ser eliminado de LocalInventory
de store1
existente, se existir. O elemento store2
vai ter o valor do atributo attr1
definido como um valor de texto store2_value
. Os outros atributos personalizados existentes em store1
e store2
permanecem inalterados.
fulfillment_types
representa uma lista de disponibilidade de processamento para um
Product
num único local. É igual e aceita os mesmos valores que
fulfillment_info.type
. Este AddLocalInventoriesRequest
especifica que store1
suporta os tipos de processamento pickup-in-store
e ship-to-store
, enquanto store1
suporta custom-type-1
. Os tipos de processamento existentes antes desta atualização que não sejam mencionados no pedido vão ser eliminados.
Uma vez que AddLocalInventoriesRequest.allow_missing
está definido como verdadeiro, mesmo que o produto ainda não exista, as informações de inventário local atualizadas são armazenadas para quando o produto for criado. A atualização tem a data/hora de AddLocalInventoriesRequest.add_time
para evitar que as atualizações desatualizadas substituam os campos especificados destes IDs de locais. Para saber mais sobre como evitar atualizações desatualizadas e armazenar informações de inventário local antes de o produto ser criado, consulte os artigos Proteções de data/hora para atualizações de inventário local e Pré-carregamento de informações de inventário.
Proto
{ product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" local_inventories: { place_id: "store3" attributes: { key: "attr1", value: { text: "attr1_value" } } attributes: { key: "attr2", value: { numbers: 123 } } } add_mask: { paths: "attributes" } add_time: { seconds: 100 nanos: 100 } }
Este exemplo AddLocalInventoriesRequest
adiciona ou atualiza um único inventário local com o ID do local "store3"
para o produto especificado. Uma vez que o elemento add_mask
contém "attributes"
, todos os atributos personalizados existentes de store3
são eliminados e substituídos por attr1
e attr2
, conforme especificado no pedido.
Tenha em atenção que, uma vez que allow_missing
não está definido, requer que o produto especificado exista. Caso contrário, é gerado um erro NOT_FOUND
.
RemoveLocalInventories
O elemento RemoveLocalInventories
pode ser usado para remover
inventários locais existentes em locais com os IDs de Places indicados.
Proto
{ product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" place_ids: "store1" place_ids: "store2" remove_time: { seconds: 100 nanos: 100 } allow_missing: true }
Este exemplo de RemoveLocalInventoriesRequest
remove os inventários locais de locais com os IDs de locais "store1"
e "store2"
para o produto especificado. A atualização tem a data/hora de RemoveLocalInventoriesRequest.remove_time
para evitar que
atualizações desatualizadas substituam a eliminação destes IDs de locais. Para IDs de estabelecimentos especificados sem inventários locais existentes, o pedido também regista a respetiva hora de atualização como remove_time
. Para saber mais sobre as indicações de tempo de atualização, consulte o artigo
Proteções de indicações de tempo para atualizações de inventário local
Proteções de data/hora para atualizações de inventário local
Para se proteger contra atualizações desordenadas, cada campo de inventário local está associado a uma hora de atualização mais recente.
A hora da última atualização é registada para cada par (place_id, price_info)
, (place_id, attributes[...])
e (place_id, fulfillment_types[...])
.
Os métodos AddLocalInventories
e RemoveLocalInventories
permitem que o autor da chamada especifique uma hora de atualização para quando o pedido é emitido. Esta hora de atualização é
comparada com a hora de atualização mais recente registada para os campos de inventário
relevantes, e a atualização é confirmada se e apenas se a hora de atualização for estritamente
posterior à hora de atualização mais recente.
Por exemplo, suponha que o ID do estabelecimento "store1"
tem price_info
com a hora de atualização registada mais recente definida como a hora T
. Se RemoveLocalInventoriesRequest.place_ids
contiver "store1"
, a solicitação remove price_info
de "store1"
apenas se RemoveLocalInventoriesRequest.remove_time
for posterior à hora T
.
O mesmo se aplica aos RemoveLocalInventoriesRequest
s.
Com a proteção de data/hora, é possível que um
RemoveLocalInventoriesRequest
remova apenas determinados campos de um
LocalInventory
em vez de todos. Suponhamos que um inventário local com o ID do local "store1"
tem price_info
com a hora da última atualização registada definida para a hora T1
e tem o único atributo personalizado existente com o nome "attr1"
com a hora da última atualização registada em T2
. Se um RemoveLocalInventoriesRequest.place_ids
contiver "store1"
e tiver remove_time
definido como T3
(em que T1 < T3 < T2
), o price_info
de store_1
é removido, enquanto o respetivo atributo attr1
permanece inalterado.
Pré-carregar informações de inventário
Cada um dos métodos de atualização do inventário local permite que o autor da chamada defina allow_missing
no pedido. Quando allow_missing
está definido como verdadeiro, uma atualização de inventário local para um Product
inexistente é processada como se o Product
existisse de acordo com as especificações do método. As informações do inventário local são retidas durante um máximo de dois dias se o Product
correspondente não for criado através do CreateProduct
dentro deste período.