API de Yunbit
- Funcionamiento general de la API
- Valores por defecto
- Artículos
- Ejemplo de respuesta:
- Condiciones
- Fabricantes
- Unidades de Medida
- Tarifas
- Endpoints
- Excepciones de tarifa
- Proveedores
- Almacén
- Stock
- Alta de stock
- Modificación de stock
- Obtener el stock disponible
- Categorías
- Ejemplos, hay que indicar las credenciales de autenticación siempre:
- Salida truncada:
- Inserción:
- Response:
- Response:
- Características
- FeatureREST
- Ejemplo de GET
- Nombres de los valores de las características
- Relación de artículos con características
- Obtener las características de un artículo:
- Artículos compuestos
- Empresas y contactos
- Órdenes de compra - OCO
- Información general de órdenes de compra
- Departamento
- Incoterms
- Categorías de gastos
- Subcategorías de gastos
- Direcciones
- Cuenta bancaria
- Países
- Partidas de compra de órdenes de compra
- Código de divisas
- Endpoint para megacarga de OCO
- Pedidos
- Carro de la compra
- PUT /ShoppingCartREST
- Obtener todos los carritos
- Obtener los datos de un carrito
- Insertar un artículo en un carrito
- Explicación de campos
- Para los totales se pueden dar tres casos
- Métodos de pago
- Obtener los artículos de un carrito
- Pedidos
- POST /OrderREST/generate
- Estados disponibles en los pedidos
- Opciones de transporte
- Webhooks
- WEBHOOKS ASOCIADOS A OBJETOS
- Respuesta
- Proceso para obtener el stock disponible desde los webhooks
- Webhook OrdersModify, OrdersChangeStatus:
- Webhook TraceabilityInsert:
- Webhook WorkOrdersChangeStatus:
- Conocer los movimientos de stock de un artículo
- Multicliente
- IDs a crear
- Empresas
- Artículos
- Pedidos
- OCOs
- Añadir etiquetas no generadas en Yunbit
- API endpoint: EntitiesLoaderREST (Cargador de entidades)
- Formato de la petición
- Formato de la respuesta
- Ejemplo del proceso
Funcionamiento general de la API
Cada endpoint dispone de un formato de acceso genérico (para PUT,GET,POST,DELETE), y en algunos casos existen recursos especializados que, aunque intentamos que sigan el mismo patrón de acceso, puede variar en la forma de pasarle parámetros.
Por norma general dispondremos del siguiente formato para cada verbo HTTP:
PUT /EndpointREST/{format}
Los endpoint PUT nos permiten crear o insertar nuevos registros o actualizarlos. Para insertar un registro debemos añadir en formato JSON los campos y sus valores en el body de la petición, sin el campo “id”.
Si quisiéramos actualizar un registro, sería de la misma manera pero indicando el campo “id” y el valor del registro que se desea actualizar.
GET/POST /EndpointREST/{format}/{id}/{pag}/{tpag}
Los endpoint GET/POST nos permiten obtener registros. Se puede indicar solo {format} para obtener todos los registros. {format}/{id} para obtener un registro. O paginar los resultados con {format}//{pag}/{tpag}. Para que el paginador funcione correctamente debes indicar esa doble barra inclinada entre {format} y {pag} ({format}//{pag}). {pag} indica el número de la página a mostrar y {tpag} cuantos elementos por página se mostrarán.
La mayoría de endpoints son paginables, y en la respuesta aparecerá el siguiente elemento que podréis consultar sobre el total de elementos, el tamaño de página usado, etc.:
_pages":[
{
"totalRecords": 3116,
"records": 10,
"tampage": "10",
"page": "0",
"npages": 312,
"nextpage": 1

En el caso de endpoints con muchos registros o muchos campos siempre recomendamos paginar los resultados.
Si el endpoint consultado se envía por POST es posible filtrar los resultados enviando un formulario con el campo y el valor a buscar.
DELETE /Endpoint REST/{id}
Los endpoints para eliminar registros. Aunque tenemos disponible este verbo HTTP para borrar registros, lo habitual es desactivarlos indicando en el campo “status” el valor “0”, ya que muchos de los endpoints tienen este campo. En el caso de pedidos lo mejor es anularlos, pues hay varios procesos que se deben ejecutar (recálculo de stock, anulación de facturas, etc.).
Valores por defecto
En los endpoints será habitual que haya ciertos campos comunes que tendrán un valor por defecto, normalmente porque solo hay un registro (y por tanto un identificador), o porque se ha tomado la decisión que el valor indicado será el valor por defecto (aunque haya otros elementos de su tipo disponibles).
idMetagroup/idMetagrupo/customer: cw5fc79ea0d5dca. Se puede obtener accediendo a /MetaGroupREST/{format}
fkIva:
- IVA 10%: cw58f868e7b05f4cw5fc79ea0d5dca
- IVA 21%: cw58f868efd7febcw5fc79ea0d5dca
fkManufacturer: cw5fe2206f81d41
Artículos
PUT /ArticleREST/{format}/{id}
Ejemplo de respuesta:
"Article":{
"customer": "cw5d51549d49698", <-- Metagrupo
"name": "TEST", <-- Nombre del artículo
"reference": null,
"pubDate": null,
"weight": null,
"unitPrice": null,
"status": "1", <-- Por defecto se marca a 1 (Activo), 0 si se desactiva
"flags": "cw5e5cf0641a519", <-- Condición en el que se encuentra el artículo. Obligatorio. Ese identificador corresponde con "Nuevo"
"fkIva": "cw5d530f9722705", <-- Iva. Es obligatorio
"fkManufacturer": null, <-- Fabricante. Obligatorio
"width": null,
"height": null,
"depth": null,
"sellNoStock": "",
"furl": "test-test-nuevo",
"created": "2020-09-22 12:38:00",
"fkUser": "cw5d5154f0e42ec",
"obs": null,
"fkFamily": null,
"partNumber": "TEST", <-- Referencia o identificador único del artículo
"hasReference": "0",
"enableNoStockPrice": "1",
"noStockPrice": null,
"noStockTerm": 0,
"warranty": 0,
"isSpecial": "0",
"fkProvider": null,
"increaseGuarantee": "0",
"urgent": "1",
"noStockUrgentPrice": "0.00",
"pasiveSubject": 0,
"pasiveSubjectExpireDate": null,
"furlEn": "test-test-nuevo",
"checkStock": "1", ← Obligatorio
"longDescription": null,
"thickness": null,
"diameter": null,
"stockMinSell": "1.0000",
"stockLimit": null,
"shortDescription": null,
"rawMaterialCalculate": "0",
"margin": null,
"labour": null,
"plating": null,
"packaging": null,
"idParent": null, ← Id del artículo Maestro. Si no tiene maestro debe ser el mismo id del artículo
"innerDiameter": null,
"webMultiple": "1.0000",
"fkMeasurementUnits": "cw592d7fbc62af2", <-- Unidad de medida. Obligatorio
"widen": 0,
"bath": null,
"finish": null,
"stockMinPurchase": "1.0000",
"maxStock": null,
"type": "0",
"fkDefStore": "cw5f69d3c64bfdb", <-- Almacén/tienda por defecto. Obligatorio
"generic": "0",
"model": null,
"series": null,
"isRentable": "0",
"rentPrice": "0.00",
"rentMinDays": 0,
"articlesContainedToPurchase": "0",
"webStatus": null,
"volume": null,
"articlesContainedToPreparation": "0",
"articlesContainedToEntry": "0",
"availability": "1",
"fkIvaReceived": null,
"assemblyOnEntry": "0",
"publishdate": null,
"fkLicense": null,
"preview": "0",
"PRESALE": null,
"PRESALE_LIMIT_DATE": null,
"STOCK_MAX_SELL": null,
"countries_accepted": null,
"countries_denied": null,
"warrantyPurchase": 0,
"AvailableToBuy": "1",
"OrdersWithReturns": "0",
"presaleLimitUnits": null,
"articlesContainedToInventory": "0",
"barcode": null,
"isbn": null,
"ismn": null,
"ibic": null,
"tem": null,
"showPricesInWeb": null,
"pos": null,
"lifePotential": null,
"unitPriceVat": null,
"woPreparation": "1",
"electricalReference": null,
"specialStorageConditions": null,
"requiresConfiguration": "0",
"id": "cw5f69d4061439f",
}
- Si un artículo es un maestro, solo rellenarse cuando sea un artículo hijo. El valor de este campo debe ser el campo “id” del artículo maestro.
- En el caso de que un artículo sea su propio maestro, en el campo “idParent” se pondrá el valor del campo “id” del mismo artículo.
- /ArticleREST
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Articulos/ArticleTypes.raml
- Todos los artículos tienen el campo “availables” que indica el stock disponible en ese momento.
- Stock: GET ArticleStock/byArticle/{format}/{id}
Condiciones
Tipo de IVA a aplicar.
GET /IncomeVatTypeREST/{format}/{id}/{pag}/{tpag}
- Servicio IVA de ingresos: IncomeVatTypeREST
- Servicio IVA de gastos: OutcomeVatTypeREST
- Doc de campos del IVA de ingresos: https://cloud.yunbit.es/doc/apiDoc/finances/Incomes/IncomeVatTypeTypes.raml
- Doc de campos del IVA de gastos:
Fabricantes
Fabricantes de los artículos
GET /ManufacturerREST/{format}
Unidades de Medida
- Un artículo necesita una unidad de medida. Ahora mismo ya hay creadas varias (miligramos, gramos, kilogramos, mallas, unidades).
- GET /MeasurementUnitREST/{format}
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Stock/MeasurementUnitTypes.raml
Tarifas
Para la gestión de tarifas a través de API disponemos de los siguientes endpoints.
Endpoints
- Tarifas: RateAPI
- Excepciones de tarifa: RateException
- Empresas: El endpoint habitual de empresas vincula la tarifa con la empresa en el campo fkRate
Excepciones de tarifa
La descripción de los campos del endpoint se puede encontrar aquí https://wiki.yunbitsoftware.com/cargador-de-excepciones-de-tarifas/
Proveedores
PUT /CrmCompanyREST/{format}
GET/POST /CrmCompanyREST/{format}/{id}/{pag}/{tpag}
- En el artículo hay que indicar un proveedor, que será una empresa del tipo “Proveedor”. Si no existe hay que crearlo.
- /CrmCompanyREST
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/directory/CRM/CrmCompanyTypes.raml
- Para crear un proveedor, además de los datos habituales, hay que indicar en el campo “CAT” el valor “|Proveedor|”.
Almacén
- El artículo debe tener un almacén por defecto del que colgará el stock. Este stock puede estar en varios almacenes.
- /StoreREST/{format}
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Stock/StoreTypes.raml
Stock
Alta de stock
- /ArticleStockREST/{format}
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Stock/ArticleStockTypes.raml
Se puede crear un registro de stock indicando los siguientes campos
- *idStore: Id del almacén
- *created: Fecha de creación del registro
- *idArticle: Id del artículo
- *status: Por defecto a 1 (Activo). Si fuera a cero quedaría desactivado.
- *basePrice: El precio que tiene el artículo
- *cost: Coste real del artículo
- *barCode: Código de barras
- idMasterArticle: Si el artículo tiene un artículo padre.
- *multiplier: Unidades
- idArticleStock: Identificador del SSN (Número de serie) relacionado
- idContainer: Identificador del contenedor
Se suele crear un registro por almacén con las unidades existentes en este indicadas en el campo “multiplier”. Si está activo el control por número de serie habría que crear un registro por cada número de serie, y por tanto siempre podría haber más de un registro por almacén.
Si además el stock está contenido en cajas, pales y/o lotes, también habría que indicarlo. Además de crear las entradas correspondientes en /ArticleContainersREST, /ContainersREST y /ContainerObjectsREST.
Por último, si las ubicaciones del almacén están activadas sería necesario indicar la ubicación donde se entrará el stock, o donde se encuentre en ese momento. Si todo el proceso de ubicaciones se realiza por la API sería necesario añadir las entradas correspondientes en /StoresLocationsREST, /StoresLocationsDefinitionsREST y /StoresLocationsStockREST.
Modificación de stock
El stock puede ser modificado usando el mismo servicio. Si existe una orden de compra se deberá gestionar también está.
Obtener el stock disponible
El stock disponible se puede obtener desde el endpoint /ArticleStockREST/availables/{format}/{idArticle}/{idStore}
Categorías
Aquí tenemos tres endpoints:
- Categorías: Nos devuelve todas las categorías.
- Relación de categorías con categorías: Las relaciones entre las categorías, la jerarquía la marca el campo nivel de la categoría.
- Relaciones de categorías con artículos: Define la pertenencia de los artículos con las categorías.
GET|PUT /CategoryREST/{format}
- Dónde {format} puede ser JSON o XML
- Este endpoint devolvería todas las categorías, también es el usado para insertar con PUT.
GET /CategoryREST/{format}/{id}
- Dónde {format} puede ser JSON o XML
- Donde {id} es el identificador de la categoría
- Este endpoint devolvería la categoría indicada con {id}.
GET|PUT /CategoriesRelCategoryREST/{format}
- Dónde {format} puede ser JSON o XML
- Este endpoint devolvería todas las relaciones entre categorías, también es el usado para insertar con PUT.
GET /CategoriesRelCategoryREST/{format}/{id}
- Dónde {format} puede ser JSON o XML
- Donde {id} es el identificador de la relación
- Este endpoint devolvería los datos de la relación indicada con {id}.
GET /CategoriesRelCategoryREST/category/{format}/{id}
- Dónde {format} puede ser JSON o XML
- Donde {id} es el identificador de la categoría
- Este endpoint devolvería todas las relaciones que tuviera la categoría indicada.
GET|PUT /CategoriesRelArticleREST/{format}
- Dónde {format} puede ser JSON o XML
- Este endpoint devolvería todas las relaciones entre categorías y artículos, también es el usado para insertar con PUT.
GET /CategoriesRelArticleREST/{format}/{id}
- Dónde {format} puede ser JSON o XML
- Donde {id} es el identificador de la relación
- Este endpoint devolvería los datos de la relación indicada con {id}.
GET /CategoriesRelArticleREST/category/{format}/{id}
- Dónde {format} puede ser JSON o XML
- Donde {id} es el identificador de la categoría
- Este endpoint devolvería los datos de relación en los que apareciera la categoría indicada en {id}.
GET /CategoriesRelArticleREST/article/{format}/{id}
- Dónde {format} puede ser JSON o XML
- Donde {id} es el identificador del artículo
- Este endpoint devolvería los datos de relación del artículo indicado en {id}.
Ejemplos, hay que indicar las credenciales de autenticación siempre:
GET/CategoryREST/JSON
Esto devolverá el listado completo de categorías. Como el resultado es muy grande no os indico el resultado, pero dentro de “Category” habría un array con las categorías.
GET/CategoryREST/JSON/cw5d656bc93b3cd
Esto devuelve una categoría.
Salida truncada:

Inserción:
PUT/CategoryREST/{format}
Body:
Inserción:
PUT/CategoryREST/{format}
Body:
{
"fkFamily":"",
"fkInvoiceCat":"",
"fkInvoiceSubCat": "",
"fkInvoiceDepartment": "",
"fkInvoiceReceivedCat": "",
"fkInvoiceReceivedSubcat": "",
"customer": "cw5d656bc93b3cd", ← Obligatorio
"name": "Categoría 1", ← Obligatorio
"furl": "",
"level": "0", ← Obligatorio
"created": "2020-11-18", ← Obligatorio
"fkUser": "",
"fkMenu": "",
"position": "",
"fkInvSentCat": "",
"fkInvSentSubCat": ""
}
Response:

PUT/CategoriesRelCategoryREST/JSON
Body:
{
"fkCategoryParent":"123", ← Identificador de la categoría padre
"fkCategoryChild":"456" ← Identificador de la categoría hija
}
Response:

PUT/CategoriesRelArticleREST/JSON

Obtener los datos de las categorías hijas de una categoría padre dada:
Hay que llamar a GET /CategoriesRelCategoryREST/category/{format}/{id}, que al pasarle el id de la categoría padre os devolverá un listado de identificadores de categorías hijas.
Para obtener los datos de estas categorías tendríais que llamar a GET /CategoryREST/{format}/{id} con el {id} de la categoría hija, que correspondería al campo fkCategoryChild en la petición anterior.
Características
FeatureREST
- /FeatureREST
- Desde este servicio se crean las características.
- La información de los campos está en https://cloud.yunbit.es/doc/apiDoc/eCommerce/Features/FeatureTypes.raml
- Los campos reference, name y múltiple son lo mínimo que necesitaréis.
- Las características pueden ser traducibles para mostrarlas en múltiples idiomas añadiendo un registro relacionado. Para ello:
- Hay que realizar una petición de inserción en el servicio:/ECMTextREST, indicando en el campo idECMWebPage el identificador de la característica (campo id) y rellenar el campo Title.
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/contents/CMA/ECMTextTypes.raml
GET/PUT /FeatureREST/{format}/{id}
- Dónde {format} puede ser JSON o XML
Ejemplo de GET

Nombres de los valores de las características
FeatureValuesNameREST
- Define los nombres de los valores de las características. Por ejemplo, para la característica “Color” aquí habría que indicar los valores correspondientes: rojo, verde, azul, etc.
- /FeatureValuesNameREST
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Features/FeatureValuesNameTypes.raml
- Los nombres de los valores de las características pueden ser traducibles para mostrarlas en múltiples idiomas añadiendo un registro relacionado. Para ello:
- Hay que realizar una petición de inserción en el servicio: /ECMTextREST, indicando en el campo idECMWebPage el identificador del nombre de la característica (campo id) y rellenar el campo Title.
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/contents/CMA/ECMTextTypes.raml
GET/PUT /FeatureValuesNameREST/{format}/{id}
- Dónde {format} puede ser JSON o XML
Ejemplo:

Relación de artículos con características
- Si es un artículo maestro, relacionamos el artículo con las características (en los hijos se indicarán los valores):
- /FeatureRelArticleREST
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Features/FeatureRelArticleTypes.raml
- Si es un artículo hijo, relacionamos el artículo con el valor de la característica:
- /FeatureValuesRelArticleREST
- https://cloud.yunbit.es/doc/apiDoc/eCommerce/Features/FeatureValuesRelArticleTypes.raml
GET /FeaturesRelArticleREST/{format}/{id}
FeaturesRelArticle":{ "idParent": "cw5a8c22c419f33", "fkArticle": "cw5a859ed0e0bc2", "pos": 1, "codeGeneration": "0", "allowedValues": null, "id": "cw5a8c22c41e0bf", "idFeatures_id": "cw5a8c22c419f33", "idFeatures_reference": "UBICACION", "idFeatures_name": "Ubicación", "idFeatures_multiple": "0", "idFeatures_showInDetailsPage": "0", "idFeatures_useAsFilter": "1", "idArticles_id": null, "idArticles_customer": null, "idArticles_name": null, "idArticles_reference": null, "idArticles_pubDate": null, "idArticles_weight": null, "idArticles_unitPrice": null, "idArticles_status": null, "idArticles_flags": null, "idArticles_fkIva": null, "idArticles_fkManufacturer": null, "idArticles_width": null, "idArticles_height": null, "idArticles_depth": null, "idArticles_sellNoStock": null, "idArticles_furl": null, "idArticles_created": null, "idArticles_fkUser": null, "idArticles_obs": null, "idArticles_fkFamily": null, "idArticles_partNumber": null, "idArticles_hasReference": null, "idArticles_enableNoStockPrice": null, "idArticles_noStockPrice": null, "idArticles_noStockTerm": null, "idArticles_warranty": null, "idArticles_isSpecial": null, "idArticles_fkProvider": null, "idArticles_increaseGuarantee": null, "idArticles_urgent": null, "idArticles_noStockUrgentPrice": null, "idArticles_pasiveSubject": null, "idArticles_pasiveSubjectExpireDate": null, "idArticles_furlEn": null, "idArticles_checkStock": null, "idArticles_longDescription": null, "idArticles_thickness": null, "idArticles_diameter": null, "idArticles_stockMinSell": null, "idArticles_stockLimit": null, "idArticles_shortDescription": null, "idArticles_rawMaterialCalculate": null, "idArticles_margin": null, "idArticles_labour": null, "idArticles_plating": null, "idArticles_packaging": null, "idArticles_idParent": null, "idArticles_innerDiameter": null, "idArticles_webMultiple": null, "idArticles_fkMeasurementUnits": null, "idArticles_widen": null, "idArticles_bath": null, "idArticles_finish": null, "idArticles_stockMinPurchase": null, "idArticles_maxStock": null, "idArticles_type": null, "idArticles_fkDefStore": null, "idArticles_generic": null, "idArticles_model": null, "idArticles_series": null, "idArticles_isRentable": null, "idArticles_rentPrice": null, "idArticles_rentMinDays": null, "idArticles_articlesContainedToPurchase": null, "idArticles_webStatus": null, "idArticles_volume": null, "idArticles_articlesContainedToPreparation": null, "idArticles_articlesContainedToEntry": null, "idArticles_availability": null, "idArticles_fkIvaReceived": null, "idArticles_assemblyOnEntry": null, "idArticles_publishdate": null, "idArticles_fkLicense": null, "idArticles_preview": null, "idArticles_PRESALE": null, "idArticles_PRESALE_LIMIT_DATE": null, "idArticles_STOCK_MAX_SELL": null, "idArticles_countries_accepted": null, "idArticles_countries_denied": null, "idArticles_warrantyPurchase": null, "idArticles_AvailableToBuy": null, "idArticles_OrdersWithReturns": null, "idArticles_presaleLimitUnits": null, "idArticles_articlesContainedToInventory": null, "idArticles_barcode": null, "idArticles_isbn": null, "idArticles_ismn": null, "idArticles_ibic": null, "idArticles_tem": null, "idArticles_showPricesInWeb": null, "idArticles_pos": null }
Obtener las características de un artículo:
GET /FeaturesRelArticleREST/article/{format}/{id}:
FeaturesRelArticle":[ { "idParent": "cw5a8c22c41396a", "fkArticle": "cw5a859ed0e0bc2", "pos": 0, "codeGeneration": "0", "allowedValues": null, "id": "cw5a8c22c41986b", "idFeatures_id": "cw5a8c22c41396a", "idFeatures_reference": "COMPOSITOR", "idFeatures_name": "Compositor", "idFeatures_multiple": "0", "idFeatures_showInDetailsPage": "1", "idFeatures_useAsFilter": "1", "idArticles_id": null, "idArticles_customer": null, "idArticles_name": null, "idArticles_reference": null, "idArticles_pubDate": null, "idArticles_weight": null, "idArticles_unitPrice": null, "idArticles_status": null, "idArticles_flags": null, "idArticles_fkIva": null, "idArticles_fkManufacturer": null, "idArticles_width": null, "idArticles_height": null, "idArticles_depth": null, "idArticles_sellNoStock": null, "idArticles_furl": null, "idArticles_created": null, "idArticles_fkUser": null, "idArticles_obs": null, "idArticles_fkFamily": null, "idArticles_partNumber": null, "idArticles_hasReference": null, "idArticles_enableNoStockPrice": null, "idArticles_noStockPrice": null, "idArticles_noStockTerm": null, "idArticles_warranty": null, "idArticles_isSpecial": null, "idArticles_fkProvider": null, "idArticles_increaseGuarantee": null, "idArticles_urgent": null, "idArticles_noStockUrgentPrice": null, "idArticles_pasiveSubject": null, "idArticles_pasiveSubjectExpireDate": null, "idArticles_furlEn": null, "idArticles_checkStock": null, "idArticles_longDescription": null, "idArticles_thickness": null, "idArticles_diameter": null, "idArticles_stockMinSell": null, "idArticles_stockLimit": null, "idArticles_shortDescription": null, "idArticles_rawMaterialCalculate": null, "idArticles_margin": null, "idArticles_labour": null, "idArticles_plating": null, "idArticles_packaging": null, "idArticles_idParent": null, "idArticles_innerDiameter": null, "idArticles_webMultiple": null, "idArticles_fkMeasurementUnits": null, "idArticles_widen": null, "idArticles_bath": null, "idArticles_finish": null, "idArticles_stockMinPurchase": null, "idArticles_maxStock": null, "idArticles_type": null, "idArticles_fkDefStore": null, "idArticles_generic": null, "idArticles_model": null, "idArticles_series": null, "idArticles_isRentable": null, "idArticles_rentPrice": null, "idArticles_rentMinDays": null, "idArticles_articlesContainedToPurchase": null, "idArticles_webStatus": null, "idArticles_volume": null, "idArticles_articlesContainedToPreparation": null, "idArticles_articlesContainedToEntry": null, "idArticles_availability": null, "idArticles_fkIvaReceived": null, "idArticles_assemblyOnEntry": null, "idArticles_publishdate": null, "idArticles_fkLicense": null, "idArticles_preview": null, "idArticles_PRESALE": null, "idArticles_PRESALE_LIMIT_DATE": null, "idArticles_STOCK_MAX_SELL": null, "idArticles_countries_accepted": null, "idArticles_countries_denied": null, "idArticles_warrantyPurchase": null, "idArticles_AvailableToBuy": null, "idArticles_OrdersWithReturns": null, "idArticles_presaleLimitUnits": null, "idArticles_articlesContainedToInventory": null, "idArticles_barcode": null, "idArticles_isbn": null, "idArticles_ismn": null, "idArticles_ibic": null, "idArticles_tem": null, "idArticles_showPricesInWeb": null, "idArticles_pos": null } ]
Artículos compuestos
Una vez creado los artículos se pueden crear artículos compuestos.
Para ello primero hay que crear un artículo que contendrá los elementos correspondientes.
En segundo lugar se relacionará este artículo con los artículos que lo componen.
PUT /CompositeArticleREST/{format}
GET/POST /CompositeArticleREST/{format}/{id}/{pag}/{tpag}
Documentación de los campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Articulos/CompositeArticleTypes.raml
En el artículo, bien al crearlo o modificarlo puedes indicar que los artículos que lo componen se desglosen:
- articlesContainedToPurchase: Desglosar en compras con Artículos contenidos (1/0)
- articlesContainedToPreparation: Desglosar artículo con artículos contenidos durante la preparación (1/0)
- articlesContainedToEntry: Desglosar artículo comprado durante la entrada (1/0)
- assemblyOnEntry: Fabricación del artículo continente en la entrada de los contenidos (1/0)
Empresas y contactos
Un pedido está vinculado con un contacto de un cliente. Para nosotros, un cliente es una empresa, y un contacto un empleado de esa empresa. En el caso de particulares tanto la empresa como el contacto serán el mismo. Por tanto, primero hay que crear el cliente, y después los posibles contactos que existan.
- Servicio de clientes: /CrmCompanyREST, con el valor “|Cliente|” en el campo “category”. Si el cliente ya existiese, o tuviera un valor en “category” distinto (por ejemplo “|Proveedor|”) es necesario que se mantenga el valor existente, con lo que quedaría “|Proveedor|Cliente|”.
- También es necesario rellenar los campos defaultAddressInvoice, defaultContactInvoice, defaultAddressInvoiceToSend y defaultContactInvoiceToSend. Los defaultAddress* deben tener el identificador de la dirección que se crea de facturación, los defaultContact el id del contacto. Son necesarios para la generación automática de la factura al crear el pedido.
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/directory/CRM/CrmCompanyTypes.raml
- Servicio de contactos: /ContactREST.
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/directory/CRM/ContactTypes.raml
- El campo customerConsent del contacto debe tener el valor “1”, indica que consiente la gestión de la solicitud, para el ecommerce permitiría la gestión del pedido.
- El campo prospectConsent permite el envío de información periódica si se le da el valor “1”.
- Para ambos campos están los campos de fechas: customerConsentDate y prospectConsentDate.
Además, cada cliente tendrá sus propias direcciones que se añadirán al pedido:
- /AddressesREST
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/directory/CRM/AddressesTypes.raml
- Para conocer el tipo de dirección fiscal o de envío que existen, se puede utilizar /AddressTypeREST/ShipmentAddressType (envío), y /AddressTypeREST/FiscalAddressType (Fiscal)
Órdenes de compra - OCO
Información general de órdenes de compra
Cualquier entrada en Yunbit está relacionada con una orden de compra.
Endpoint genérico de órdenes de compra:
PurchaseOrderREST/{format}/{id}/{pag}/{tpag}
Para la inserción de nuevas órdenes de compra son obligatorios los siguientes campos:
- idMetagroup → Almacena un identificador de un Metagrupo, en vuestro caso, al tener sólo uno, debéis introducir el siguiente id: "cw6603e55ebef64"
- idCompany → Almacena un identificador de proveedor
- dateOfPurchase → Almacena una fecha, en formato “YYYY-MM-DD”
- idContactSend → Almacena un identificador de contacto
- FK_STORE → Almacena un identificador de un almacén
- wayToPay → Almacena una forma de pago
- dateOfPurchase → Almacena una fecha en formato ‘YYYY-MM-DD hh:mm:ss’
- status → Almacena un estado
- idUser → Almacena el identificador del usuario que ha creado la órden de compra, en caso de que se quiera poner el usuario de la integración, su id es “cw655c745cbec59”
- idUserPurchaseOwner → Almacena el identificador del usuario que gestiona internamente la órden de compra.
- documentNumber → Identificador de la orden de compra, puede ser el que tengáis en vuestro sistema para referenciar la orden de compra.
- idContactSend → Almacena un id de un contacto
- idDestAddress → Almacenan identificadores de direcciones
PUT …/PurchaseOrderREST/JSON
BODY:
{ "idMetagroup": "cw5f16e47d2ccbe", "idCompany": "cw60d599a4c9563", "dateOfPurchase": "2023-11-21", "idUser": "cw5f16e50c346db", "idUserPurchaseOwner": "cw5f16e50c346db", "status": "0", "documentNumber": "C000002", "idContactSend": "cw60d59b2182268", "wayToPay": "1", "fkStore": "cw5ceef74ad85bdcw5f16e47d2ccbe", "isInvestment": "0", "idDestAddress": "cw64941126b9f49" }
JSON devuelto:
{ "User": {...}, "PurchaseOrder": { "idMetagroup": "cw5f16e47d2ccbe", "idCompany": "cw60d599a4c9563", "dateOfPurchase": "2023-11-21", "idUser": "cw5f16e50c346db", "idUserPurchaseOwner": "cw5f16e50c346db", "status": "0", "documentNumber": "C000002", "idContactSend": "cw60d59b2182268", "wayToPay": "1", "fkStore": "cw5ceef74ad85bdcw5f16e47d2ccbe", "isInvestment": "0", "idDestAddress": "cw64941126b9f49", "id": "bc29a0c037ee793" }, "_pages": [...] }
Desde /PurchaseOrderREST también es posible obtener los conceptos de la orden de compra.
- https://cloud.yunbit.es/doc/apiDoc/finances/PurchaseOrders/PurchaseOrderTypes.raml
- El campo FK_DEPARTMENT almacena un id de un departamento
- El campo wayToPay sigue la siguiente lógica:
Valores que almacena | Significado |
0 | En efectivo |
1 | Transferencia bancaria |
2 | Domiciliado |
3 | Por tarjeta |
4 | Pagaré |
5 | Talón |
6 | Confirming |
- El campo timeToPay sigue la siguiente lógica:
Valores que almacena | Significados |
0 | Contado |
30 | 30 días |
45 | 45 días |
60 | 60 días |
90 | 90 días |
120 | 120 días |
127 | A la vista |
36 | 30-60-90 días |
108 | 180 días |
- El campo status toma los siguientes valores:
Valores que almacena | Significado |
0 | En proceso |
1 | Pendiente de aprobación |
2 | Aprobada |
3 | Anulada |
4 | Validada |
5 | Parcial |
6 | Recibida |
7 | Pendiente de pago |
- El campo idIncoterm almacena el id de un incoterm
- El campo isReturn almacena valores ‘0’ o ‘1’, significando No y Sí, respectivamente.
- El campo isResending almacena valores ‘0’ o ‘1’, significando No y Sí, respectivamente.
- El campo idOriginAddress almacenan identificadores de direcciones
- El campo idClientContact almacena un id de contactos
- El campo idCat almacena un id de una categoría de gasto
- El campo idSubcat almacena un id de una subcategoría de gasto
- El campo idShipmentComp almacena un id de una compañía de transporte
- El campo idShipmentService almacena un id de un servicio de transporte
Ejemplo de cURL enviado al servidor:
curl --location 'http://{servicio}/cloud/EntitiesLoaderREST' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic {autorizacion}' \ --data '{ "object": "PURCHASE_ORDERS_OBJ", "action": "upsert", “map”: “Prueba”, "entities": [ { "userName": "PRUEBA", "userNameAction": "PRUEBA", "relatedClientSocialName": "PRUEBA", "providerClientNum": "12435", "providerSocialName": "Proveedor", "providerName": "Proveedor", "purchaseOrderDocumentNumber": "OCOTEST-001", "providerContactName": "PRUEBA", "purchaseOrderDate": "2024-04-11 07:16:111", "purchaserOrderWayToPay": "0", "conceptUnits": 1, "conceptDeliveryDate": "2024-04-11 07:16:111", "articlePartNumber": "PNTEST", "articleName": "TEST", "articleCondition": "Nuevo", "articleCategory": "Planchas", "articleVat": "Exento", "articleMeasurementUnit": "Unidades", "articleDefaultStore": "PUERTO", "serialNumbers": "11111|2222|33333" }, { "userName": "PRUEBA", "relatedClientSocialName": "PRUEBA", "providerClientNum": "12435", "providerSocialName": "Proveedor", "providerName": "Proveedor", "purchaseOrderDocumentNumber": "OCOTEST-002", "userNameAction": "PRUEBA", "providerContactName": "PRUEBA", "purchaseOrderDate": "2024-04-11 07:16:111", "purchaserOrderWayToPay": "0", "conceptUnits": 1, "conceptDeliveryDate": "2024-04-11 07:16:111", "articlePartNumber": "PNTEST2", "articleName": "TEST 2", "articleCondition": "Nuevo", "articleCategory": "Planchas", "articleVat": "Exento", "articleMeasurementUnit": "Unidades", "articleDefaultStore": "PUERTO", "serialNumbers": "2222|33333" } ] }'
Departamento
- Endpoint: DepartmentREST/{format}/{id}/{pag}/{tpag}
- https://cloud.yunbit.es/doc/apiDoc/HHRR/HR/DepartmentTypes.raml
Incoterms
- El endpoint destinado para los incoterms es el siguiente: IncotermREST/{format}/{id}/{pag}/{tpag}
- Puede consultar la información sobre los campos en el siguiente enlace a JSON:
Categorías de gastos
- Endpoint: OutcomeConceptCatREST/{format}/{id}/{pag}/{tpag}
- https://cloud.yunbit.es/doc/apiDoc/finances/Outcomes/OutcomeConceptCatTypes.raml
Subcategorías de gastos
- Endpoint: OutcomeConceptSubcatREST/{format}/{id}/{pag}/{tpag}
- https://cloud.yunbit.es/doc/apiDoc/finances/Outcomes/OutcomeConceptSubcatTypes.raml
Direcciones
Además, cada cliente tendrá sus propias direcciones que se añadirán al pedido:
- /AddressesREST
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/directory/CRM/AddressesTypes.raml
- Para conocer el tipo de dirección fiscal o de envío que existen, se puede utilizar /AddressTypeREST/ShipmentAddressType (envío), y /AddressTypeREST/FiscalAddressType (Fiscal)
- El campo dateUpdated toma valores de tipo date: ‘YYYY-MM-DD’
- El campo idDefAccount almacena el id de una cuenta bancaria
- El campo country almacena el id de un país
- Los campos shippingCompany y shippingService son identificadores de una compañia y servicio de transporte
Ejemplo de inserción de una dirección:
- En primer lugar, debemos conocer qué tipo de dirección queremos insertar, realizando una llamada GET a los tipos de direcciones.
- Una vez sabiendo el id del tipo de dirección y los demás datos que queremos insertar, se realiza la petición PUT a la API, con la siguiente estructura:
/AddressesREST/JSON
Body:
{ "idMetagroup": "idMetagroup", "tAddress": "idTipoDireccion", "title": "titulo", "address": "Direccion"}
JSON devuelto:
{
"_pages":[[]],
"User":{"…},
"Addresses":{
"idMetagroup": "idMetagroup",
"tAddress": "idTipoDireccion",
"title": "titulo",
"address": "Direccion",
"id": "bc10b763adcfbb0"
}
}
Cuenta bancaria
- GET ClientsAccountREST/{format}/{id}
- Toda la información sobre los campos de este endpoint se puede consultar en el siguiente enlace:
Países
- /CountryREST
- Documentos de campos:
Partidas de compra de órdenes de compra
El endpoint para las partidas de compra de órdenes de compra es:
PurchaseOrderConceptsREST/{format}/{id}/{pag}/{tpag}
Los campos relacionados con este endpoint pueden ser consultados a través de este enlace a un JSON:
Información extra para algunos campos relacionados con este endpoint:
- El campo idPurchaseOrder almacena un id de una orden de compra
- El campo position es el valor que hace referencia a la posición.
- El campo name es obligatorio de cumplimentar.
- Elc ampo conceptDate es obligatorio de cumplimentar, es de tipo fecha con el formato: YYYY-MM-DD
- El campo idCat almacena un id de una categoría de gasto
- El campo idSubcat almacena un id de una subcategoría de gasto
- El campo idDepartment almacena un id de un departamento
- El campo idArea almacena un id de una área
- El campo idVat almacena un id de IVA de ingreso
- El campo units almacena las unidades
- El campo idArticle almacena un id de un artículo
- El campo amount almacena el importe del concepto sin IVA
- El campo amountVat almacena el importe del IVA
- El campo vat almacena el valor en porcentaje del IVA aplicado.
- El campo amountSubtotal almacena el importe del concepto con IVA
- El campo amountTax almacena el importe del IRPF en caso de que tenga.
- El campo costUd almacena el coste unitario del artículo.
Los campos obligatorios para un concepto de órdenes de compra son idPurchaseOrder, name, conceptDate y units.
Ejemplo de inserción:
PUT …/PurchaseOrderConceptREST/JSON
Body:
{"idPurchaseOrder":"idOrdenCompra","name":"Nombre","conceptDate":"2023-01-01", "units": 1}
JSON devuelto:
{
"_pages":[[]],
"User":{"…},
"PurchaseOrderConcept":{
"idPurchaseOrder": "idOrdenCompra",
"name": "Nombre",
"conceptDate": "2023-01-01",
units": 1,
"id": "bc67f1005771b0d"
}
}
Código de divisas
El endpoint para los códigos de divisas es el siguiente:
CashFlowCurrencyCodeREST/{format}/{id}/{pag}/{tpag}
Para consultar toda la información relacionada con los campos de este endpoint puede consultar el siguiente enlace a JSON:
Endpoint para megacarga de OCO
Para la carga de compras se debe realizar una llamada POST a /EntitiesLoaderREST. El formato es JSON para la entrada y respuesta de datos.
El formato de entrada debe ser un objeto JSON con los siguientes campos:
- object: Prefijado a PURCHASE_ORDERS_OBJ
- action: Prefijado a upsert
- map: Nombre del mapa a cargar
- entities: Array de objetos JSON con las líneas a insertar. Cada objeto debe tener las siguientes propiedades, salvo que se indique son opcionales:
- userName: Nombre de la persona que gestiona la compra
- userNameAction: Nombre de usuario que crea la compra.
- relatedClientSocialName: Razón social del cliente relacionado (Opcional)
- providerClientNum: Número de cliente
- providerSocialName: Razón social del proveedor (Opcional)
- providerName: Nombre comercial del proveedor (Opcional)
- providerContactName: Nombre del contacto del proveedor
- purchaseOrderDocumentNumber: Número de la OCO
- purchaseOrderDate: Fecha de la órden de compra
- purchaseOrderWayToPay: Prefijar a 0
- conceptUnits: Unidades de la partidas de compra
- conceptDeliveryDate: Fecha de entrega prevista de la partida de compra
- articlePartNumber: Part number del artículo
- articleName: Nombre del artículo (Opcional si el artículo se ha creado previamente en el sistema)
- articleCondition: Condición del artículo. Prefijar a Nuevo (Opcional si el artículo se ha creado previamente en el sistema)
- articleVat: IVA del artículo. Prefijar a Exento (Opcional si el artículo se ha creado previamente en el sistema)
- articleMeasurementUnit: Unidad de medida del artículo. Prefijar a Unitdades. (Opcional si el artículo se ha creado previamente en el sistema)
- articleDefaultStore: Identificador del almacén por defecto de los artículos (Opcional si el artículo se ha creado previamente en el sistema)
- serialNumber: Número de serie a insertar.
- articleBarcode: Código de barras del artículo
- purchaseOrderType: Tipo de la órden de compra
- conceptPosition: Posición del concepto de la órden de compra
- contacProviderNumber: El número de cliente del contacto del proveedor (la misma que providerClientNum)
Nota: el orden en que se envían las entidades (entities) debe coincidir con el órden que se establezca en el mapa (map). Si no se van a enviar los valores opcionales se debe enviar un mapa en el que no estén "mapeados"
Ejemplo curl:
curl --location 'http://{servicio}/cloud/EntitiesLoaderREST' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic {autorizacion}' \ --data '{ "object": "PURCHASE_ORDERS_OBJ", "action": "upsert", "map": "Prueba", "entities": [ { "userName": "PRUEBA", "userNameAction": "PRUEBA", "relatedClientSocialName": "PRUEBA", "providerClientNum": "12435", "providerSocialName": "Proveedor", "providerName": "Proveedor", "purchaseOrderDocumentNumber": "OCOTEST-001", "providerContactName": "PRUEBA", "purchaseOrderDate": "2024-04-11 07:16:11", "purchaserOrderWayToPay": "0", "conceptUnits": 1, "conceptDeliveryDate": "2024-04-11 07:16:11", "articlePartNumber": "PNTEST", "articleName": "TEST", "articleCondition": "Nuevo", "articleVat": "Exento", "articleMeasurementUnit": "UDS", "articleDefaultStore": "PUERTO", "serialNumber": "11111", "articleBarcode": "barcode2", "purchaseOrderType": "Tipo Prueba", "conceptPosition": 1, "contacProviderNumber": "12435" }, { "userName": "PRUEBA", "userNameAction": "PRUEBA", "relatedClientSocialName": "PRUEBA", "providerClientNum": "12435", "providerSocialName": "Proveedor", "providerName": "Proveedor", "purchaseOrderDocumentNumber": "OCOTEST-002", "userNameAction": "PRUEBA", "providerContactName": "PRUEBA", "purchaseOrderDate": "2024-04-11 07:16:11", "purchaserOrderWayToPay": "0", "conceptUnits": 1, "conceptDeliveryDate": "2024-04-11 07:16:11", "articlePartNumber": "PNTEST2", "articleName": "TEST 2", "articleCondition": "Nuevo", "articleVat": "Exento", "articleMeasurementUnit": "UDS", "articleDefaultStore": "PUERTO", "serialNumber": "2222", "articleBarcode": "barcode2", "purchaseOrderType": "Tipo Prueba", "conceptPosition": 1, "contacProviderNumber": "12435" } ] }'
Respuesta: Array con la siguiente información
- "status":true si el proceso se realizó correctamente, false en caso contrario.
- "message": mensaje de error en caso de haberlo.
- "ids": array con los ids de las órdenes de compra insertadas o modificadas.
Pedidos
Para la creación del pedido es necesario primero que esté creado el cliente /CrmCompanyREST), el contacto (/ContactsREST) y el carrito (/ShoppingCartREST) con sus artículos (/ShoppingCartsArticleREST).
A continuación hay que realizar una petición a /OrderREST/generate con los parámetros indicados en el endpoint (más abajo).
Carro de la compra
Un pedido está relacionado con un carro de la compra y sus conceptos.
- Servicio de datos del carrito: /ShoppingCartREST
- Servicio de conceptos del carrito: /ShoppingCartArticleREST
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Articulos/ShoppingCartTypes.raml
- Documento de campos: https://cloud.yunbit.es/doc/apiDoc/eCommerce/Articulos/ShoppingCartsArticleTypes.raml
Tenéis las definiciones de campos en los enlaces indicados. Si tenéis alguna duda consultadnos. Las peticiones PUT funcionan igual a los ejemplos de las categorías. El campo “Id” solo se indica si es una actualización, si no, no debe aparecer en el Body de la petición.
PUT /ShoppingCartREST

Obtener todos los carritos
GET /ShoppingCartREST/{format}//{pag}/{tpag}
Obtener los datos de un carrito
GET /ShoppingCartREST/{format}/{id}
Insertar un artículo en un carrito
PUT /ShoppingCartsArticleREST

Explicación de campos
"inStock": "1", ← Indicar "1" si el artículo en el momento de insertarlo en el carrito tenía stock. En caso contrario indicar un "0"
"grossUnitStockPrice": "246.46", <-- Precio bruto unitario de stock
"unitStockBasePrice": "143.00", <-- Precio base unitario de stock
"unitStockPrice": "143.00", <-- Precio unitario de stock
"grossUnitNoStockPrice": "246.46", <-- Precio bruto unitario sin stock
"unitNoStockBasePrice": "143.00", <-- Precio base unitario sin stock
"unitNoStockPrice": "143.00", <-- Precio unitario sin stock
"rechargo": "-10.00", <-- Recargo de equivalencia sin símbolos de euro o porcentaje
"rechargoType": "0", <-- Tipo de recargo de equivalencia. Para indicar un tipo porcentual, el valor es "0", para indicar un tipo directo (euros), "1".
"totalStockBasePrice": "143.00", <-- Precio base total de stock
"totalStockPrice": "143.00", <-- Precio total de stock
"totalNoStockBasePrice": "0", <-- Precio base total sin stock
"totalNoStockPrice": "0" <-- Precio total sin stock
Nosotros trabajamos con dos precios: precios de stock y precios sin stock. Algunos de nuestros clientes trabajan con dos precios dependiendo del stock disponible de un artículo, si hay stock el artículo tiene un precio, si no hay stock tiene un precio diferente.
Si este no es vuestro caso los campos "unitStockPrice"/"unitNoStockPrice", "unitStockBasePrice"/"unitNoStockBasePrice" y "grossUnitStockPrice"/"grossUnitNoStockPrice" deberían coincidir en su valor. Por ejemplo, el valor de "unitStockPrice" debe ser igual al valor de "unitNoStockPrice".
Para los totales se pueden dar tres casos
- Si el número de unidades vendidas están disponibles (hay stock), entonces los campos "totalNoStockPrice" y "totalNoStockBasePrice" tendrán el valor "0", los otros dos campos de total serán los que tengan el valor correcto.
- Si el número de unidades vendidas no están disponibles (no hay stock), entonces los campos "totalStockPrice" y "totalStockBasePrice" tendrán el valor "0", los otros dos campos de total serán los que tengan el valor correcto.
- Si disponemos de 5 unidades de stock pero se han vendido 7 unidades, entonces los campos "totalStockPrice" y "totalStockBasePrice" tendrán el valor de las cinco unidades que haya en stock, y "totalNoStockPrice" y "totalNoStockBasePrice" tendrán el valor de las restantes dos unidades de las que no hay stock.
Métodos de pago
Efectivo / Contrarreenbolso | 0 |
Transferencia bancaria | 1 |
Domiciliación | 2 |
Tarjeta de crédito/debito | 3 |
Pagaré | 4 |
Talón | 5 |
Confirming | 6 |
Carta de cŕedito | 7 |
Cheque | 8 |
CESCE | 9 |
American Express | A |
Agente | B |
RAndorra | C |
Vale | D |
Devolución del vale | T |
Contrarreembolso | E |
Leasing | L |
Renting | R |
Paypal | P |
Paga Más tarde | F |
Tarjeta regalo | G |
Aplazame | H |
Obtener los artículos de un carrito
GET /ShoppingCartsArticleREST/shoppingCart/{format}/{idCart}
Pedidos
- La creación del pedido se basa en los datos existentes en el carrito. Por tanto es necesario crear primero el carrito y sus conceptos antes de generar el pedido
- Una vez creado el carrito, a /OrderREST/generate se le pasan cuatro parámetros: cartId (identificador del carrito), userId (identificador del cliente), swlang (idioma (es,en, etc.)), metagroup (identificador del metagrupo), con lo que se generará el pedido, se reservará stock (o se creará una orden de compra si no hubiera stock), se generará las facturas correspondientes, etc.
- El recurso /OrderREST/generate genera un pedido en estado “En proceso” o “Pendiente de mercancía”. Si se quiere otro estado es necesario generar el pedido sin usar este recurso.
POST /OrderREST/generate
Body Form:
cartId: “bc00019261a00fd” ← Obligatorio. Identificador del carrito (ShoppingCartsREST)
userId: “cw5ceeecf5cebd9” ← Obligatorio. Identificador del usuario (ContactREST)
swlang: “es” ← Obligatorio. Idioma de las notificaciones
metagroup: “cw5ced461c0d4af”. ← Obligatorio.
Si el artículo del carrito no tuviera los precios indicados, o se desea modificar los totales en vez de que el sistema los obtenga de los artículos del carrito habría que indicarlos con los siguientes parámetros:
orderTotalDiscount: “10” <-- Valor real del descuento total del pedido. Cero si no hay descuento.
orderBasePrice: “100” <-- Precio base total del pedido sin impuestos. Subtotal
orderTotalTax: “21” <-- Importe de los impuestos aplicables al pedido.
orderTotalSurcharge: “0” <-- Importe de recargo de equivalencia total
orderTotalPrice: “121” <-- Total con impuestos ya sumados.
orderType: “cw5f3a93ae273da” ← Opcional. Tipo de pedido. Si no se indica en la petición el sistema buscará el tipo de pedido “web”.
Si se está generando un pedido que corresponde al cliente de un cliente es necesario también indicar el identificador del cliente:
userId: “cw5ceeecf5cebd9” ← Obligatorio. Su valor corresponderá con el cliente.
idClientOfClient: “cw622208040b6ab” ← Será el identificador del cliente de userId
Respuesta:

Estados disponibles en los pedidos
Estado | Value |
Pendiente de pago | 0 |
Pendiente de mercancía | 4 |
En proceso | 3 |
En preparación | 5 |
Preparado | 6 |
Enviado | 7 |
Entregado | 9 |
Opciones de transporte
Compañías de transporte
GET /ShippingCompanyREST/{format}/{id}
PUT /ShippingCompanyREST/{format}
Servicios de transporte
GET /ShippingServiceREST/{format}/{id}
PUT /ShippingServiceREST/{format}
Webhooks
El listado de web hooks es el siguiente:
WEBHOOKS ASOCIADOS A OBJETOS
- AddressesDelete - BCCompanyAddresses - Borrar
- AddressesInsert - BCCompanyAddresses - Inserción
- AdressesModify - BCCompanyAddresses - Modificación
- ArticlesDelete - Articles - Borrar
- ArticlesInsert - Articles - Inserción
- ArticlesModify - Articles - Modificación
- ArticleStocksDelete - ArticleStocks - Borrar
- ArticleStocksInsert - ArticleStocks - Inserción
- ArticleStocksModify - ArticleStocks - Modificación
- CompaniesDelete - Companies - Borrar
- CompaniesInsert - Companies - Inserción
- CompaniesModify - Companies - Modificación
- ContactsDelete - Contacts - Borrar
- ContactsInsert - Contacts - Inserción
- ContactsModify - Contacts - Modificación
- OrdersInsert - Orders - Inserción
- OrdersModify - Orders - Modificación
- PurchaseOrdersInsert - PurchaseOrders - Inserción
- PurchaseOrdersModify - PurchaseOrders - Modificación
- RateExceptionsDelete - RateExceptions - Borrar
- RateExceptionsInsert - RateExceptions - Inserción
- RateExceptionsModify - RateExceptions - Modificación
- RMAInsert - RMA - Inserción
- RMAModify - RMA - Modificación
- OrdersChangeStatus - Orders - Cambio de valor en campo status
- PurchaseOrdersChangeStatus - PurchaseOrders - Cambio de valor en campo status
- RMAChangeStatus - RMA - Cambio de valor en campo status
- WorkOrdersChangeStatus - WorkOrders - Cambio de valor en campo status
- TraceabilityInsert - Traceability - Inserción
Respuesta
La llamada al URL es de tipo POST y se incluyen los siguientes parámetros:
- object: nombre del objeto que ha desencadenado la llamada
- objectid: valor de la clave primaria para dicho objeto
- event: evento que ha desencadenado la llamada. Valores: I para inserción, M para modificación, D para borrado, F para cambio de valor en campo
- Sólo si el evento es de tipo F:
- field: nombre del campo asociado al evento
- fieldBefore: valor del campo antes de modificar
- fieldAfter: valor del campo después de modificar
- Sólo si el evento es de tipo F:
Proceso para obtener el stock disponible desde los webhooks
Webhook OrdersModify, OrdersChangeStatus:
Con el identificador que recibes haces una consulta a GET /OrdersArticleREST/byOrder/{format}/{idOrder} para obtener los artículos (también podrías hacer la misma consulta usando POST /OrdersArticleREST/{format} y {idOrder} y su valor en el body del formulario). Con los artículos haces una petición por artículo a GET /ArticleStockREST/availables/{format}/{idArticle}/{idStore} para obtener el stock disponible de esos artículos. El {idArticle} sería el campo {id}, y el {idStore} el campo {idStore} que te devuelve /OrdersArticleREST/byOrder.
Webhook TraceabilityInsert:
El identificador que recibes corresponde al endpoint /ecomTraceabilityREST, por tanto tendrás que llamar primero a este endpoint con el identificador recibido GET /ecomTraceabilityREST/{format}/{id} con lo que obtendrás el registro de la trazabilidad con el mensaje de qué a cambiado. Para obtener el artículo usamos el campo {idParent} devuelto en la petición anterior para consultar el registro de stock en el endpoint GET /ArticleStockREST/{format}/{id}, en el que tendrémos los campos {idArticle} e {idStore} para usarlos en el endpoint GET /ArticleStockREST/availables/{format}/{idArticle}/{idStore}.
Webhook WorkOrdersChangeStatus:
El identificador que recibes es el de una orden de trabajo de tipo entrada. Lo primero que hay que hacer es obtener los códigos de barras entrados a través de GET /WorkOrderSSNREST/workOrder/{format}/{id}. Con el valor del campo {fkSN} de cada registro obtenido consultamos el artículo y almacén al que corresponde a través de GET /ArticleStockREST/{format}/{id}, que nos devolverá el registro con el {idArticle} e {idStore} que podrás pasar a GET /ArticleStockREST/availables/{format}/{idArticle}/{idStore} para obtener los disponibles.
Conocer los movimientos de stock de un artículo
En cualquier momento puedes consultar /ecomTraceabilityREST para obtener el listado de cambios que se hayan realizado en el stock de un artículo a través de POST /ecomTraceabilityREST/{format} y en el body indicar la clave {idParent} con el valor del id del artículo a consultar.
Multicliente
De cara a trabajar con varios clientes dentro de Yunbit tenemos que tener en cuenta los siguientes factores.
IDs a crear
- Categorías de empresas:
- CLIENTETEAMTODAY_PROPIA
- CLIENTETEAMTODAY
- CLIENTETEAMTODAY_B2C
- CLIENTETEAMTODAY_ECI
- CLIENTETEAMTODAY_ECI_WEB
- BYNIUMA
- CORNERS BYNIUMA
- MULTIMARCA TRUCCO Y NAELLE
Ya están creadas recuerda poner | al principio y al final.
- Tipos de pedidos:
- PROPIA_BYNIUMA = cw6155c7aeb0786
- MULTIMARCA = Este ya existe y el ID es cw614459fa9a119
- B2C_BYNIUMA = cw6155c7dc63a9a
- ECI_BYNIUMA = cw6155c86b4027c
- ECIWEB_BYNIUMA = cw6155c77f8e4d5
- Compañías de transporte:
- SEUR
- DHL
- Servicios de transporte:
- SEUR Normal…
Empresas
Si tiene albarán personalizado indicar el siguiente ID en el campo idProposalTemplateAlbaran como se indica en la sección Albaranes de Empresas
Artículos
En la inserción de artículos comunicamos el cliente relacionado con el artículo en el campo fkClient, el campo debe estar relleno con el id de la empresa en Yunbit. En el endpoint de Artículos Maestros.
Los artículos actuales hay que vincularlos a GJB, dinos si lo haces tu o lo hacemos nosotros.
Pedidos
En la inserción de pedidos comunicamos el cliente relacionado con el pedido en el campo “idClientOfClient”
En el endpoint de Órdenes de Compra
OCOs
En la inserción de OCOs comunicamos el cliente relacionado con la OCO en el campo “idClient”
En el endpoint de Órdenes de Compra
Añadir etiquetas no generadas en Yunbit
Para poder añadir etiquetas se tendra que una peticion PUT a https://cloud.yunbit.es/eCommerce/ShippingLabelREST/JSON con los siguientes parametros en el cuerpo:
'idOrder' : Identificador del pedido.
'type' : formato de la etiqueta (ZPL, PDF, TPL)
'documentum' : Fichero pasado a base64 de ( PDF, ZPL, TPL)
‘fileName’: Nombre de la etiqueta con su extensión.
API endpoint: EntitiesLoaderREST (Cargador de entidades)
Se puede utilizar para cargar cualquier objeto disponible en el cargador de entidades

Formato de la petición
El formato de entrada debe ser un objeto JSON con la siguiente información
- object: Nombre de uno de los objetos disponibles.
- action: Una de las acciones disponibles
- map: Nombre del mapa a cargar previamente creado en el cargador de entidades para el objeto de la petición.
- entities: Array de objetos JSON con las líneas a insertar, en el orden que se establezca en el mapa.
Objetos disponibles:
- Artículos, fabricantes y proveedores: ARTICLE_OBJ
- Pedidos: ORDERS_OBJ
- Stock y ubicaciones: STOCKLOCATION_OBJ
- Empresas y contactos: CLIENTS_OBJ
- Paises, provincias y ciudades: LOCATION_OBJ
- Usuarios y empleados: USER_OBJ
- Empleados - horas extra: EmployeesOvertime_OBJ
- Empleados - horas a disfrutar: EmployeesRecoveredHours_OBJ
- Facturas de gasto: INVOICESRECEIVED_OBJ
- Órdenes de compra: PURCHASE_ORDERS_OBJ
Acciones disponibles:
- update: Modifica los registos existentes, NO inserta el registro si no está
- upsert: Modifica los registos existentes, e inserta los que no existen
Formato de la respuesta
- "status":true si el proceso se realizó correctamente, false en caso contrario.
- "message": mensaje de error en caso de haberlo.
- "ids": array con los ids de las órdenes de compra insertadas o modificadas.
Ejemplo del proceso
Ejemplo de la petición:
curl --location 'http://{servicio}/cloud/EntitiesLoaderREST' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic {autorizacion}' \ --data '{ "object": "PURCHASE_ORDERS_OBJ", "action": "upsert", "map": "Prueba", "entities": [ { "userName": "PRUEBA", "userNameAction": "PRUEBA", "relatedClientSocialName": "PRUEBA", "providerClientNum": "12435", "providerSocialName": "Proveedor", "providerName": "Proveedor", "purchaseOrderDocumentNumber": "OCOTEST-001", "userNameAction": "PRUEBA", "providerContactName": "PRUEBA", "purchaseOrderDate": "2024-04-11 07:16:11", "purchaserOrderWayToPay": "0", "conceptUnits": 1, "conceptDeliveryDate": "2024-04-11 07:16:11", "articlePartNumber": "PNTEST", "articleName": "TEST", "articleCondition": "Nuevo", "articleVat": "Exento", "articleMeasurementUnit": "UDS", "articleDefaultStore": "PUERTO", "serialNumber": "11111", "articleBarcode": "barcode2" }, { "userName": "PRUEBA", "userNameAction": "PRUEBA", "relatedClientSocialName": "PRUEBA", "providerClientNum": "12435", "providerSocialName": "Proveedor", "providerName": "Proveedor", "purchaseOrderDocumentNumber": "OCOTEST-002", "userNameAction": "PRUEBA", "providerContactName": "PRUEBA", "purchaseOrderDate": "2024-04-11 07:16:11", "purchaserOrderWayToPay": "0", "conceptUnits": 1, "conceptDeliveryDate": "2024-04-11 07:16:11", "articlePartNumber": "PNTEST2", "articleName": "TEST 2", "articleCondition": "Nuevo", "articleVat": "Exento", "articleMeasurementUnit": "UDS", "articleDefaultStore": "PUERTO", "serialNumber": "2222", "articleBarcode": "barcode2" } ] }'
Ejemplo de un posible mapa para la petición anterior:
Al terminar el mapa se debe guardar y ponerle un nombre que es el que después se utilizara en la petición

Ejemplo de la respuesta dada:
{ "status": true, "message": null, "ids":[ "cwe257a84ff3250", "cw4566418ec8c59" ] }