Sistem B2B profesional pentru Magento 2 Open Source
- SKU
- M2-B2B
Descriere / Sistem B2B profesional pentru Magento 2 Open Source
MAGENTO 2 · MAGENTO OPEN SOURCE · COMPANII · COMERȚ B2B
Conectează vânzările B2B și B2C într-o singură instalare Magento.
Kowal B2B Suite
Dezvoltă un portal pentru parteneri cu companii, roluri, prețuri, cataloage, RFQ, limite, documente și integrări. Activează logica B2B pentru website-urile selectate și adaptează procesul la regulile tale comerciale.
16 module și temă · Website scope · REST și GraphQL
CUM FUNCȚIONEAZĂ ÎN PRACTICĂ
01 · Stabilești modelul comercial
Definești companiile, canalele, prețurile și sursele de date.
02 · Configurezi procesul B2B
Atribui roluri, catalogul, condițiile și aprobările.
03 · Conectezi sistemele și implementezi
Alegi adaptoarele și verifici scenariile complete.
Ce câștigă magazinul tău?
Descoperă funcțiile, utilizarea și setările modulului.
Descoperă modulul
KOWAL B2B SUITE · MAGENTO 2 OPEN SOURCE
Sistem B2B profesional fără migrare la Adobe Commerce
Kowal B2B Suite extinde Magento 2 Open Source cu funcțiile necesare pentru vânzarea en-gros și contractuală.
Gestionează companii, utilizatori, prețuri individuale, comenzi rapide, limite de credit comercial, aprobări, oferte, documente și integrări — într-un singur mediu Magento.
Companii și roluri · Prețuri și cataloage · RFQ · Credit comercial · Documente · Integrări
Vânzare B2B adaptată regulilor tale comerciale
Fiecare partener poate primi propriile prețuri, catalog, condiții de plată, limite și utilizatori cu permisiuni diferite.
Sistemul susține atât un model en-gros simplu, cât și procese de achiziție complexe, cu aprobare în mai multe etape și integrare cu ERP, PIM, WMS sau CRM.
Cele mai importante zone ale platformei B2B
Mută gestionarea zilnică a partenerilor din e-mailuri, foi de calcul și acorduri manuale direct în Magento.
Companii, utilizatori și roluri de achiziție
O companie poate avea mai mulți utilizatori, adrese și persoane responsabile de achiziții. Rolurile stabilesc cine poate comanda, aproba sau vizualiza date.
Prețuri și cataloage individuale
Fiecare partener poate primi propriul catalog, prețuri contractuale, praguri cantitative și reguli de achiziție. Clientul vede oferta destinată companiei sale.
Comenzi rapide și liste de cumpărături
Clienții pot plasa eficient comenzi mari după SKU, pot folosi liste de cumpărături și pot importa poziții în loc să caute fiecare produs separat.
RFQ, oferte și aprobări
Procesul de ofertare poate include prețuri negociate, termen de valabilitate și condiții individuale. Comenzile pot trece prin aprobare în funcție de valoare sau de rolul utilizatorului.
Control financiar fără lucru în foi de calcul
Limitele de credit comercial, utilizarea creditului și termenele de plată ajută la controlul vânzărilor cu plată amânată.
Clientul are acces la documente, iar echipa vede condițiile comerciale și starea procesului într-un singur loc.
Documente în portalul clientului
- facturi și storno-uri,
- avize de livrare și confirmări,
- oferte PDF,
- documente din Magento sau din sistemul ERP.
Cum arată implementarea?
Platforma poate fi implementată pe etape. Mai întâi ordonăm regulile comerciale, apoi le reflectăm în Magento și le integrăm cu sistemele companiei.
1. Model de vânzare
Stabilim clienții, canalele, listele de prețuri, plățile, restricțiile și sursele de date.
2. Reguli pentru companii
Configurăm utilizatorii, prețurile, catalogul, adresele, limitele și rolurile de achiziție.
3. Proces de achiziție
Implementăm comenzi rapide, oferte, aprobări, documente și reguli de checkout.
4. Integrări și teste
Conectăm ERP, PIM, WMS sau CRM, testăm scenariile și pregătim echipa pentru lucru.
Integrări cu sistemele companiei
Datele despre clienți, prețuri, produse, comenzi și documente pot fi schimbate cu ERP, PIM, WMS, CRM, EDI și sistemele de achiziții ale partenerilor.
Sincronizarea poate include limite de credit comercial, condiții de plată, statusuri ale comenzilor și documente. Istoricul taskurilor și erorilor facilitează controlul procesului.
B2B care crește odată cu businessul
Kowal B2B Suite este o soluție pentru angrosiști, distribuitori, producători și companii care desfășoară vânzări contractuale.
Poți începe cu companii, prețuri și catalog, iar apoi poți extinde platforma cu comenzi rapide, RFQ, limite, aprobări, documente și integrări.
Un singur Magento. Un singur catalog. Un singur proces de vânzare B2C și B2B.
Un singur pachet, arhitectură modulară
kowal/metapackage-b2b-suite furnizează fișierele a 16 module B2B și ale temei frontend/Kowal/b2b. Pachetul principal le înregistrează în autoload și înlocuiește numele subpachetelor, astfel încât instalarea suite nu necesită un repository separat pentru fiecare modul.
Implementarea este proiectată pentru Magento Open Source 2.4.9 și PHP 8.3. Domeniul modulelor activate, compatibilitatea temei și scenariile procesului trebuie verificate în instalarea țintă.
Website și modelul de acces al companiei
Funcțiile B2B funcționează în contextul website_id selectat. Compania trebuie să aibă o relație activă cu acest canal, iar rolurile definesc accesul la achiziții, utilizatori, oferte și documente.
Primul model de companie presupune un singur website atribuit. Vânzarea B2C poate utiliza aceeași instalare, însă activarea B2B și accesul companiilor rămân separate prin configurarea canalelor.
Quick Order, aprobări și implementare etapizată
Comanda rapidă verifică SKU, cantitatea, atribuirea la website, vizibilitatea pentru companie și prețul B2B. Listele de cumpărături și logurile de import ajută la gestionarea comenzilor repetitive.
Regulile approval iau în considerare compania, website-ul, moneda și pragul. Request-ul pending curent este închis prin decizia approve, reject sau cancel. Fluxul în mai multe etape trebuie convenit și verificat ca domeniu concret al implementării.
Documente și acces securizat
Documentele sunt atribuite companiei și website-ului. Fișierele PDF se află în var/kowal_b2b_documents și sunt descărcate printr-un controller care verifică accesul.
Sursa poate fi Magento Sales sau modul hibrid Magento + API. Pachetul include documente pentru comenzi, facturi, expedieri și corecții, precum și un renderer PDF comun; sincronizarea documentelor dintr-un sistem extern necesită un adaptor adecvat.
Integrările necesită adaptoare și surse de date
Stratul Integration furnizează profile, maparea identificatorilor, joburi, retry, loguri și dead letter queue. Un ERP, PIM, WMS sau CRM concret este conectat printr-un adaptor care implementează SyncAdapterInterface.
Înainte de start, stabilește sursa de adevăr pentru companii, prețuri, stocuri, comenzi și documente. REST și GraphQL sunt puncte de integrare; instalarea pachetului nu conectează automat toate sistemele companiei.
Instalare prin Composer
Pachetul kowal/metapackage-b2b-suite, modulul Kowal_B2BBase. După configurarea accesului la repository-ul Kowal, instalează pachetul, activează modulul, actualizează Magento și golește cache-ul. În producție, include compilarea și deploy-ul conținutului static conform procesului magazinului.
De la configurare la rezultat
1. Stabilești modelul comercial
Definești companiile, canalele, prețurile și sursele de date.
2. Configurezi procesul B2B
Atribui roluri, catalogul, condițiile și aprobările.
3. Conectezi sistemele și implementezi
Alegi adaptoarele și verifici scenariile complete.
Portal de comenzi pentru partener
Compania este atribuită unui website B2B activ. Utilizatorul ei folosește catalogul și prețul conform condițiilor stabilite, adaugă poziții după SKU și plasează comanda.
În funcție de configurare, procesul include limita și aprobarea. Documentele și integrările rămân asociate companiei și canalului de vânzare corespunzător.
Planifică o implementare B2B adaptată companiei
Vrei să adaptezi modulul la magazinul tău? Solicită implementarea Kowal B2B Suite și discută configurarea sau extensiile necesare.
Mai multe informații
| Conformitate cu șablonul | Luma / Blank, KOWAL |
|---|
Configurarea integrării
Kowal B2B API — documentație REST completă
Versiunea contractului:
V1· Sursa de adevăr:Kowal_B2BApi/etc/webapi.xml· Destinatari: administratori de magazine, parteneri de implementare și echipe care integrează ERP, PIM, WMS sau un sistem de achiziții.
1. Scopul și limitele API
Kowal B2B API pune la dispoziție date și procese B2B care funcționează în Magento 2: companii, catalog și prețuri individuale, cumpărături rapide, documente, limită de credit comercial, aprobări, RFQ și cozi de integrare. Este un REST API pentru integrări de sistem; nu înlocuiește endpointurile standard Magento pentru catalog, coș, checkout și contul clientului.
Documentul descrie exclusiv endpointurile expuse în prezent de modul. Nu promite operațiuni pe care contractul V1 nu le oferă, de exemplu crearea unei comenzi prin REST, CRUD pentru liste de prețuri sau editarea configurației website.
2. Obținerea accesului și reguli de colaborare
2.1. Procesul de lansare a integrării
- Integratorul transmite administratorului magazinului scopul integrării, mediul (test/producție), sistemul sursă, domeniul datelor și lista zonelor API necesare.
- Administratorul creează sau configurează integrarea Magento, îi atribuie permisiuni ACL minime și transmite printr-un canal sigur:
baseUrl, tokenul,websiteId,companyId(dacă se aplică), moneda și datele de test. - Integratorul execută testul
GET /V1/kowal-b2b/websites/:websiteId/config, apoi teste funcționale pe mediul de test. - Înainte de producție, ambele părți stabilesc programul de sincronizare, dimensiunea maximă a datelor, retry, proprietarul datelor și modul de raportare a erorilor.
- Tokenurile sunt păstrate exclusiv într-un seif de secrete; administratorul le rotește sau le retrage la schimbarea furnizorului, utilizatorului ori domeniului integrării.
2.2. Responsabilități
| Parte | Responsabilitate |
|---|---|
| Administrator magazin | Configurarea website-ului B2B, a companiei și relației companiei cu website-ul, tokenului și ACL; transmiterea datelor de test; decizia privind accesul la date. |
| Integrator | Păstrarea în siguranță a tokenului, utilizarea corectă a contextului websiteId/companyId, validarea datelor, gestionarea erorilor și reluărilor, neexpunerea datelor altor companii. |
| Proprietar proces de business | Stabilirea sursei de adevăr pentru prețuri, documente, RFQ, limite și statusuri de sincronizare. |
Nu folosi tokenul administratorului într-o aplicație client și nu partaja un singur token între sisteme independente. Fiecare integrare ar trebui să aibă propriul token și doar ACL necesare.
2.3. Permisiuni
Magento verifică tokenul Bearer și ACL atribuite utilizatorului administrativ sau integrării. Endpointurile B2B necesită una dintre următoarele grupe de permisiuni:
| ACL | Domeniu |
|---|---|
config | Websites și feature flags |
companies, company_save, company_users, batch | Companii, utilizatorii lor și importul batch de companii |
products, prices, catalog_permissions | Catalog, disponibilitate, prețuri și vizibilitate |
import_export, quick_order, documents | Profile de import/export, liste de cumpărături și documente |
credit_limits, approvals, orders, quotes | Limită, workflow de aprobare, contextul comenzilor și RFQ |
system_integrations | Profile, mapări și joburi de integrare |
Domeniul trebuie să rezulte din scopul integrării. Exemplu: un sistem de achiziții are de obicei nevoie de products, prices, catalog_permissions, quick_order și quotes; un ERP care gestionează documente — documents și, dacă este proprietarul sincronizării, system_integrations.
3. Convenții tehnice
Adresă, headere și parametri
Adresa de bază are forma https://b2b.example.com/rest/V1. Toate căile de mai jos din document sunt indicate de la /V1; adresa completă a endpointului este BASE_URL + calea.
Authorization: Bearer Accept: application/jsonContent-Type: application/json API folosește JSON. Numele din URL sunt camelCase (websiteId, companyId), iar câmpurile JSON corespund numelor parametrilor contractelor Magento. :companyId, :quoteId, :sku etc. sunt parametri de cale. În exemple, ? marchează un parametru opțional.
websiteId este necesar pentru operațiile dependente de canalul de vânzare. Trebuie să indice un website existent cu B2B activat. companyId indică o companie care trebuie să aibă o relație activă cu acel website când operația funcționează în contextul ei. API nu alege implicit website-ul sau compania.
Request body și idempotency
Magento serializează obiectul DTO sub numele parametrului metodei: majoritatea scrierilor acceptă {'request': {...}}; crearea companiei folosește {'company': {...}}; batch-ul de companii — {'companies': [...]}. Endpointurile cu argumente simple acceptă câmpuri fără wrapper, de exemplu {'websiteId': 1, 'currency': 'PLN', 'items': [...]}.
Headerul Idempotency-Key (max. 128 de caractere) este acceptat în prezent de POST /companies: reluarea cu aceeași cheie va returna compania creată anterior. Pentru jobul de integrare folosește câmpul request.idempotencyKey. Nu presupune idempotency automată pentru alte endpointuri de scriere; reia-le doar după stabilirea statusului operației.
Răspunsuri și erori
Răspunsurile de succes sunt obiecte sau tablouri ale contractelor Magento. Câmpurile returnate de obiecte pot fi extinse compatibil; integrarea ar trebui să ignore câmpurile necunoscute. O eroare de business poate conține:
{ '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 | Semnificație | Reacția integratorului |
|---|---|---|
400 / 422 | Date incorecte sau validare de domeniu | Corectează datele; nu relua fără schimbarea payloadului. |
401 / 403 | Token/ACL lipsă sau insuficient | Nu relua; raportează administratorului domeniul tokenului. |
404 | Resursa sau relația nu există în contextul dat | Verifică identificatorii și contextul website. |
409 | Conflict de status sau duplicat | Citește starea curentă înainte de decizia de reluare. |
5xx / timeout | Eroare tehnică | Aplică retry limitat cu backoff și păstrează trace_id. |
Nu loga tokenuri, date personale complete sau secrete de configurare. Raportarea către echipa magazinului ar trebui să includă timpul, metoda, calea fără secrete, statusul HTTP, trace_id și payloadul anonimizat.
4. Scheme de date de intrare
Schemele de mai jos sunt comune endpointurilor de referință. Câmpul fără ? este cerut de contract; ? înseamnă valoare opțională. Câmpurile metadata, config, configuration și payload sunt obiecte JSON.
| DTO / wrapper | Câmpuri |
|---|---|
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 — poziție RFQ | quoteId, sku, productId?, name?, qty, requestedPrice?, offeredPrice?, comment?, metadata? |
request — decizie RFQ | customerId?, adminUserId?, message? |
request — comentariu RFQ | quoteId, customerId?, adminUserId?, authorType, message, visibleForCustomer |
request — document | websiteId, companyId, orderId?, orderIncrementId?, invoiceId?, invoiceIncrementId?, creditmemoId?, creditmemoIncrementId?, externalId?, documentNumber, documentType, status, issueDate?, dueDate?, grandTotal?, currency?, metadata? |
request — fișier document | documentId, fileName, filePath, mimeType, fileSize, checksum?, primary |
request — limită | websiteId, companyId, termsId?, creditLimit, currency, active, status, metadata? |
request — expunere limită | websiteId, companyId, sourceType, sourceId, sourceIncrementId?, amount, currency, dueDate?, metadata? |
request — condiții de plată | websiteId, code, name, daysDue, active, description? |
request — regulă de aprobare | websiteId, companyId, name, thresholdAmount, currency?, priority, active, metadata? |
request — aprobator | ruleId, customerId, sortOrder, active |
request — decizie aprobare | approverCustomerId?, comment? |
request — cerere aprobare | websiteId, companyId, orderId?, orderIncrementId?, requesterCustomerId?, grandTotal, currency, comment?, metadata? |
request — profil import/export | websiteId, code, name, direction, entityType, format, behavior, active, configuration? |
request — profil integrare | websiteId, code, name, systemType, adapterCode, direction, active, maxAttempts, config? |
request — mapare | websiteId, systemType, entityType, localId, externalId, metadata? |
request — job integrare | profileId, direction?, entityType, operation, idempotencyKey?, maxAttempts?, payload?, scheduledAt? |
5. Referință endpointuri
În tabele, ACL indică resursa minimă de permisiune Magento. Rezultat definește tipul răspunsului de succes.
5.1. Websites și configurare
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /V1/kowal-b2b/websites | config | — | Tablou website (websiteId, cod, nume, flag B2B). Preia înainte de configurarea integrării. |
GET /V1/kowal-b2b/websites/:websiteId/config | config | path: websiteId | Configurarea B2B a website-ului (inclusiv enabled/debug/retenție loguri). Execută drept test de acces. |
GET /V1/kowal-b2b/websites/:websiteId/features | config | path: websiteId | Feature flags active pentru website; folosește pentru activarea condiționată a funcțiilor clientului. |
5.2. Companii și utilizatori de companie
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /companies?websiteId= | companies | query: websiteId | Tablou de companii atribuite website-ului. |
POST /companies | company_save | body: company | Creează compania și relația cu website-ul; folosește Idempotency-Key la reluări. Returnează compania. |
POST /companies/batch | batch | body: companies — tablou company | Creează mai multe companii și returnează rezultatul per element, inclusiv erori. |
GET /companies/:companyId?websiteId= | companies | path: companyId; query: websiteId | Companie verificată în contextul website. |
PUT /companies/:companyId | company_save | path: companyId; body: company | Actualizează datele și relația companiei pentru company.websiteId. |
POST /companies/:companyId/activate?websiteId= | company_save | path: companyId; query: websiteId | Activează compania în website-ul indicat și returnează compania. |
POST /companies/:companyId/block?websiteId= | company_save | path: companyId; query: websiteId | Blochează compania în website-ul indicat și returnează compania. |
GET /companies/:companyId/users?websiteId= | company_users | path: companyId; query: websiteId | Tablou de atribuiri ale clienților la companie. |
PUT /companies/:companyId/users/:customerId | company_users | path: companyId, customerId; body: companyUser | Acordă/actualizează rolul și activitatea clientului în companie; returnează atribuirea. |
5.3. Produse, preț și vizibilitatea catalogului
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /products?websiteId= | products | query: websiteId | Tablou de produse Magento de bază pentru website. |
GET /products/:sku?websiteId= | products | path: sku codificat; query: websiteId | Produs (id, sku, nume, tip, status, websites). |
GET /products/:sku/availability?websiteId= | products | path: sku; query: websiteId | Disponibilitate și cantitate vandabilă MSI pentru SKU. |
GET /products/:sku/b2b-status?websiteId= | products | path: sku; query: websiteId | Status B2B: atribuirea la website, traduceri și date stock. |
GET /reports/products/missing-translations?websiteId= | products | query: websiteId | Raport SKU fără traduceri necesare, cu reason/details. |
GET /reports/products/missing-stock?websiteId= | products | query: websiteId | Raport SKU fără date stock necesare. |
GET /companies/:companyId/products/:sku/price?websiteId=¤cy=&qty= | prices | path: companyId, sku; query: websiteId, currency, opț. qty (implicit 1) | Explicația prețului corect pentru companie, monedă și cantitate; citește înainte de achiziție. |
GET /companies/:companyId/products/:sku/visibility?websiteId= | catalog_permissions | path: companyId, sku; query: websiteId | Rezultatul vizibilității/achiziției SKU pentru companie. |
GET /companies/:companyId/catalog-visibility?websiteId= | catalog_permissions | path: companyId; query: websiteId | Tablou de poziții ale indexului catalogului vizibil al companiei. |
POST /companies/:companyId/catalog-visibility/reindex?websiteId= | catalog_permissions | path: companyId; query: websiteId | Reconstruiește indexul și returnează numărul de poziții indexate. Operație administrativă. |
5.4. Import și export pe fișiere
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /import-export/profiles?websiteId= | import_export | query: websiteId | Tablou de profile import/export pentru website. |
POST /import-export/profiles | import_export | body: request — profil import/export | Salvează profilul și returnează datele lui. |
POST /import-export/import/:profileId?sourceFile=&dryRun= | import_export | path: profileId; query: sourceFile, opț. dryRun=false | Pornește importul fișierului indicat pe partea mediului Magento; returnează jobul. Nu trimite multipart. |
POST /import-export/export/:profileId?resultFile= | import_export | path: profileId; opț. query: resultFile | Creează jobul de export, opțional cu calea fișierului țintă. |
GET /import-export/jobs?websiteId= | import_export | query: websiteId | Tablou de joburi import/export pentru website. |
GET /import-export/jobs/:jobId | import_export | path: jobId | Starea, rezultatul și datele unui singur job. |
GET /import-export/jobs/:jobId/logs | import_export | path: jobId | Loguri diagnostice ale jobului. |
5.5. Comandă rapidă și liste de cumpărături
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
POST /companies/:companyId/quick-order/validate | quick_order | path: companyId; body: websiteId, currency, items (sku, qty) | Validează mai multe SKU în contextul companiei: disponibilitate, vizibilitate și preț; returnează rezultatul agregat. |
GET /companies/:companyId/shopping-lists?websiteId= | quick_order | path: companyId; query: websiteId | Tablou de liste de cumpărături ale companiei. |
POST /companies/:companyId/shopping-lists | quick_order | path: companyId; body: websiteId, name, opț. customerId, isDefault=false | Creează lista de cumpărături și o returnează. |
GET /shopping-lists/:listId/items | quick_order | path: listId | Tablou de poziții ale listei indicate. |
POST /shopping-lists/:listId/items | quick_order | path: listId; body: currency, items (sku, qty) | Adaugă poziții în listă și returnează pozițiile salvate. |
5.6. Documente și fișiere
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /companies/:companyId/documents?websiteId=&documentType= | documents | path: companyId; query: websiteId, opț. documentType | Documentele companiei, filtrate opțional după tip. |
GET /documents/:documentId?companyId=&websiteId= | documents | path: documentId; query: companyId, websiteId | Detaliile documentului după verificarea apartenenței companiei. |
POST /documents | documents | body: request — document | Creează sau salvează metadatele documentului și returnează documentul. |
POST /documents/files | documents | body: request — fișier document | Înregistrează fișierul existent în storage Magento (nume, cale, MIME, dimensiune), nu trimite binare. |
GET /documents/:documentId/files?companyId=&websiteId= | documents | path: documentId; query: companyId, websiteId | Tablou de metadate ale fișierelor documentului. |
GET /documents/:documentId/sync-logs | documents | path: documentId | Loguri de sincronizare ale documentului; destinate integrării administrative. |
5.7. Limită de credit comercial și termene de plată
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /companies/:companyId/credit/status?websiteId=¤cy= | credit_limits | path: companyId; query: websiteId, currency | Statusul limitei, utilizarea și suma disponibilă a companiei. |
POST /credit-limits | credit_limits | body: request — limită | Creează/actualizează limita companiei și returnează limita. |
POST /credit/exposures | credit_limits | body: request — expunere | Rezervă expunerea limitei pentru sursă (de ex. comandă) și o returnează. |
POST /credit/exposures/:exposureId/release | credit_limits | path: exposureId; opț. body: message | Eliberează expunerea; returnează starea acesteia. |
GET /payment-terms?websiteId= | credit_limits | query: websiteId | Tablou de condiții de plată active/cunoscute ale website-ului. |
POST /payment-terms | credit_limits | body: request — condiții de plată | Salvează condițiile de plată și le returnează. |
5.8. Workflow de aprobare
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /companies/:companyId/approval/rules?websiteId=¤cy= | approvals | path: companyId; query: websiteId, opț. currency | Reguli de aprobare ale companiei pentru canal/monedă. |
POST /approval/rules | approvals | body: request — regulă | Creează/actualizează regula de prag și o returnează. |
GET /approval/rules/:ruleId/approvers | approvals | path: ruleId | Tablou de aprobatori atribuiți, în ordinea sortOrder. |
POST /approval/approvers | approvals | body: request — aprobator | Salvează atribuirea clientului ca aprobator. |
GET /companies/:companyId/approval/required?websiteId=&grandTotal=¤cy= | approvals | path: companyId; query: websiteId, grandTotal, currency | Boolean: dacă suma necesită aprobare. |
POST /approval/requests | approvals | body: request — cerere aprobare | Creează request pentru comandă și îl returnează. |
GET /companies/:companyId/approval/requests?websiteId=&status= | approvals | path: companyId; query: websiteId, opț. status | Tablou de requesturi de aprobare ale companiei. |
POST /approval/requests/:requestId/approve | approvals | path: requestId; body: request — decizie | Aprobă requestul; returnează starea lui curentă. |
POST /approval/requests/:requestId/reject | approvals | path: requestId; body: request — decizie | Respinge requestul; returnează starea lui curentă. |
POST /approval/requests/:requestId/cancel | approvals | path: requestId; body: request — decizie | Anulează requestul; returnează starea lui curentă. |
GET /approval/requests/:requestId/decisions | approvals | path: requestId | Istoricul deciziilor pentru request. |
5.9. Context B2B al comenzilor
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /orders/:orderId/b2b-context | orders | path: orderId | Context B2B al unei singure comenzi native Magento (de ex. companie, status aprobare, limită, export). |
GET /companies/:companyId/orders/b2b-context?websiteId=&approvalStatus= | orders | path: companyId; query: websiteId, opț. approvalStatus | Tablou de contexte ale comenzilor companiei, filtrat opțional după statusul aprobării. |
5.10. RFQ și oferte comerciale
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /companies/:companyId/quotes?websiteId=&status= | quotes | path: companyId; query: websiteId, opț. status | RFQ și ofertele companiei, opțional după status. |
POST /quotes | quotes | body: request — RFQ | Creează un RFQ draft și îl returnează. Adaugă poziții printr-un endpoint separat. |
GET /quotes/:quoteId | quotes | path: quoteId | Detalii RFQ/ofertă. |
GET /quotes/:quoteId/items | quotes | path: quoteId | Tablou de poziții RFQ. |
POST /quotes/items | quotes | body: request — poziție RFQ | Adaugă SKU și cantitatea, prețul solicitat/ofertat opțional și comentariul. |
GET /quotes/:quoteId/comments | quotes | path: quoteId | Comentarii RFQ. Clientul vede doar comentariile marcate ca vizibile. |
POST /quotes/comments | quotes | body: request — comentariu RFQ | Adaugă mesaj; authorType și visibleForCustomer definesc autorul și vizibilitatea. |
GET /quotes/:quoteId/history | quotes | path: quoteId | Istoricul schimbărilor de status și evenimentelor RFQ. |
POST /quotes/:quoteId/submit | quotes | path: quoteId; body: request — decizie RFQ | Trimite RFQ draft pentru ofertare. |
POST /quotes/:quoteId/make-offer | quotes | path: quoteId; body: request — decizie RFQ | Agentul de vânzări creează/transmite oferta; înainte de apel stabilește prețurile pozițiilor. |
POST /quotes/:quoteId/accept | quotes | path: quoteId; body: request — decizie RFQ | Acceptă oferta curentă. În acest contract nu creează comandă REST. |
POST /quotes/:quoteId/reject | quotes | path: quoteId; body: request — decizie RFQ | Respinge oferta/RFQ. |
POST /quotes/:quoteId/cancel | quotes | path: quoteId; body: request — decizie RFQ | Anulează RFQ, dacă statusul curent permite. |
5.11. Profile și joburi de integrare
| Metodă și endpoint | ACL | Intrare | Rezultat și utilizare |
|---|---|---|---|
GET /integrations/profiles?websiteId=&systemType= | system_integrations | query: websiteId, opț. systemType | Profile de integrare pentru website. |
POST /integrations/profiles | system_integrations | body: request — profil integrare | Salvează profilul ERP/PIM/WMS etc. și îl returnează. |
POST /integrations/mappings | system_integrations | body: request — mapare | Salvează perechea ID local ↔ ID extern. |
GET /integrations/mappings/local?websiteId=&systemType=&entityType=&localId= | system_integrations | query: toți parametrii sunt necesari | Caută maparea după identificatorul Magento. |
GET /integrations/mappings/external?websiteId=&systemType=&entityType=&externalId= | system_integrations | query: toți parametrii sunt necesari | Caută maparea după identificatorul sistemului extern. |
POST /integrations/jobs | system_integrations | body: request — job | Publică jobul pentru execuție; idempotencyKey identifică operația de business. |
GET /integrations/jobs?websiteId=&status= | system_integrations | query: websiteId, opț. status | Tablou de joburi de integrare. |
GET /integrations/jobs/:jobId | system_integrations | path: jobId | Starea și detaliile unui singur job. |
POST /integrations/jobs/:jobId/process | system_integrations | path: jobId | Procesează jobul și returnează starea lui curentă. |
POST /integrations/jobs/:jobId/retry | system_integrations | path: jobId | Reia jobul după eroare, conform limitei sale de încercări. |
GET /integrations/jobs/:jobId/logs | system_integrations | path: jobId | Logurile execuției jobului. |
GET /integrations/jobs/:jobId/errors | system_integrations | path: jobId | Erori de domeniu/tehnice ale jobului. |
6. Exemple de apeluri
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. Scenarii de integrare recomandate
Achiziție după SKU
- Citește configurarea website-ului și salvează
websiteId,companyIdși moneda transmise. - Folosește quick order pentru validarea colectivă a SKU, cantității, vizibilității și disponibilității.
- Pentru pozițiile acceptate, preia prețul din
pricecuqtycorespunzător. - Creează RFQ, adaugă pozițiile și trimite-le prin
submit, dacă achiziția necesită ofertă. - Urmărește statusul și istoricul RFQ; după acceptare, urmează procesul de comandă Magento convenit, deoarece
V1nu expune endpoint de creare order.
Documente și decontări
- Preia lista documentelor companiei, filtrând opțional după
documentType. - Pentru documentul selectat, preia metadatele și lista de fișiere; calea fișierului nu este automat un URL public — modul de descărcare a binarului trebuie convenit cu administratorul magazinului.
- Citește statusul limitei înaintea procesului de achiziție; doar integrarea cu ACL
credit_limitso poate gestiona.
Operații asincrone
- Salvează profilul de integrare și mapările identificatorilor.
- Publică jobul cu
idempotencyKeyde business și păstreazăjobId. - Citește jobul și logurile/erorile; apelează
retrydoar după analiza erorii și eliminarea cauzei acesteia.
8. Listă de recepție înainte de producție
- Tokenul are doar ACL necesare și nu este tokenul administratorului folosit de UI.
- Integratorul gestionează corect
401,403,404, validarea422, conflictul409și timeouturile. - Fiecare request în context B2B transmite
websiteIdcorect, iar datele companiei folosesccompanyIdvalid. - Prețurile, vizibilitatea și disponibilitatea sunt verificate înainte de crearea procesului de achiziție.
- Crearea companiei folosește
Idempotency-Key; joburile de integrare au unidempotencyKeystabil în body. - Logurile nu conțin tokenuri sau date sensibile, iar procedura de suport transmite
trace_id. - Testele au fost efectuate pe mediul de testare pe o companie care are o relație activă cu website-ul B2B.
9. Compatibilitate
Contractul este versionat prin /V1. Extinderea răspunsului cu câmpuri noi este compatibilă; integratorul ar trebui să tolereze câmpurile necunoscute. O modificare care elimină un câmp, semnificația unui câmp sau un endpoint necesită o nouă versiune API. În caz de diferențe între document și instalarea funcțională, contractul activ webapi.xml al versiunii respective a modulului este cel obligatoriu.
Instrucțiuni de instalare a modulului
Instalarea și configurarea Kowal B2B Suite
Acest manual este destinat persoanei care a cumpărat Kowal B2B Suite și trebuie să îl pornească într-o instalare Magento Open Source existentă. Te ghidează prin două etape:
- instalarea tehnică — realizată de un developer sau administrator de server;
- configurarea de business — realizată în panoul Magento de administratorul magazinului.
Înainte de a începe, fă o copie a bazei de date și a fișierelor Magento. Recomandăm ca prima pornire să fie efectuată pe un mediu de testare, iar abia apoi implementată în producție.
1. Ce primești și de ce ai nevoie
Kowal B2B Suite este livrat ca pachet Composer kowal/metapackage-b2b-suite. Conține module B2B și tema frontend/Kowal/b2b.
Cerințe
| Element | Cerință |
|---|---|
| Magento | Magento Open Source 2.4.9 |
| PHP | 8.3 |
| Composer | Composer 2 |
| Acces server | SSH și posibilitatea de a rula bin/magento |
| Magento | catalog, clienți, checkout, Sales, MSI și cron funcționale |
posibilitate de scriere în var/ de către procesul PHP |
De la Kowal vei primi:
- adresa repository-ului privat Composer — în continuare
REPOSITORY_URL; - numele de utilizator sau identificatorul de acces —
USERNAME; - tokenul de acces —
ACCESS_TOKEN; - intervalul permis de versiuni ale pachetului.
Nu salva tokenul în repository-ul Git, în tickete sau în istoricul shell-ului partajat cu alte persoane.
2. Instalare tehnică
Execută toate comenzile în directorul rădăcină al instalării Magento existente, ca utilizator care are acces la fișiere și la comanda bin/magento.
2.1. Pregătire
- Asigură-te că Magento funcționează corect înainte de modificare.
- Salvează starea implementării și fă backup bazei de date și directoarelor
app/etc,pub/mediașivar. - În producție, activează modul maintenance pe durata actualizării:
bin/magento maintenance:enable2.2. Adăugarea repository-ului privat
Adaugă repository-ul Composer Kowal și configurează datele de acces primite.
Datele de acces la repository-ul Composer (adresa de e-mail a clientului și tokenul de licență) le vei primi prin e-mail după achiziție. Sunt disponibile și în panoul clientului după autentificare pe kowal.store. Înlocuiește TWOJ_EMAIL_KLIENTA cu adresa de e-mail a contului tău, iar TWOJ_TOKEN cu tokenul primit. Execută comenzile în directorul rădăcină Magento.
composer config repositories.kowal composer https://repo.kowal.storecomposer config http-basic.repo.kowal.store 'TWOJ_EMAIL_KLIENTA' 'TWOJ_TOKEN'Composer salvează de obicei credențialele în fișierul local auth.json; nu adăuga acest fișier în Git.
2.3. Instalarea pachetului
Instalează versiunea transmisă împreună cu licența. Pentru linia curentă a pachetului, comanda exemplu este:
composer require kowal/metapackage-b2b-suite:^0.2 --with-all-dependenciesDupă descărcarea dependențelor, execută actualizarea schemei și configurării Magento:
bin/magento setup:upgradebin/magento cache:cleanÎn modul producție, execută suplimentar:
bin/magento setup:di:compilebin/magento setup:static-content:deploy -f pl_PL en_USbin/magento cache:flushFolosește doar acele locale care sunt active în magazin. Dacă instalarea folosește un alt proces de deployment, include comenzile de mai sus în procedura sa standard.
2.4. Verificarea instalării
bin/magento module:status | grep Kowalbin/magento indexer:statusÎn panoul de administrare ar trebui să apară meniul B2B și fila Stores > Configuration > Kowal > B2B. Dacă lipsesc, verifică rezultatul setup:upgrade, cache-ul și rolurile ACL ale utilizatorului administrator.
2.5. Permisiuni pentru fișiere PDF
PDF-urile generate de B2B folosesc mPDF și directoare din var/, inclusiv var/tmp/kowal_b2b_mpdf și var/kowal_b2b_documents. Procesul PHP trebuie să le poată crea și scrie. Lipsa acestor permisiuni se manifestă prin eroare la generarea documentului sau PDF-ului.
După finalizarea implementării în producție, dezactivează maintenance:
bin/magento maintenance:disable3. Configurarea structurii magazinului B2B
3.1. Website și store view
Suite funcționează la nivel de website, nu global. Poți opera B2C și B2B în aceeași instalare Magento, însă B2B ar trebui să funcționeze într-un website separat sau într-un website de vânzare către companii ales în mod conștient.
- În Stores > Settings > All Stores creează sau selectează website-ul B2B, store-ul și store view-ul acestuia.
- Reține
website_id— este folosit de companii, prețuri, documente, API și integrări. - În Content > Design > Configuration atribuie tema
frontend/Kowal/b2bdoar store view-ului B2B. - Verifică dacă monedele active, taxele, metodele de livrare și metodele de plată sunt configurate pentru același scope.
Nu atribui tema B2B unui store view B2C dacă nu vrei să îi schimbi stratul de prezentare. Simpla instalare a modulelor nu activează logica B2B pentru toate website-urile.
3.2. Activarea B2B
- Deschide Stores > Configuration > Kowal > B2B.
- În selectorul de scope alege Website-ul corespunzător.
- În secțiunea General setează Enable B2B la
Yes. - Pe durata implementării poți activa Debug Mode; dezactivează-l după teste.
- În scope Default Config setează perioada de retenție a logurilor.
- Salvează configurația și curăță cache-ul.
După activare, toate store view-urile care aparțin acelui website sunt tratate ca B2B. O companie fără o relație activă cu acest website nu va obține acces la el.
3.3. Datele vânzătorului
Completează datele companiei vânzătoare în Stores > Configuration > General > Store Information: nume, adresă, telefon și cod fiscal. Sunt folosite în documente și în PDF RFQ. Completează și adresa generală de e-mail a expeditorului în configurarea Sales Emails și logo-ul de e-mail, dacă trebuie să apară în PDF.
4. Configurarea primului client B2B
Folosește ordinea de mai jos pentru fiecare companie. Ajută la evitarea situației în care clientul are cont, dar nu vede oferta sau nu poate trece prin checkout.
4.1. Companie, persoane și adrese
- Deschide B2B > Companies și creează compania.
- Introdu numele, codul fiscal, identificatorul extern (dacă firma este sincronizată cu ERP), statusul
Activeși atribuirea la website-ul B2B. - Adaugă utilizatorul companiei sau atribuie un client Magento existent. Acordă-i rolul potrivit și activează atribuirea.
- În B2B > Company Addresses adaugă adresele companiei; marchează adresa implicită de facturare și de livrare pentru website-ul B2B.
- În B2B > Company Contacts adaugă un contact principal activ, cu e-mail și telefon.
Adresa de facturare și contactul principal sunt folosite și în PDF RFQ. Lipsa datelor nu blochează PDF-ul, dar documentul va fi mai puțin complet.
4.2. Roluri de companie
Acordă utilizatorilor doar permisiunile necesare. O împărțire tipică este:
| Rol | Exemple de sarcini |
|---|---|
| Administrator companie | utilizatori, roluri, adrese, documente și istoricul companiei |
| Cumpărător | catalog, comandă rapidă, coș, RFQ și comenzi |
| Aprobator | decizii în workflow-ul de aprobare |
| Contabilitate | documente și informații de decontare |
Testează contul fiecărui tip, mai ales permisiunea de plasare a comenzilor și de aprobare. Nu folosi un singur cont comun pentru întreaga companie.
5. Oferta, prețuri și checkout
5.1. Catalog și prețuri
- Asigură-te că produsele Magento sunt atribuite website-ului B2B, sunt active și au date MSI corecte.
- Configurează listele de prețuri sau prețurile contractuale pentru companie în zona B2B > Pricing (Price Lists, Price List Assignments sau Contract Prices).
- Configurează regulile de vizibilitate a catalogului pentru companie conform modelului de permisiuni implementat, apoi verifică vizibilitatea în contul clientului.
- Testează în contul companiei: căutarea SKU, vizibilitatea produsului și prețul pentru cantitatea
1și pentru pragul cantitativ.
Prețul B2B depinde de companie, website, monedă și cantitate. Un produs vizibil în B2C nu trebuie neapărat să fie disponibil pentru clientul B2B.
5.2. Livrare și plată
- Activează metodele necesare de livrare și plată în configurarea standard Magento pentru B2B store view.
- În B2B > Checkout adaugă reguli pentru metodele disponibile pentru companie/website, dacă vrei să limitezi opțiunile.
- Efectuează un test de coș pe adresele implicite ale companiei.
Dacă crearea comenzii din RFQ trebuie să funcționeze automat din partea administratorului, compania trebuie să aibă adrese implicite clare, metodă activă de plată și de livrare. În caz contrar, Suite va încărca datele în Backend Order Create nativ, unde administratorul completează elementele lipsă.
5.3. Limite și aprobări
Aceste funcții sunt opționale, dar ar trebui configurate înainte de a fi activate pentru clienți.
- În B2B > Credit > Payment Terms adaugă termenele de plată.
- În B2B > Credit > Credit Limits atribuie companiei limita, moneda, statusul și termenul de plată.
- În B2B > Approvals > Rules creează regula pragului valoric pentru companie și website.
- În B2B > Approvals > Approvers atribuie persoanele aprobatoare.
- Testează coșul sub și peste prag și verifică dacă decizia aprobatorului schimbă procesul ulterior.
6. Documente, PDF și RFQ
6.1. Documente Magento
În Stores > Configuration > Kowal > B2B > Documents alege sursa documentelor și decide ce documente trebuie generate automat: confirmări de comandă, facturi, avize de livrare și corecții. Setează și statusul țintă al documentului.
În B2B > Documents > PDF Templates:
- verifică șablonul activ pentru fiecare tip și website;
- fă previzualizarea;
- adaptează HTML/CSS doar dacă ai o persoană care cunoaște șabloanele Magento și CSS mPDF;
- generează o factură sau o confirmare de test și verifică descărcarea din contul companiei.
6.2. RFQ și ofertă PDF
- În B2B > Quotes > RFQ creează un RFQ de test pentru o companie și un utilizator activ.
- Adaugă SKU vizibile pentru companie, cantitatea și prețul ofertat.
- Setează termenul de valabilitate, trimite oferta clientului și generează PDF.
- Verifică varianta pentru client: datele vânzătorului/cumpărătorului, pozițiile, prețul, totalul și termenul de valabilitate.
- Verifică varianta administratorului: suplimentar notele comerciale, comentariile, istoricul și informațiile interne despre poziții.
PDF-ul clientului nu poate conține notele agentului de vânzări sau istoricul intern al statusurilor.
7. Comenzi rapide, importuri și integrări
Comenzi rapide
În B2B > Quick Order > Debug SKU verifică lista SKU,qty pentru companie, website și monedă. Apoi creează o listă de cumpărături și testează utilizarea ei de către client pe storefront.
Import și export
În B2B > Import/Export definește profilul numai după stabilirea sursei de date. Configurarea profilului este un obiect JSON și trebuie să conțină căi de fișiere disponibile pe serverul Magento. Mai întâi rulează importul în modul de test și analizează jobul și logurile.
Integrări API
Înainte de a crea tokenul de integrare, stabilește domeniul datelor și proprietarul sincronizării. Folosește o integrare Magento separată pentru fiecare ERP, PIM, WMS sau middleware și acordă-i doar ACL B2B necesare. Lista completă de endpointuri, tokenuri și reguli de securitate se află în documentația API pentru integratori.
8. Checklist de recepție
Înainte de lansarea în producție confirmă:
- Modulele Kowal sunt active, cron funcționează, iar cache-ul și indecșii sunt corecți.
- B2B este activat exclusiv pentru website-ul corect.
- Tema B2B este atribuită exclusiv store view-ului B2B.
- Compania de test are status Active, utilizator, rol, contact și adrese implicite.
- Produsul de test este activ, atribuit website-ului, vizibil pentru companie și are preț B2B corect.
- Clientul se poate autentifica, poate căuta SKU, poate folosi quick order și poate adăuga produsul în coș.
- Checkout-ul afișează doar metodele de livrare și plată permise.
- Limita și regula de aprobare funcționează conform politicii companiei, dacă aceste funcții sunt folosite.
- Documentul și PDF RFQ se generează și sunt disponibile exclusiv pentru compania corectă.
- RFQ poate fi trimis, acceptat și transmis către procesul de creare a comenzii.
- Integrările au tokenuri separate și ACL limitate, dacă sunt folosite.
9. Cele mai frecvente probleme
| Simptom | Ce trebuie verificat |
|---|---|
| Nu există meniul B2B | setup:upgrade, statusul modulelor, cache-ul și ACL-ul administratorului. |
| Compania sau clientul nu vede B2B | Dacă B2B este activ pentru website-ul corect și dacă firma are o relație activă cu acest website. |
| Produsul nu este vizibil sau nu are preț | Atribuirea produsului la website, activitatea SKU, datele MSI, regulile de catalog, prețul companiei, moneda și cantitatea. |
| Lipsește metoda de livrare sau de plată | Configurarea standard Magento, scope-ul B2B store view și regulile B2B Checkout. |
| PDF-ul nu se creează | Șablon PDF activ, pachetul mPDF, permisiuni pentru var/, datele vânzătorului și logurile Magento. |
| RFQ nu creează comanda automat | Adresele implicite ale companiei, plată și livrare clare; în celelalte cazuri folosește Backend Order Create. |
API returnează 403 | Tokenul integrării nu are ACL necesar; nu folosi tokenul administratorului într-o aplicație externă. |
La raportarea către suport, furnizează versiunea Magento, versiunea pachetului, pașii de reproducere, ora evenimentului, loguri anonimizate în siguranță și eventualul trace_id. Nu trimite tokenuri sau parole.
10. Actualizarea pachetului
- Consultă informațiile despre versiune transmise de Kowal.
- Execută actualizarea mai întâi pe mediul de testare.
- Fă backup,
composer update kowal/metapackage-b2b-suite --with-all-dependencies,bin/magento setup:upgrade, iar în producție și compilarea DI și deployment-ul resurselor statice. - Repetă checklist-ul de recepție, cu accent special pe prețuri, checkout, documente și integrări.
Nu actualiza pachetul prin copiere manuală de fișiere în app/code; acest lucru provoacă probleme cu Composer și îngreunează suportul ulterior.