Sistema B2B profesional para Magento 2 Open Source
- SKU
- M2-B2B
Descripción / Sistema B2B profesional para Magento 2 Open Source
MAGENTO 2 · MAGENTO OPEN SOURCE · EMPRESAS · COMERCIO B2B
Conecta la venta B2B y B2C en una única instalación de Magento.
Kowal B2B Suite
Desarrolla un portal para clientes profesionales con empresas, roles, precios, catálogos, RFQ, límites, documentos e integraciones. Activa la lógica B2B para los website seleccionados y adapta el proceso a tus reglas comerciales.
16 módulos y tema · Website scope · REST y GraphQL
CÓMO FUNCIONA EN LA PRÁCTICA
01 · Defines el modelo comercial
Defines empresas, canales, precios y fuentes de datos.
02 · Configuras el proceso B2B
Asignas roles, catálogo, condiciones y aprobaciones.
03 · Conectas sistemas e implementas
Seleccionas adaptadores y compruebas escenarios completos.
¿Qué gana tu tienda?
Conoce las funciones, el uso y los ajustes del módulo.
Conoce el módulo
KOWAL B2B SUITE · MAGENTO 2 OPEN SOURCE
Sistema B2B profesional sin migrar a Adobe Commerce
Kowal B2B Suite amplía Magento 2 Open Source con funciones necesarias para la venta mayorista y contractual.
Gestiona empresas, usuarios, precios individuales, pedidos rápidos, límites de crédito comercial, aprobaciones, ofertas, documentos e integraciones en un único entorno Magento.
Empresas y roles · Precios y catálogos · RFQ · Crédito comercial · Documentos · Integraciones
Venta B2B adaptada a tus reglas comerciales
Cada cliente profesional puede recibir sus propios precios, catálogo, condiciones de pago, límites y usuarios con distintos permisos.
El sistema admite tanto un modelo mayorista sencillo como procesos de compra avanzados con aprobación en varias etapas e integración con ERP, PIM, WMS o CRM.
Áreas clave de la plataforma B2B
Traslada la gestión diaria de clientes profesionales desde correos, hojas de cálculo y acuerdos manuales directamente a Magento.
Empresas, usuarios y roles de compra
Una empresa puede tener muchos usuarios, direcciones y personas responsables de las compras. Los roles determinan quién puede realizar pedidos, aprobarlos o consultar datos.
Precios y catálogos individuales
Cada cliente profesional puede recibir su propio catálogo, precios contractuales, tramos por cantidad y reglas de compra. El cliente ve la oferta destinada a su empresa.
Pedidos rápidos y listas de compra
Los clientes pueden realizar grandes pedidos de forma eficiente por SKU, utilizar listas de compra e importar posiciones en lugar de buscar cada producto por separado.
RFQ, ofertas y aprobaciones
El proceso de oferta puede incluir precios negociados, fecha de validez y condiciones individuales. Los pedidos pueden pasar por una aprobación dependiente del valor o del rol del usuario.
Control financiero sin trabajar en hojas de cálculo
Los límites de crédito comercial, el uso del crédito y los plazos de pago ayudan a controlar la venta con pago aplazado.
El cliente tiene acceso a documentos, y el equipo ve las condiciones comerciales y el estado del proceso en un único lugar.
Documentos en el portal del cliente
- facturas y abonos,
- albaranes y confirmaciones,
- ofertas PDF,
- documentos desde Magento o desde el sistema ERP.
¿Cómo es la implementación?
La plataforma puede implementarse por etapas. Primero ordenamos las reglas comerciales, después las reflejamos en Magento y las integramos con los sistemas de la empresa.
1. Modelo de venta
Definimos clientes, canales, tarifas, pagos, restricciones y fuentes de datos.
2. Reglas para empresas
Configuramos usuarios, precios, catálogo, direcciones, límites y roles de compra.
3. Proceso de compra
Implementamos pedidos rápidos, ofertas, aprobaciones, documentos y reglas de checkout.
4. Integraciones y pruebas
Conectamos ERP, PIM, WMS o CRM, probamos escenarios y preparamos al equipo para trabajar.
Integraciones con los sistemas de la empresa
Los datos de clientes, precios, productos, pedidos y documentos pueden intercambiarse con ERP, PIM, WMS, CRM, EDI y sistemas de compra de los clientes profesionales.
La sincronización puede incluir límites de crédito comercial, condiciones de pago, estados de pedidos y documentos. El historial de tareas y errores facilita el control del proceso.
B2B que crece con el negocio
Kowal B2B Suite es una solución para mayoristas, distribuidores, fabricantes y empresas que realizan ventas contractuales.
Puedes empezar con empresas, precios y catálogo, y después ampliar la plataforma con pedidos rápidos, RFQ, límites, aprobaciones, documentos e integraciones.
Un Magento. Un catálogo. Un proceso de venta B2C y B2B.
Un paquete, arquitectura modular
kowal/metapackage-b2b-suite proporciona los archivos de 16 módulos B2B y del tema frontend/Kowal/b2b. El paquete principal los registra en autoload y sustituye los nombres de los subpaquetes, por lo que la instalación de la suite no requiere un repositorio independiente para cada módulo.
La implementación está diseñada para Magento Open Source 2.4.9 y PHP 8.3. El alcance de los módulos activados, la compatibilidad del tema y los escenarios del proceso deben verificarse en la instalación de destino.
Website y modelo de acceso de empresa
Las funciones B2B actúan en el contexto del website_id seleccionado. La empresa debe tener una relación activa con ese canal, y los roles determinan el acceso a compras, usuarios, ofertas y documentos.
El primer modelo de empresa presupone un único website asignado. La venta B2C puede utilizar la misma instalación, pero la activación B2B y el acceso de las empresas permanecen separados mediante la configuración de canales.
Quick Order, aprobaciones e implementación por etapas
El pedido rápido comprueba SKU, cantidad, asignación al website, visibilidad para la empresa y precio B2B. Las listas de compra y los logs de importación ayudan a gestionar pedidos recurrentes.
Las reglas de approval tienen en cuenta la empresa, el website, la moneda y el umbral. El request pending actual se cierra con la decisión approve, reject o cancel. El flujo en varias etapas debe acordarse y verificarse como alcance concreto de la implementación.
Documentos y acceso seguro
Los documentos están asignados a una empresa y a un website. Los archivos PDF se encuentran en var/kowal_b2b_documents y se descargan mediante un controlador que verifica el acceso.
La fuente puede ser Magento Sales o el modo híbrido Magento + API. El paquete incluye documentos de pedidos, facturas, envíos y abonos, así como un renderer PDF común; la sincronización de documentos desde un sistema externo requiere el adaptador adecuado.
Las integraciones requieren adaptadores y fuentes de datos
La capa Integration proporciona perfiles, mapeo de identificadores, tareas, retry, logs y dead letter queue. Un ERP, PIM, WMS o CRM concreto se conecta mediante un adaptador que implementa SyncAdapterInterface.
Antes de empezar, define la fuente de verdad para empresas, precios, stocks, pedidos y documentos. REST y GraphQL son puntos de integración; la instalación del paquete no conecta automáticamente todos los sistemas de la empresa.
Instalación mediante Composer
Paquete kowal/metapackage-b2b-suite, módulo Kowal_B2BBase. Tras configurar el acceso al repositorio Kowal, instala el paquete, activa el módulo, actualiza Magento y limpia la cache. En producción, incluye la compilación y el despliegue de contenido estático conforme al proceso de la tienda.
De la configuración al resultado
1. Defines el modelo comercial
Defines empresas, canales, precios y fuentes de datos.
2. Configuras el proceso B2B
Asignas roles, catálogo, condiciones y aprobaciones.
3. Conectas sistemas e implementas
Seleccionas adaptadores y compruebas escenarios completos.
Portal de pedidos para el cliente profesional
La empresa está asignada al website B2B activo. Su usuario utiliza el catálogo y el precio conforme a las condiciones acordadas, añade posiciones por SKU y realiza el pedido.
Según la configuración, el proceso tiene en cuenta el límite y la aprobación. Los documentos y las integraciones permanecen vinculados a la empresa y al canal de venta correspondiente.
Planifica una implementación B2B adaptada a la empresa
¿Quieres adaptar el módulo a tu tienda? Pregunta por la implementación de Kowal B2B Suite y comenta la configuración o las extensiones necesarias.
Más Información
| Conformidad con la plantilla | Luma / Blank, KOWAL |
|---|
Configuración de la integración
Kowal B2B API — documentación REST completa
Versión del contrato:
V1· Fuente de verdad:Kowal_B2BApi/etc/webapi.xml· Destinatarios: administradores de tiendas, partners de implementación y equipos que integran ERP, PIM, WMS o sistemas de compra.
1. Finalidad y límites de la API
Kowal B2B API expone datos y procesos B2B que funcionan en Magento 2: empresas, catálogo y precios individuales, compras rápidas, documentos, límite de crédito comercial, aprobaciones, RFQ y colas de integración. Es una REST API para integraciones de sistemas; no sustituye los endpoints estándar de Magento para catálogo, carrito, checkout y cuenta de cliente.
El documento describe únicamente los endpoints expuestos actualmente por el módulo. No promete operaciones que el contrato V1 no ofrece, por ejemplo creación de pedidos por REST, CRUD de tarifas o edición de configuración de website.
2. Obtención de acceso y normas de colaboración
2.1. Proceso de puesta en marcha de la integración
- El integrador comunica al administrador de la tienda el objetivo de la integración, entorno (pruebas/producción), sistema fuente, alcance de datos y lista de áreas API requeridas.
- El administrador crea o configura la integración Magento, le asigna permisos ACL mínimos y transmite por un canal seguro:
baseUrl, token,websiteId,companyIdcuando proceda, moneda y datos de prueba. - El integrador ejecuta la prueba
GET /V1/kowal-b2b/websites/:websiteId/configy después pruebas funcionales en el entorno de pruebas. - Antes de producción, ambas partes acuerdan el calendario de sincronización, tamaño máximo de datos, retry, propietario de los datos y método de notificación de errores.
- Los tokens se guardan únicamente en un vault de secretos; el administrador los rota o revoca ante un cambio de proveedor, usuario o alcance de integración.
2.2. Responsabilidades
| Parte | Responsabilidad |
|---|---|
| Administrador de la tienda | Configuración del website B2B, empresa y relación de la empresa con el website, token y ACL; entrega de datos de prueba; decisión sobre acceso a datos. |
| Integrador | Almacenamiento seguro del token, uso correcto del contexto websiteId/companyId, validación de datos, gestión de errores y reintentos, no divulgación de datos de otras empresas. |
| Propietario del proceso de negocio | Acuerdo sobre la fuente de verdad para precios, documentos, RFQ, límites y estados de sincronización. |
No se debe usar el token de administrador en una aplicación cliente ni compartir un único token entre sistemas independientes. Cada integración debe tener su propio token y solo las ACL necesarias.
2.3. Permisos
Magento verifica el token Bearer y las ACL asignadas al usuario administrativo o a la integración. Los endpoints B2B requieren uno de los siguientes grupos de permisos:
| ACL | Alcance |
|---|---|
config | Websites y feature flags |
companies, company_save, company_users, batch | Empresas, sus usuarios e importación por lotes de empresas |
products, prices, catalog_permissions | Catálogo, disponibilidad, precios y visibilidad |
import_export, quick_order, documents | Perfiles de importación/exportación, listas de compra y documentos |
credit_limits, approvals, orders, quotes | Límite, workflow de aprobación, contexto de pedidos y RFQ |
system_integrations | Perfiles, mapeos y jobs de integración |
El alcance debe derivarse de la finalidad de la integración. Ejemplo: un sistema de compra suele necesitar products, prices, catalog_permissions, quick_order y quotes; un ERP que gestiona documentos — documents y, si es propietario de la sincronización, system_integrations.
3. Convenciones técnicas
Dirección, cabeceras y parámetros
La dirección base tiene el formato https://b2b.example.com/rest/V1. Todas las rutas posteriores en el documento se indican desde /V1; la dirección completa del endpoint es BASE_URL + ruta.
Authorization: Bearer Accept: application/jsonContent-Type: application/json La API usa JSON. Los nombres en URL son camelCase (websiteId, companyId) y los campos JSON corresponden a los nombres de parámetros de los contratos Magento. :companyId, :quoteId, :sku, etc. son parámetros de ruta. En los ejemplos, ? indica un parámetro opcional.
websiteId es obligatorio en operaciones dependientes del canal de venta. Debe indicar un website existente con B2B activado. companyId indica una empresa que debe tener una relación activa con ese website cuando la operación funciona en su contexto. La API no selecciona website ni empresa predeterminados.
Request body e idempotencia
Magento serializa el objeto DTO bajo el nombre del parámetro del método: la mayoría de escrituras acepta {'request': {...}}; la creación de empresa usa {'company': {...}}; el batch de empresas — {'companies': [...]}. Los endpoints con argumentos simples aceptan campos sin wrapper, por ejemplo {'websiteId': 1, 'currency': 'PLN', 'items': [...]}.
La cabecera Idempotency-Key (máx. 128 caracteres) actualmente está soportada por POST /companies: un reintento con la misma clave devolverá la empresa creada previamente. Para un job de integración usa el campo request.idempotencyKey. No asumas idempotencia automática de otros endpoints de escritura; reinténtalos solo después de determinar el estado de la operación.
Respuestas y errores
Las respuestas de éxito son objetos o arrays de contratos Magento. Los campos devueltos por los objetos pueden ampliarse de forma compatible; la integración debe ignorar campos desconocidos. Un error de negocio puede contener:
{ 'code': 'b2b.company.not_assigned_to_website', 'message': 'B2B company is not assigned to website.', 'website_id': 1, 'trace_id': 'request-correlation-id', 'details': {'company_id': 10}, 'field_errors': []}| HTTP | Significado | Reacción del integrador |
|---|---|---|
400 / 422 | Datos incorrectos o validación de dominio | Corrige los datos; no reintentes sin cambiar el payload. |
401 / 403 | Token/ACL ausente o insuficiente | No reintentes; comunica al administrador el alcance del token. |
404 | El recurso o la relación no existe en el contexto dado | Verifica identificadores y contexto del website. |
409 | Conflicto de estado o duplicado | Lee el estado actual antes de decidir un reintento. |
5xx / timeout | Error técnico | Aplica retry limitado con backoff y conserva trace_id. |
No registres tokens, datos personales completos ni secretos de configuración. La incidencia al equipo de la tienda debe incluir hora, método, ruta sin secretos, estado HTTP, trace_id y payload anonimizado.
4. Esquemas de datos de entrada
Los siguientes esquemas son comunes para los endpoints de referencia. Un campo sin ? es obligatorio por contrato; ? indica un valor opcional. Los campos metadata, config, configuration y payload son objetos JSON.
| DTO / wrapper | Campos |
|---|---|
company | websiteId, name, taxId, externalId?, status?, salesRepresentativeId?, customerGroupId?, websiteActive? |
companyUser | websiteId, roleId, active |
request — RFQ | websiteId, companyId, customerId?, externalId?, title, currency, validUntil?, customerNote?, salesNote?, metadata? |
request — posición RFQ | quoteId, sku, productId?, name?, qty, requestedPrice?, offeredPrice?, comment?, metadata? |
request — decisión RFQ | customerId?, adminUserId?, message? |
request — comentario RFQ | quoteId, customerId?, adminUserId?, authorType, message, visibleForCustomer |
request — documento | websiteId, companyId, orderId?, orderIncrementId?, invoiceId?, invoiceIncrementId?, creditmemoId?, creditmemoIncrementId?, externalId?, documentNumber, documentType, status, issueDate?, dueDate?, grandTotal?, currency?, metadata? |
request — archivo de documento | documentId, fileName, filePath, mimeType, fileSize, checksum?, primary |
request — límite | websiteId, companyId, termsId?, creditLimit, currency, active, status, metadata? |
request — exposición del límite | websiteId, companyId, sourceType, sourceId, sourceIncrementId?, amount, currency, dueDate?, metadata? |
request — condiciones de pago | websiteId, code, name, daysDue, active, description? |
request — regla de aprobación | websiteId, companyId, name, thresholdAmount, currency?, priority, active, metadata? |
request — aprobador | ruleId, customerId, sortOrder, active |
request — decisión de aprobación | approverCustomerId?, comment? |
request — solicitud de aprobación | websiteId, companyId, orderId?, orderIncrementId?, requesterCustomerId?, grandTotal, currency, comment?, metadata? |
request — perfil import/export | websiteId, code, name, direction, entityType, format, behavior, active, configuration? |
request — perfil de integración | websiteId, code, name, systemType, adapterCode, direction, active, maxAttempts, config? |
request — mapeo | websiteId, systemType, entityType, localId, externalId, metadata? |
request — job de integración | profileId, direction?, entityType, operation, idempotencyKey?, maxAttempts?, payload?, scheduledAt? |
5. Referencia de endpoints
En las tablas, ACL indica el recurso mínimo de permiso Magento. Resultado define el tipo de respuesta de éxito.
5.1. Websites y configuración
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /V1/kowal-b2b/websites | config | — | Array de website (websiteId, código, nombre, flag B2B). Obténlo antes de configurar la integración. |
GET /V1/kowal-b2b/websites/:websiteId/config | config | path: websiteId | Configuración B2B del website (entre otros enabled/debug/retención de logs). Ejecútalo como prueba de acceso. |
GET /V1/kowal-b2b/websites/:websiteId/features | config | path: websiteId | Feature flags activas para el website; úsalo para activar funciones del cliente de forma condicional. |
5.2. Empresas y usuarios de empresa
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /companies?websiteId= | companies | query: websiteId | Array de empresas asignadas al website. |
POST /companies | company_save | body: company | Crea una empresa y relación con el website; usa Idempotency-Key en reintentos. Devuelve la empresa. |
POST /companies/batch | batch | body: companies — array de company | Crea varias empresas y devuelve el resultado por elemento, incluidos errores. |
GET /companies/:companyId?websiteId= | companies | path: companyId; query: websiteId | Empresa verificada en el contexto del website. |
PUT /companies/:companyId | company_save | path: companyId; body: company | Actualiza los datos y la relación de la empresa para company.websiteId. |
POST /companies/:companyId/activate?websiteId= | company_save | path: companyId; query: websiteId | Activa la empresa en el website indicado y devuelve la empresa. |
POST /companies/:companyId/block?websiteId= | company_save | path: companyId; query: websiteId | Bloquea la empresa en el website indicado y devuelve la empresa. |
GET /companies/:companyId/users?websiteId= | company_users | path: companyId; query: websiteId | Array de asignaciones de clientes a la empresa. |
PUT /companies/:companyId/users/:customerId | company_users | path: companyId, customerId; body: companyUser | Asigna/actualiza el rol y la actividad del cliente en la empresa; devuelve la asignación. |
5.3. Productos, precio y visibilidad del catálogo
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /products?websiteId= | products | query: websiteId | Array de productos Magento básicos para el website. |
GET /products/:sku?websiteId= | products | path: sku codificado; query: websiteId | Producto (id, sku, nombre, tipo, estado, websites). |
GET /products/:sku/availability?websiteId= | products | path: sku; query: websiteId | Disponibilidad y cantidad vendible MSI para el SKU. |
GET /products/:sku/b2b-status?websiteId= | products | path: sku; query: websiteId | Estado B2B: asignación al website, traducciones y datos stock. |
GET /reports/products/missing-translations?websiteId= | products | query: websiteId | Informe de SKU sin traducciones requeridas, con reason/details. |
GET /reports/products/missing-stock?websiteId= | products | query: websiteId | Informe de SKU sin datos stock requeridos. |
GET /companies/:companyId/products/:sku/price?websiteId=¤cy=&qty= | prices | path: companyId, sku; query: websiteId, currency, opc. qty (por defecto 1) | Explicación del precio correspondiente para empresa, moneda y cantidad; consúltalo antes de comprar. |
GET /companies/:companyId/products/:sku/visibility?websiteId= | catalog_permissions | path: companyId, sku; query: websiteId | Resultado de visibilidad/compra del SKU para la empresa. |
GET /companies/:companyId/catalog-visibility?websiteId= | catalog_permissions | path: companyId; query: websiteId | Array de posiciones del índice de catálogo visible de la empresa. |
POST /companies/:companyId/catalog-visibility/reindex?websiteId= | catalog_permissions | path: companyId; query: websiteId | Reconstruye el índice y devuelve el número de posiciones indexadas. Operación administrativa. |
5.4. Importación y exportación de archivos
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /import-export/profiles?websiteId= | import_export | query: websiteId | Array de perfiles de importación/exportación del website. |
POST /import-export/profiles | import_export | body: request — perfil import/export | Guarda el perfil y devuelve sus datos. |
POST /import-export/import/:profileId?sourceFile=&dryRun= | import_export | path: profileId; query: sourceFile, opc. dryRun=false | Inicia la importación del archivo indicado en el entorno Magento; devuelve job. No envía multipart. |
POST /import-export/export/:profileId?resultFile= | import_export | path: profileId; opc. query: resultFile | Crea job de exportación, opcionalmente con ruta de archivo de destino. |
GET /import-export/jobs?websiteId= | import_export | query: websiteId | Array de jobs import/export para el website. |
GET /import-export/jobs/:jobId | import_export | path: jobId | Estado, resultado y datos de un job individual. |
GET /import-export/jobs/:jobId/logs | import_export | path: jobId | Logs de diagnóstico del job. |
5.5. Pedido rápido y listas de compra
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
POST /companies/:companyId/quick-order/validate | quick_order | path: companyId; body: websiteId, currency, items (sku, qty) | Valida múltiples SKU en el contexto de la empresa: disponibilidad, visibilidad y precio; devuelve resultado agregado. |
GET /companies/:companyId/shopping-lists?websiteId= | quick_order | path: companyId; query: websiteId | Array de listas de compra de la empresa. |
POST /companies/:companyId/shopping-lists | quick_order | path: companyId; body: websiteId, name, opc. customerId, isDefault=false | Crea una lista de compra y la devuelve. |
GET /shopping-lists/:listId/items | quick_order | path: listId | Array de posiciones de la lista indicada. |
POST /shopping-lists/:listId/items | quick_order | path: listId; body: currency, items (sku, qty) | Añade posiciones a la lista y devuelve las posiciones guardadas. |
5.6. Documentos y archivos
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /companies/:companyId/documents?websiteId=&documentType= | documents | path: companyId; query: websiteId, opc. documentType | Documentos de la empresa, opcionalmente filtrados por tipo. |
GET /documents/:documentId?companyId=&websiteId= | documents | path: documentId; query: companyId, websiteId | Detalles del documento tras comprobar la pertenencia a la empresa. |
POST /documents | documents | body: request — documento | Crea o guarda metadatos del documento y devuelve el documento. |
POST /documents/files | documents | body: request — archivo de documento | Registra un archivo existente en el storage de Magento (nombre, ruta, MIME, tamaño), no envía binarios. |
GET /documents/:documentId/files?companyId=&websiteId= | documents | path: documentId; query: companyId, websiteId | Array de metadatos de archivos del documento. |
GET /documents/:documentId/sync-logs | documents | path: documentId | Logs de sincronización del documento; destinados a integración administrativa. |
5.7. Límite de crédito comercial y condiciones de pago
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /companies/:companyId/credit/status?websiteId=¤cy= | credit_limits | path: companyId; query: websiteId, currency | Estado del límite, uso e importe disponible de la empresa. |
POST /credit-limits | credit_limits | body: request — límite | Crea/actualiza el límite de la empresa y devuelve el límite. |
POST /credit/exposures | credit_limits | body: request — exposición | Reserva exposición del límite para una fuente, por ejemplo un pedido, y la devuelve. |
POST /credit/exposures/:exposureId/release | credit_limits | path: exposureId; opc. body: message | Libera la exposición; devuelve su estado. |
GET /payment-terms?websiteId= | credit_limits | query: websiteId | Array de condiciones de pago activas/conocidas del website. |
POST /payment-terms | credit_limits | body: request — condiciones de pago | Guarda las condiciones de pago y las devuelve. |
5.8. Workflow de aprobación
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /companies/:companyId/approval/rules?websiteId=¤cy= | approvals | path: companyId; query: websiteId, opc. currency | Reglas de aprobación de la empresa para canal/moneda. |
POST /approval/rules | approvals | body: request — regla | Crea/actualiza una regla de umbral y la devuelve. |
GET /approval/rules/:ruleId/approvers | approvals | path: ruleId | Array de aprobadores asignados, en orden sortOrder. |
POST /approval/approvers | approvals | body: request — aprobador | Guarda la asignación del cliente como aprobador. |
GET /companies/:companyId/approval/required?websiteId=&grandTotal=¤cy= | approvals | path: companyId; query: websiteId, grandTotal, currency | Boolean: si el importe requiere aprobación. |
POST /approval/requests | approvals | body: request — solicitud de aprobación | Crea request para un pedido y lo devuelve. |
GET /companies/:companyId/approval/requests?websiteId=&status= | approvals | path: companyId; query: websiteId, opc. status | Array de requests de aprobación de la empresa. |
POST /approval/requests/:requestId/approve | approvals | path: requestId; body: request — decisión | Aprueba el request; devuelve su estado actual. |
POST /approval/requests/:requestId/reject | approvals | path: requestId; body: request — decisión | Rechaza el request; devuelve su estado actual. |
POST /approval/requests/:requestId/cancel | approvals | path: requestId; body: request — decisión | Cancela el request; devuelve su estado actual. |
GET /approval/requests/:requestId/decisions | approvals | path: requestId | Historial de decisiones del request. |
5.9. Contexto B2B de pedidos
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /orders/:orderId/b2b-context | orders | path: orderId | Contexto B2B de un pedido nativo Magento individual, por ejemplo empresa, estado de aprobación, límite, exportación. |
GET /companies/:companyId/orders/b2b-context?websiteId=&approvalStatus= | orders | path: companyId; query: websiteId, opc. approvalStatus | Array de contextos de pedidos de la empresa, opcionalmente filtrado por estado de aprobación. |
5.10. RFQ y ofertas comerciales
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /companies/:companyId/quotes?websiteId=&status= | quotes | path: companyId; query: websiteId, opc. status | RFQ y ofertas de la empresa, opcionalmente por estado. |
POST /quotes | quotes | body: request — RFQ | Crea un RFQ en borrador y lo devuelve. Añade posiciones con otro endpoint. |
GET /quotes/:quoteId | quotes | path: quoteId | Detalles del RFQ/oferta. |
GET /quotes/:quoteId/items | quotes | path: quoteId | Array de posiciones RFQ. |
POST /quotes/items | quotes | body: request — posición RFQ | Añade SKU y cantidad, precio solicitado/de oferta opcional y comentario. |
GET /quotes/:quoteId/comments | quotes | path: quoteId | Comentarios RFQ. El cliente ve solo los comentarios marcados como visibles. |
POST /quotes/comments | quotes | body: request — comentario RFQ | Añade mensaje; authorType y visibleForCustomer definen autor y visibilidad. |
GET /quotes/:quoteId/history | quotes | path: quoteId | Historial de cambios de estado y eventos RFQ. |
POST /quotes/:quoteId/submit | quotes | path: quoteId; body: request — decisión RFQ | Envía el RFQ en borrador a valoración. |
POST /quotes/:quoteId/make-offer | quotes | path: quoteId; body: request — decisión RFQ | El comercial crea/envía una oferta; antes de llamar, define los precios de las posiciones. |
POST /quotes/:quoteId/accept | quotes | path: quoteId; body: request — decisión RFQ | Acepta la oferta actual. Este contrato no crea pedido REST. |
POST /quotes/:quoteId/reject | quotes | path: quoteId; body: request — decisión RFQ | Rechaza la oferta/RFQ. |
POST /quotes/:quoteId/cancel | quotes | path: quoteId; body: request — decisión RFQ | Cancela el RFQ si el estado actual lo permite. |
5.11. Perfiles y jobs de integración
| Método y endpoint | ACL | Entrada | Resultado y uso |
|---|---|---|---|
GET /integrations/profiles?websiteId=&systemType= | system_integrations | query: websiteId, opc. systemType | Perfiles de integración para el website. |
POST /integrations/profiles | system_integrations | body: request — perfil de integración | Guarda el perfil ERP/PIM/WMS, etc. y lo devuelve. |
POST /integrations/mappings | system_integrations | body: request — mapeo | Guarda el par ID local ↔ ID externo. |
GET /integrations/mappings/local?websiteId=&systemType=&entityType=&localId= | system_integrations | query: todos los parámetros requeridos | Busca el mapeo por identificador Magento. |
GET /integrations/mappings/external?websiteId=&systemType=&entityType=&externalId= | system_integrations | query: todos los parámetros requeridos | Busca el mapeo por identificador del sistema externo. |
POST /integrations/jobs | system_integrations | body: request — job | Publica un job para su ejecución; idempotencyKey identifica la operación de negocio. |
GET /integrations/jobs?websiteId=&status= | system_integrations | query: websiteId, opc. status | Array de jobs de integración. |
GET /integrations/jobs/:jobId | system_integrations | path: jobId | Estado y detalles de un job individual. |
POST /integrations/jobs/:jobId/process | system_integrations | path: jobId | Procesa el job y devuelve su estado actual. |
POST /integrations/jobs/:jobId/retry | system_integrations | path: jobId | Reintenta el job tras un error, conforme a su límite de intentos. |
GET /integrations/jobs/:jobId/logs | system_integrations | path: jobId | Logs de ejecución del job. |
GET /integrations/jobs/:jobId/errors | system_integrations | path: jobId | Errores de dominio/técnicos del job. |
6. Ejemplos de llamadas
export BASE_URL='https://b2b.example.com/rest/V1'export TOKEN='token-przekazany-przez-administratora'export WEBSITE_ID=1 COMPANY_ID=10 SKU='B2B-SKU-001' CURRENCY='PLN'# Test dostępu i konfiguracji kanałucurl -sS '$BASE_URL/kowal-b2b/websites/$WEBSITE_ID/config' \ -H 'Authorization: Bearer $TOKEN' -H 'Accept: application/json'# Cena kontraktowa firmy dla konkretnej ilościcurl -sS '$BASE_URL/kowal-b2b/companies/$COMPANY_ID/products/$SKU/price?websiteId=$WEBSITE_ID¤cy=$CURRENCY&qty=5' \ -H 'Authorization: Bearer $TOKEN' -H 'Accept: application/json'# Walidacja koszyka po SKUcurl -sS -X POST '$BASE_URL/kowal-b2b/companies/$COMPANY_ID/quick-order/validate' \ -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' \ --data '{'websiteId':1,'currency':'PLN','items':[{'sku':'B2B-SKU-001','qty':5}]}'# Utworzenie RFQcurl -sS -X POST '$BASE_URL/kowal-b2b/quotes' \ -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' \ --data '{'request':{'websiteId':1,'companyId':10,'customerId':25,'title':'Dostawa kwartalna','currency':'PLN','externalId':'ERP-RFQ-2026-001'}}'7. Escenarios de integración recomendados
Compra por SKU
- Lee la configuración del website y guarda el
websiteId,companyIdy la moneda proporcionados. - Usa quick order para la validación conjunta de SKU, cantidad, visibilidad y disponibilidad.
- Para las posiciones aceptadas, obtiene el precio desde
pricecon elqtycorrecto. - Crea un RFQ, añade posiciones y envíalas mediante
submitsi la compra requiere oferta. - Sigue el estado y el historial de RFQ; tras la aceptación, actúa según el proceso de pedido Magento acordado, porque
V1no expone endpoint de creación de order.
Documentos y liquidaciones
- Obtén la lista de documentos de la empresa, filtrando opcionalmente por
documentType. - Para el documento seleccionado, obtén los metadatos y la lista de archivos; la ruta del archivo no es automáticamente una URL pública — acuerda con el administrador de la tienda la forma de descargar el binario.
- Consulta el estado del límite antes del proceso de compra; solo una integración con ACL
credit_limitspuede gestionarlo.
Operaciones asíncronas
- Guarda el perfil de integración y los mapeos de identificadores.
- Publica un job con
idempotencyKeyde negocio y conservajobId. - Consulta el job y sus logs/errores; llama a
retrysolo tras analizar el error y eliminar su causa.
8. Lista de aceptación antes de producción
- El token tiene únicamente las ACL requeridas y no es el token de administrador utilizado por la UI.
- El integrador gestiona correctamente
401,403,404, validación422, conflicto409y timeouts. - Cada request en contexto B2B transmite el
websiteIdcorrecto, y los datos de empresa usan elcompanyIdcorrecto. - Precios, visibilidad y disponibilidad se comprueban antes de crear el proceso de compra.
- La creación de empresa usa
Idempotency-Key; los jobs de integración tienen unidempotencyKeyestable en el body. - Los logs no contienen tokens ni datos sensibles, y el procedimiento de soporte transmite
trace_id. - Las pruebas se han realizado en el entorno de pruebas con una empresa que tiene relación activa con el website B2B.
9. Compatibilidad
El contrato se versiona mediante /V1. Ampliar la respuesta con nuevos campos es compatible; el integrador debe tolerar campos desconocidos. Un cambio que elimine un campo, significado de campo o endpoint requiere una nueva versión de API. En caso de discrepancia entre el documento y la instalación operativa, prevalece el contrato activo webapi.xml de la versión correspondiente del módulo.
Instrucciones de instalación del módulo
Instalación y configuración de Kowal B2B Suite
Este manual está destinado a la persona que ha comprado Kowal B2B Suite y debe ponerlo en marcha en una instalación existente de Magento Open Source. Guía a través de dos etapas:
- instalación técnica — realizada por un desarrollador o administrador del servidor;
- configuración de negocio — realizada en el panel de Magento por el administrador de la tienda.
Antes de empezar, realiza una copia de la base de datos y de los archivos de Magento. Recomendamos hacer la primera puesta en marcha en un entorno de pruebas y solo después desplegar en producción.
1. Qué recibes y qué necesitas
Kowal B2B Suite se entrega como paquete Composer kowal/metapackage-b2b-suite. Contiene módulos B2B y el theme frontend/Kowal/b2b.
Requisitos
| Elemento | Requisito |
|---|---|
| Magento | Magento Open Source 2.4.9 |
| PHP | 8.3 |
| Composer | Composer 2 |
| Acceso al servidor | SSH y posibilidad de ejecutar bin/magento |
| Magento | catálogo, clientes, checkout, Sales, MSI y cron operativos |
posibilidad de escritura en var/ por el proceso PHP |
De Kowal recibirás:
- dirección del repositorio privado Composer — en adelante
REPOSITORY_URL; - nombre de usuario o identificador de acceso —
USERNAME; - token de acceso —
ACCESS_TOKEN; - rango permitido de versiones del paquete.
No guardes el token en el repositorio Git, en tickets ni en el historial de shell compartido con otras personas.
2. Instalación técnica
Ejecuta todos los comandos en el directorio raíz de la instalación existente de Magento, como usuario con acceso a los archivos y al comando bin/magento.
2.1. Preparación
- Asegúrate de que Magento funciona correctamente antes del cambio.
- Guarda el estado del despliegue y realiza backup de la base de datos y de los directorios
app/etc,pub/mediayvar. - En producción, activa el modo maintenance durante la actualización:
bin/magento maintenance:enable2.2. Añadir el repositorio privado
Añade el repositorio Composer de Kowal y configura los datos de acceso recibidos.
Recibirás por correo electrónico los datos de acceso al repositorio Composer, es decir, la dirección de e-mail del cliente y el token de licencia, después de la compra. También están disponibles en el panel del cliente tras iniciar sesión en kowal.store. Sustituye TWOJ_EMAIL_KLIENTA por la dirección de e-mail de tu cuenta y TWOJ_TOKEN por el token recibido. Ejecuta los comandos en el directorio raíz de Magento.
composer config repositories.kowal composer https://repo.kowal.storecomposer config http-basic.repo.kowal.store 'TWOJ_EMAIL_KLIENTA' 'TWOJ_TOKEN'Composer suele guardar las credenciales en el auth.json local; no añadas este archivo a Git.
2.3. Instalación del paquete
Instala la versión entregada con la licencia. Para la línea actual del paquete, el comando de ejemplo es:
composer require kowal/metapackage-b2b-suite:^0.2 --with-all-dependenciesDespués de descargar las dependencias, actualiza el esquema y la configuración de Magento:
bin/magento setup:upgradebin/magento cache:cleanEn modo de producción, ejecuta además:
bin/magento setup:di:compilebin/magento setup:static-content:deploy -f pl_PL en_USbin/magento cache:flushUsa solo los locale que están activos en la tienda. Si la instalación utiliza otro proceso de deployment, incorpora los comandos anteriores a su procedimiento estándar.
2.4. Verificación de la instalación
bin/magento module:status | grep Kowalbin/magento indexer:statusEn el panel de administración debería aparecer el menú B2B y la pestaña Stores > Configuration > Kowal > B2B. Si no aparecen, comprueba el resultado de setup:upgrade, la cache y los roles ACL del usuario administrador.
2.5. Permisos de archivos PDF
Los PDF generados por B2B utilizan mPDF y directorios bajo var/, incluidos var/tmp/kowal_b2b_mpdf y var/kowal_b2b_documents. El proceso PHP debe poder crearlos y escribir en ellos. La falta de estos permisos se manifiesta como un error al generar el documento o el PDF.
Tras finalizar el despliegue en producción, desactiva maintenance:
bin/magento maintenance:disable3. Configuración de la estructura de la tienda B2B
3.1. Website y store view
La suite funciona en el ámbito de website, no de forma global. Puedes gestionar B2C y B2B en la misma instalación de Magento, pero B2B debería funcionar en un website independiente o en un website de venta empresarial elegido de forma consciente.
- En Stores > Settings > All Stores, crea o selecciona el website B2B, su store y su store view.
- Recuerda el
website_id: lo utilizan empresas, precios, documentos, API e integraciones. - En Content > Design > Configuration, asigna el theme
frontend/Kowal/b2bsolo al B2B store view. - Comprueba que las monedas activas, impuestos, métodos de envío y métodos de pago estén configurados para el mismo scope.
No asignes el theme B2B al store view B2C si no quieres cambiar su capa de presentación. La mera instalación de los módulos no activa la lógica B2B para todos los website.
3.2. Activación de B2B
- Abre Stores > Configuration > Kowal > B2B.
- En el conmutador de scope, elige el Website correcto.
- En la sección General, establece Enable B2B en
Yes. - Durante la implementación puedes activar Debug Mode; desactívalo después de las pruebas.
- En el scope Default Config, define el periodo de retención de logs.
- Guarda la configuración y limpia la cache.
Tras la activación, todos los store view pertenecientes a ese website se tratan como B2B. Una empresa sin relación activa con ese website no obtendrá acceso a él.
3.3. Datos del vendedor
Completa los datos de la empresa vendedora en Stores > Configuration > General > Store Information: nombre, dirección, teléfono y NIF. Se utilizan en documentos y PDF RFQ. Completa también la dirección de e-mail general del remitente en la configuración de Sales Emails y el logo de e-mail si debe aparecer en los PDF.
4. Configuración del primer cliente B2B
Aplica el siguiente orden para cada empresa. Ayuda a evitar situaciones en las que el cliente tiene cuenta, pero no ve la oferta o no puede pasar por checkout.
4.1. Empresa, personas y direcciones
- Abre B2B > Companies y crea una empresa.
- Introduce el nombre, NIF, identificador externo si la empresa se sincroniza con ERP, estado
Activey asignación al website B2B. - Añade un usuario de empresa o asigna un cliente Magento existente. Asígnale el rol correcto y activa la asignación.
- En B2B > Company Addresses, añade las direcciones de la empresa; marca la dirección de facturación y envío predeterminada para el website B2B.
- En B2B > Company Contacts, añade un contacto principal activo con e-mail y teléfono.
La dirección de facturación y el contacto principal también se utilizan en el PDF RFQ. La falta de datos no bloquea el PDF, pero el documento será menos completo.
4.2. Roles de empresa
Concede a los usuarios solo los permisos necesarios. Una división típica es:
| Rol | Tareas de ejemplo |
|---|---|
| Administrador de empresa | usuarios, roles, direcciones, documentos e historial de la empresa |
| Comprador | catálogo, pedido rápido, carrito, RFQ y pedidos |
| Aprobador | decisiones en el workflow de aprobación |
| Contabilidad | documentos e información de facturación |
Prueba la cuenta de cada tipo, especialmente el permiso para realizar pedidos y aprobaciones. No utilices una cuenta común para toda la empresa.
5. Oferta, precios y checkout
5.1. Catálogo y precios
- Asegúrate de que los productos Magento estén asignados al website B2B, activos y tengan datos MSI correctos.
- Configura tarifas o precios contractuales para la empresa en el área B2B > Pricing (Price Lists, Price List Assignments o Contract Prices).
- Configura las reglas de visibilidad del catálogo para la empresa según el modelo de permisos implementado y después comprueba la visibilidad en la cuenta del cliente.
- Prueba en la cuenta de empresa: búsqueda de SKU, visibilidad del producto y precio para la cantidad
1y para el tramo por cantidad.
El precio B2B depende de la empresa, el website, la moneda y la cantidad. Un producto visible en B2C no tiene por qué estar disponible para el cliente B2B.
5.2. Envío y pago
- Activa los métodos de envío y pago requeridos en la configuración estándar de Magento para el B2B store view.
- En B2B > Checkout, añade reglas de métodos disponibles para empresa/website si quieres limitar la selección.
- Realiza una prueba de carrito con las direcciones predeterminadas de la empresa.
Si la creación de pedidos desde RFQ debe funcionar automáticamente desde el lado del administrador, la empresa debe tener direcciones predeterminadas inequívocas y un método de pago y envío activo. De lo contrario, la suite cargará los datos en el Backend Order Create nativo, donde el administrador completa los elementos faltantes.
5.3. Límites y aprobaciones
Estas funciones son opcionales, pero deberían configurarse antes de activarlas para los clientes.
- En B2B > Credit > Payment Terms, añade plazos de pago.
- En B2B > Credit > Credit Limits, asigna a la empresa un límite, moneda, estado y plazo de pago.
- En B2B > Approvals > Rules, crea una regla de umbral de importe para la empresa y el website.
- En B2B > Approvals > Approvers, asigna las personas aprobadoras.
- Prueba el carrito por debajo y por encima del umbral y comprueba si la decisión del aprobador cambia el proceso posterior.
6. Documentos, PDF y RFQ
6.1. Documentos Magento
En Stores > Configuration > Kowal > B2B > Documents, elige la fuente de documentos y decide qué documentos deben generarse automáticamente: confirmaciones de pedidos, facturas, albaranes y abonos. Define también el estado de destino del documento.
En B2B > Documents > PDF Templates:
- comprueba la plantilla activa para cada tipo y website;
- realiza una vista previa;
- ajusta HTML/CSS solo si cuentas con una persona que conozca plantillas Magento y CSS mPDF;
- genera una factura o confirmación de prueba y comprueba la descarga desde la cuenta de empresa.
6.2. RFQ y oferta PDF
- En B2B > Quotes > RFQ, crea un RFQ de prueba para una empresa y usuario activos.
- Añade SKU visibles para la empresa, cantidad y precio de oferta.
- Define la fecha de validez, envía la oferta al cliente y genera el PDF.
- Comprueba la variante del cliente: datos del vendedor/comprador, posiciones, precio, total y fecha de validez.
- Comprueba la variante del administrador: además, notas comerciales, comentarios, historial e información interna de posiciones.
El PDF del cliente no puede contener notas del comercial ni historial interno de estados.
7. Pedidos rápidos, importaciones e integraciones
Pedidos rápidos
En B2B > Quick Order > Debug SKU, comprueba la lista SKU,qty para la empresa, website y moneda. Después crea una lista de compra y prueba su uso por el cliente en el storefront.
Importación y exportación
En B2B > Import/Export, define un perfil solo después de determinar la fuente de datos. La configuración del perfil es un objeto JSON y debe contener rutas de archivos disponibles en el servidor Magento. Primero ejecuta la importación en modo de prueba y analiza el job y los logs.
Integraciones API
Antes de crear un token de integración, define el alcance de datos y el propietario de la sincronización. Usa una integración Magento independiente para cada ERP, PIM, WMS o middleware y concédele únicamente las ACL B2B necesarias. La lista completa de endpoints, tokens y normas de seguridad se encuentra en la documentación API para integradores.
8. Checklist de aceptación
Antes del lanzamiento en producción, confirma:
- Los módulos Kowal están activos, cron funciona, y la cache y los índices son correctos.
- B2B está activado únicamente para el website correcto.
- El theme B2B está asignado únicamente al B2B store view.
- La empresa de prueba tiene estado Active, usuario, rol, contacto y direcciones predeterminadas.
- El producto de prueba está activo, asignado al website, visible para la empresa y tiene precio B2B correcto.
- El cliente puede iniciar sesión, buscar SKU, usar quick order y añadir el producto al carrito.
- Checkout muestra solo los métodos de envío y pago permitidos.
- El límite y la regla de aprobación funcionan conforme a la política de la empresa, si se utilizan estas funciones.
- El documento y el PDF RFQ se generan y están disponibles solo para la empresa correcta.
- El RFQ puede enviarse, aceptarse y pasar al proceso de creación del pedido.
- Las integraciones tienen tokens separados y ACL limitadas, si se utilizan.
9. Problemas más frecuentes
| Síntoma | Qué comprobar |
|---|---|
| No aparece el menú B2B | setup:upgrade, estado de módulos, cache y ACL del administrador. |
| La empresa o el cliente no ve B2B | Si B2B está activo para el website correcto y si la empresa tiene una relación activa con ese website. |
| El producto no es visible o no tiene precio | Asignación del producto al website, actividad del SKU, datos MSI, reglas de catálogo, precio de empresa, moneda y cantidad. |
| Falta método de envío o pago | Configuración estándar de Magento, scope del B2B store view y reglas B2B Checkout. |
| No se genera el PDF | Plantilla PDF activa, paquete mPDF, permisos para var/, datos del vendedor y logs de Magento. |
| RFQ no crea el pedido automáticamente | Direcciones predeterminadas de la empresa, pago y envío inequívocos; en los demás casos usa Backend Order Create. |
API devuelve 403 | El token de integración no tiene la ACL requerida; no uses el token de administrador en una aplicación externa. |
Al contactar con soporte, indica la versión de Magento, versión del paquete, pasos para reproducir, hora del evento, logs anonimizados de forma segura y posible trace_id. No envíes tokens ni contraseñas.
10. Actualización del paquete
- Consulta la información de versión proporcionada por Kowal.
- Realiza primero la actualización en el entorno de pruebas.
- Haz backup,
composer update kowal/metapackage-b2b-suite --with-all-dependencies,bin/magento setup:upgrade, y en producción también compilación DI y deployment de recursos estáticos. - Repite la checklist de aceptación, prestando especial atención a precios, checkout, documentos e integraciones.
No actualices el paquete copiando archivos manualmente a app/code; esto provoca problemas con Composer y dificulta el soporte posterior.