LocalInventory
es la información del inventario asociada con un lugar determinado, identificada por su place_id
. Por ejemplo, se podría crear un LocalInventory
para una tienda o una región en la que un precio determinado está disponible.
LocalInventory
tiene los siguientes campos:
LocalInventory.price_info
LocalInventory.attributes
LocalInventory.fulfillment_types
Las entradas LocalInventory
existentes son visibles a través de Product.local_inventories
(a excepción de fulfillment_types
, que, para la retrocompatibilidad, está disponible a través de Product.fulfillment_info
). Este campo es solo de salida. La configuración de Product.local_inventories
para las APIs de CRUD de Product
o SetInventory
no tiene efecto.
Cada par (LocalInventory.place_id,
LocalInventory.fulfillment_types[...])
apunta al mismo par (fulfillment_info.place_ids, fulfillment_info.type)
que se menciona en la documentación de actualización de inventario. La fulfillment_types
actualizada por AddLocalInventories
y RemoveLocalInventories
que se describe a continuación refleja una asignación de cada ID de lugar a una lista de tipos de entrega que admite, mientras que fulfillment_info
actualizado por AddFulfillmentPlaces
y RemoveFulfillmentPlaces
refleja una asignación de cada tipo de entrega específico a una lista de IDs de lugar que admite ese tipo.
Sin embargo, ambos tipos de APIs modifican la misma información de entrega subyacente, y el efecto de ambos tipos de APIs se reflejará en Product.fulfillment_info
.
Métodos de actualización del inventario local
Los cambios en la información del inventario local de un producto pueden ocurrir con mucha más frecuencia que los cambios en la información del catálogo. Se proporciona un conjunto especializado de métodos para manejar grandes volúmenes de actualizaciones específicas del inventario local. Estos métodos son asíncronos debido a las optimizaciones posteriores que admiten cientos de actualizaciones simultáneas por producto, sin sacrificar el rendimiento.
AddLocalInventories
AddLocalInventories
se puede usar para crear inventarios locales en lugares nuevos (representados con place_id
nuevos) o actualizar los campos existentes en inventarios locales existentes. Los campos que se agregan o actualizan en la lista de entradas LocalInventory
en el cuerpo de la solicitud se pueden especificar mediante AddLocalInventoriesRequest.add_mask
. Los valores de add_mask
válidos son los siguientes:
price_info
: Reemplaza aLocalInventory.price_info
.attributes
: Reemplaza por completo aLocalInventory.attributes
. Se quitan los atributos existentes que no se mencionan en el cuerpo de la solicitud.attributes.PLACEHOLDER_NAME
: Reemplaza solo el atributo personalizado especificado. Si no se proporciona un nombre de atributo existente en la solicitud, el atributo se borra. Se pueden especificar variosattributes.PLACEHOLDER_NAME
, siempre que cada nombre de atributo sea diferente. Sin embargo,AddLocalInventoriesRequest.add_mask
no puede incluir el valorattributes
y los valoresattributes.PLACEHOLDER_NAME
en la misma solicitud.fulfillment_types
: Reemplaza todos los tipos de entrega compatibles. Se quitan los tipos de entrega existentes que no se mencionan en el cuerpo de la solicitud.
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 AddLocalInventoriesRequest
de muestra agrega o actualiza dos inventarios locales con IDs de lugar "store1"
y "store2"
para el producto especificado. Si store1
existe, y store2
no existe antes que la solicitud, esta actualizará los campos de store1
y creará store2
con los valores de campo especificados.
Esta AddLocalInventoriesRequest.add_mask
especifica que price_info
, un solo atributo personalizado con el nombre "attr1"
, y fulfillment_types
deben actualizarse con los valores proporcionados en AddLocalInventoriesRequest.local_inventories
.
attributes
son atributos asociados con un lugar que pueden personalizarse con un nombre y valores. Dado que LocalInventory
de store1
no proporciona el valor de attr1
en la solicitud, el atributo personalizado attr1
se borrará del LocalInventory
existente de store1
(si existe). store2
tendrá el valor de su atributo attr1
establecido en un valor de texto store2_value
. Otros atributos personalizados existentes en store1
y store2
no se modifican.
fulfillment_types
representa una lista de la disponibilidad de entregas para un Product
en un solo lugar. Es igual y acepta los mismos valores que fulfillment_info.type
. Esta AddLocalInventoriesRequest
especifica que store1
admite los tipos de entrega pickup-in-store
y ship-to-store
, mientras que store1
admite custom-type-1
. Se borrarán los tipos de entrega existentes antes de esta actualización
que no se mencionen en la solicitud.
Dado que AddLocalInventoriesRequest.allow_missing
se establece como verdadero, incluso si el producto aún no existe, la información actualizada del inventario local se almacenará cuando se cree el producto. La actualización tiene una marca de tiempo AddLocalInventoriesRequest.add_time
para evitar que las actualizaciones inactivas anulen los campos especificados de estos IDs de lugar. Si quieres obtener más información para evitar actualizaciones inactivas y almacenar la información del inventario local antes de crear el producto, consulta Protecciones de marcas de tiempo para actualizaciones del inventario local y Precarga la información del inventario.
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 AddLocalInventoriesRequest
de muestra agrega o actualiza un solo inventario local con el ID de lugar "store3"
para el producto especificado. Dado que su
add_mask
contiene "attributes"
, todos los atributos personalizados existentes de store3
se borran y se reemplazan por attr1
y attr2
, como se especifica en la solicitud.
Ten en cuenta que, como allow_missing
no está configurado, se requiere la existencia del producto especificado. De lo contrario, se genera un error NOT_FOUND
.
RemoveLocalInventories
RemoveLocalInventories
se puede usar para quitar inventarios locales existentes en lugares con IDs de lugar determinados.
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 RemoveLocalInventoriesRequest
de muestra quita los inventarios locales de lugares con IDs de lugar "store1"
y "store2"
para el producto especificado. La actualización tiene una marca de tiempo RemoveLocalInventoriesRequest.remove_time
para evitar que las actualizaciones inactivas anulen la eliminación de estos IDs de lugar. Para los IDs de lugar especificados sin inventarios locales existentes, la solicitud también registra la hora de actualización a remove_time
. Si quieres obtener más información sobre las marcas de tiempo de actualización, consulta Protecciones de marcas de tiempo para las actualizaciones del inventario local.
Protecciones de marca de tiempo para las actualizaciones del inventario local
Para brindar protección contra las actualizaciones desordenadas, cada campo del inventario local está asociado con una hora de actualización más reciente.
La hora de actualización más reciente se registra para cada par (place_id, price_info)
, (place_id, attributes[...])
y (place_id, fulfillment_types[...])
.
Los métodos AddLocalInventories
y RemoveLocalInventories
permiten que el llamador especifique una hora de actualización para el momento en que se emite la solicitud. Esta hora de actualización se compara con la hora de actualización más reciente registrada para los campos de inventario relevantes, y la actualización se confirma solo si la hora de actualización es estrictamente posterior a la última hora de actualización.
Por ejemplo, supongamos que el ID de lugar "store1"
tiene price_info
con la última hora de actualización registrada establecida en la hora T
. Si RemoveLocalInventoriesRequest.place_ids
contiene "store1"
, la solicitud quitará price_info
de "store1"
solo si RemoveLocalInventoriesRequest.remove_time
es posterior a la hora T
.
Lo mismo sucede con los elementos RemoveLocalInventoriesRequest
.
En la protección de marca de tiempo, es posible que una RemoveLocalInventoriesRequest
quite solo ciertos campos de una LocalInventory
en lugar de todos ellos. Supongamos que un inventario local con el ID de lugar "store1"
tiene price_info
con la hora de la última actualización registrada en la hora T1
y tiene su único atributo personalizado existente con el nombre "attr1"
y la hora de la última actualización registrada a las T2
. Si un RemoveLocalInventoriesRequest.place_ids
contiene "store1"
y tiene remove_time
establecido en T3
(donde T1 < T3 < T2
), se quitará el price_info
de store_1
, mientras que su atributo attr1
permanecerá intacto.
Carga previa de la información de inventario
Cada uno de los métodos de actualización del inventario local permite al llamador configurar allow_missing
en la solicitud. Cuando estableces allow_missing
como verdadera, una actualización de inventario local a un Product
inexistente se procesa como si el Product
existiera según las especificaciones del método. La información del inventario local se conservará durante un máximo de dos días si no se crea el Product
correspondiente mediante CreateProduct
dentro de este período.