Representa a una Asociación de un Good con un Branch. Esto permite a un Branch poder listar sus propios productos. Cuando un Branch es asignado a un Good, todas las Properties asociadas son asignadas en cascada, tomando los valores por defecto definidos en la entidad GoodProperty. A diferencia del Good, un BranchGood posee datos de stock y precio de venta personalizado según el cliente que solicita la lista (véase BranchPriceList).
El min_price_e2
representa el precio del producto definido (en centavos) en la moneda local del comercio y no el
precio mínimo (El nombre quedó así por retro-compatibilidad). Cuando un administrador modifica el precio de venta
de un producto, está modificando este atributo.
El atributo de sólo lectura custom_data
es un objeto que representa los distintos precios del producto en distintas
condiciones, incluyendo el monto formateado en string
:
display_price
: Precio a mostrar en el producto (visual). Monto mínimo de venta.list_price
: Precio a mostrar original. Se debe mostrar tachado en caso que sea diferente a display_price
. Suele
representar un descuento.price_e2
: Precio efectivo para sumar en el carrito.unit_
: Representa el monto por unidad. En caso de productos por peso, por ejemplo, el precio por KG.extras_
: Representa el monto mínimo según los Extras obligatorios del producto.currency
: Moneda local del comercio (Aplicado a los distintos precios).conversion
: Representa un objeto con los montos convertidos a la moneda elegida. Se puede elegir la moneda
especificando el Header HTTP: X-Currency: EUR
, por ejemplo (con el ISO de la moneda deseada). La moneda debe
ser soportada por la Company
. Si no se especifica, el Sistema automáticamente elige la moneda local del Company
.real_prices
: Define los precios reales según la moneda local del Branch para uso del Administrador.El atributo quantity_real
representa el inventario (stock) del producto disponible, o null
para ilimitado. Si el
stock no es suficiente para la venta, el atributo has_stock_for_selling
será false
. Además, el atributo
available_for_selling
indica si el producto está disponible para la venta, y será false
ya sea porque no tiene
suficiente stock, o porque ha sido deshabilitado por un administrador. Para mostrar un producto agotado, se puede
evaluar el atributo available_for_selling == false
El atributo notes_enabled
indica si se deben solicitar instrucciones especiales (opcionales) al momento de ordenar
el producto.
Si el atributo weight_per_unit
no es null
, indica el precio aproximado por unidad. Por ejemplo, si el producto
es una Manzana, el weight_per_unit=138
indica que cada manzana pesa aproximadamente 138 Gr (en caso que unit_config
tenga unit_name="Gr"
).
Los tags
poseen las etiquetas agregadas al producto (para mejorar búsquedas y otras cosas). Si el producto trae un
tag llamado $Hot
, se trata de un tag gestionado por el sistema, y representa a los productos más vendidos 🔥.
El objeto unit_config
representa una configuración de unidad para vender el producto, por ejemplo, por peso:
enabled
: Indica si la configuración de unidad está habilitada.display_mode
: Indica cómo mostrar la configuración en pantalla.fraction
: Unidades de división para cada unidad de stock (quantity). Por ejemplo, para representar 1 unidad como
1000Gr, se utiliza fraction=1000
. Entonces cada venta de 1000 reduce el stock en 1.min_quantity
: Cantidad mínima a vender, en fraction
. Ejemplo 500
para 500Gr.max_quantity
: Cantidad máxima a vender, en fraction
. Ejemplo 2000
para 2Kg.step_quantity
: Incremento (pasos) para incrementar el valor según fraction
. Ej 100
para incrementar 100Gr.unit_name
: La unidad representada por el fraction
, en nuestro ejemplo sería Gr
para gramos. NOTA: La unidad
KG
se coloca en el producto, en el atributo unit
, entonces quedaría Good.unit = 'Kg' y
unit_name = 'Gr'con
fraction = 1000`weight_per_unit
: Peso estimado por unidad. Por ejemplo, un Pollo se podría vender entero y se coloca un peso
aproximado en 3000
Gr, o frutas como Manzana se le puede colocar 205
Gr, por ejemplo. Se puede utilizar para
hacer interfaces que manejen ventas por unidad en un producto por peso. Como este valor tiene como único propósito
dar información adicional a la interfaz, se puede utlizar incluso si enabled = false
{
"id": 92,
"min_price_e2": 1200,
"rating_e2": 0,
"rating_sum": 0,
"rating_count": 0,
"available": false,
"provider_fee_e2": 0,
"provider_fee_prc": 0,
"created_at": "2020-04-20 20:37:52",
"updated_at": "2024-10-27 10:11:47",
"branch_id": 22,
"good_id": 105,
"branch_group_id": 42,
"eta": null,
"promo_id": null,
"promo_info": null,
"last_sync_id": 639,
"quantity_real": 0,
"extras_price_e2": 0,
"list_order": 65535,
"featured_in_order": null,
"good_type_id": null,
"sku": null,
"type": 0,
"name": "Prueba2",
"unit": "und",
"max_quantity": null,
"limit_type": null,
"details": "Aaaa",
"short_details": "n/a",
"picture_urls": [
"http://127.0.0.1:8000/storage/static/default/product_category_logo.png"
],
"vertical_picture_urls": [
"http://127.0.0.1:8000/storage/static/default/product_category_logo_portrait.jpg"
],
"notes_enabled": true,
"custom_data": {
"list_price_e2": 1200,
"display_price_e2": 1200,
"price_e2": 1200,
"extras_list_price_e2": 0,
"extras_display_price_e2": 0,
"extras_price_e2": 0,
"client_id": null,
"branch_price_list_id": 426,
"currency": {
"id": 476,
"enabled": true,
"iso": "USD",
"symbol": "$",
"conversion_factor": 1,
"related_iso": "USD",
"decimals_count": 2,
"format": "0.00$",
"decimal_point": ".",
"use_thousands_separator": true,
"thousands_separator": ",",
"is_local": true,
"is_international": true,
"created_at": "2021-07-15 19:22:15",
"updated_at": "2021-09-24 12:56:35",
"company_id": 116,
"is_custom": false,
"branch_id": 22,
"auto_sync": false,
"auto_sync_provider": "legacy",
"use_conversion": false,
"available": true,
"related_iso_expected": "USD",
"related_iso_error": false
},
"conversion": {
"list_price_e2": 1200,
"display_price_e2": 1200,
"price_e2": 1200,
"extras_list_price_e2": 0,
"extras_display_price_e2": 0,
"extras_price_e2": 0,
"currency": {
"id": 476,
"enabled": true,
"iso": "USD",
"symbol": "$",
"conversion_factor": 1,
"related_iso": "USD",
"decimals_count": 2,
"format": "0.00$",
"decimal_point": ".",
"use_thousands_separator": true,
"thousands_separator": ",",
"is_local": true,
"is_international": true,
"created_at": "2021-07-15 19:22:15",
"updated_at": "2021-09-24 12:56:35",
"company_id": 116,
"is_custom": false,
"branch_id": 22,
"auto_sync": false,
"auto_sync_provider": "legacy",
"use_conversion": false,
"available": true,
"related_iso_expected": "USD",
"related_iso_error": false
},
"list_price": "12.00$",
"display_price": "12.00$"
},
"real_prices": {
"list_price_e2": 1200,
"display_price_e2": 1200,
"price_e2": 1200,
"extras_list_price_e2": 0,
"extras_display_price_e2": 0,
"extras_price_e2": 0
},
"list_price": "12.00$",
"display_price": "12.00$",
"unit_list_price": "12.00$",
"unit_display_price": "12.00$"
},
"quantity_real_available": 0,
"quantity": 0,
"unit_config": null,
"weight_per_unit": null,
"has_stock_for_selling": false,
"available_for_selling": false,
"calculated_eta": null,
"eta_config": null,
"tags": [],
"is_service": false,
"is_combo": false,
"barcodes": [],
"label": null,
"discount_info": null
}
Atributo | Tipo | Descripción |
---|---|---|
id |
int |
- |
min_price_e2 |
int |
- |
rating_e2 |
int |
- |
rating_sum |
int |
- |
rating_count |
int |
- |
available |
bool |
- |
provider_fee_e2 |
int |
- |
provider_fee_prc |
float |
- |
created_at |
datetime\|null |
- |
updated_at |
datetime\|null |
- |
branch_id |
int |
- |
good_id |
int |
- |
branch_group_id |
int\|null |
- |
last_sync_id |
int\|null |
- |
quantity_real |
float\|null |
- |
extras_price_e2 |
int\|null |
- |
list_order |
int |
- |
available_for_selling |
bool |
- |
barcodes |
array\|null |
- |
custom_data |
array |
- |
details |
mixed |
- |
name |
mixed |
- |
notes_enabled |
mixed |
- |
picture_urls |
mixed |
- |
short_details |
mixed |
- |
tags |
array\|null |
- |
type |
mixed |
- |
unit |
mixed |
- |
vertical_picture_urls |
mixed |
- |
has_stock_for_selling |
bool |
- |
is_combo |
bool\|null |
- |
is_service |
bool |
- |
quantity |
int\|null |
- |
quantity_real_available |
float\|null |
- |
Asocia un Good con un Branch. Cuando un BranchGood es insertado, el API automáticamente asocia las GoodProperties del producto asociado y crea los registros de BranchProperty para manejar el stock y precios.
{info} Si no se especifica algún atributo, se usa el valor del Good. En caso de
min_price_e2
se utiliza el atributoprice_e2
del Good.
Método | URI | Cabeceras |
---|---|---|
PUT | /companies/{companyId}/branches/{branchId}/goods/{goodId} |
Authorization |
{
"eta": "string|max:32",
"min_price_e2": "integer|min:0",
"provider_fee_e2": "integer",
"provider_fee_prc": "numeric|between:0.0000,1.0000",
"quantity": "integer",
"quantity_real": "numeric",
"list_order": "integer",
"featured_in_order": "nullable|integer"
}
{info} Soporta: Paginación Filters Carga dinámica
Método | URI | Cabeceras |
---|---|---|
GET | /companies/{companyId}/branches/{branchId}/branch-goods |
N/A |
a la Branch actual, esa Category no se mostrará.
{info} Soporta: Paginación Filters
Método | URI | Cabeceras |
---|---|---|
GET | /companies/{companyId}/branches/{branchId}/branch-goods/categories |
N/A |
{info} Soporta: Paginación Filters Carga dinámica
Método | URI | Cabeceras |
---|---|---|
GET | /companies/{companyId}/branches/{branchId}/categories/{categoryId}/branch-goods |
N/A |
{info} Soporta: Carga dinámica
Método | URI | Cabeceras |
---|---|---|
GET | /companies/{companyId}/branch-goods/{branchGoodId} |
N/A |
{info} Soporta: Carga dinámica
Método | URI | Cabeceras |
---|---|---|
GET | /companies/{companyId}/branches/{branchId}/goods/{goodId} |
N/A |
Método | URI | Cabeceras |
---|---|---|
PATCH | /companies/{companyId}/branch-goods/{branchGoodId} |
Authorization |
{
"eta": "string|max:32",
"min_price_e2": "integer|min:0",
"provider_fee_e2": "integer",
"provider_fee_prc": "numeric|between:0.0000,1.0000",
"quantity": "integer",
"quantity_real": "numeric",
"list_order": "integer",
"featured_in_order": "nullable|integer"
}
Método | URI | Cabeceras |
---|---|---|
PATCH | /companies/{companyId}/branches/{branchId}/goods/{goodId} |
Authorization |
{
"eta": "string|max:32",
"min_price_e2": "integer|min:0",
"provider_fee_e2": "integer",
"provider_fee_prc": "numeric|between:0.0000,1.0000",
"quantity": "integer",
"quantity_real": "numeric",
"list_order": "integer",
"featured_in_order": "nullable|integer"
}
Desvincula un Good de un Branch. Cuando un BranchGood es eliminado, el API automáticamente elimina los GoodProperties del producto desvinculado y elimina los registros huérfanos de BranchProperty.
Método | URI | Cabeceras |
---|---|---|
DELETE | /companies/{companyId}/branches/{branchId}/goods/{goodId} |
Authorization |
Método | URI | Cabeceras |
---|---|---|
POST | /companies/{companyId}/branch-goods/batch-action/{action} |
Authorization |
{
"ids": [
"integer|min:1"
],
"payload": ""
}
{info} Soporta: Paginación Filters Carga dinámica
Método | URI | Cabeceras |
---|---|---|
GET | /companies/{companyId}/branch-goods/search |
N/A |
{
"q": "required|string",
"paginate": "nullable|boolean",
"results_mode": "string|in:goods,branch",
"limit": "nullable|integer",
"latitude_e6": "nullable|integer|between:-90000000,90000000",
"longitude_e6": "nullable|integer|between:-180000000,180000000",
"client_id": "nullable|integer",
"category_id": "nullable|integer"
}
Método | URI | Cabeceras |
---|---|---|
POST | /companies/{companyId}/branch-goods/{branchGoodId}/set-available |
Authorization |
Método | URI | Cabeceras |
---|---|---|
POST | /companies/{companyId}/branch-goods/{branchGoodId}/set-unavailable |
Authorization |
Método | URI | Cabeceras |
---|---|---|
DELETE | /companies/{companyId}/branch-goods/{branchGoodId} |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Método | URI | Cabeceras |
---|---|---|
GET | /companies/{companyId}/branches/{branchId}/branch-goods/featured |
N/A |
{info} Soporta: Paginación Filters Carga dinámica
Método | URI | Cabeceras |
---|---|---|
GET | /companies/{companyId}/branches/{branchId}/branch-goods/search |
N/A |
{
"q": "required|string",
"paginate": "nullable|boolean",
"results_mode": "string|in:goods,branch",
"limit": "nullable|integer",
"latitude_e6": "nullable|integer|between:-90000000,90000000",
"longitude_e6": "nullable|integer|between:-180000000,180000000",
"client_id": "nullable|integer",
"category_id": "nullable|integer"
}
allLogs
HasMany ApiLogbranch
BelongsTo BranchbranchGoodProperties
HasMany BranchGoodPropertybranchGroup
BelongsTo BranchGroupcategories
HasMany Categorygood
BelongsTo GoodgoodCategories
HasMany GoodCategorygoodProperties
HasMany GoodPropertylogs
HasMany ApiLogmaterials
HasMany GoodMaterialpromo
BelongsTo Couponproperties
HasMany Property