ERP-koppelvlak Grossier.nu (0.5.0)

Download OpenAPI specification:Download

Het koppelvlak dat het ERP van een grossier aanbiedt en dat het Grossier.nu-platform aanroept.

Dit is de technische beschrijving bij spec.md. Het ERP is de server; het platform is de enige client. Alle paden staan onder /v1.

Conventies

  • Tijdstippen: ISO 8601 op milliseconden, met offset of in UTC; zonder offset = 400. Datumvelden zijn kalenderdata zoals op het document.
  • Leeg: null en een weggelaten veld zijn gelijkwaardig.
  • Bedragen: decimaal in euro, exclusief btw tenzij anders vermeld.
  • Fouten: altijd een HTTP-foutstatus met application/problem+json (schema Problem).
  • Paginering: limit + cursor in de aanvraag, nextCursor + asOf in het antwoord.
  • X-Request-Id: door het platform meegestuurd, door het ERP overgenomen in antwoord en logging.

Drie lagen (zie spec.md hoofdstuk 3): minimum (artikelinfo live, klant lezen en idempotent bestellen; zonder dit koppelt het platform niet), full (het volledige koppelvlak, aanbevolen) en de uitbreidingen (modules, met hun capability-naam). Per operatie staat onder x-module tot welke laag of module hij hoort en onder x-platform-function welke functie van het platform erop steunt. Alles boven het minimum meldt het ERP in GET /capabilities; het platform past zich daarop aan. Idempotentie: platformReference is de sleutel; bestaat die al, dan komt het bestaande object terug (200), ongeacht de inhoud van de nieuwe aanvraag. Het ERP controleert de referentie vóór elke andere validatie en legt vast vóór het antwoordt; de referentie is uniek per grossier. Bij een time-out of 5xx zoekt het platform eerst terug op platformReference en biedt het pas daarna opnieuw aan.

Documentlinks (documentUrl, packingSlipUrl, invoiceUrl, downloadUrl) zijn zonder sleutel op te halen, tijdgebonden en ten minste een uur geldig; het ERP geeft ze bij elke aanroep opnieuw uit en het platform bewaart ze niet. Ze zijn voor het platform, niet voor de garage: het platform haalt het document op en geeft het zelf door, dus de link hoeft alleen vanaf het platform bereikbaar te zijn.

Capabilities

Versie en aanwezige modules.

Versie, aanwezige onderdelen en modules

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "apiVersion": "0.5.0",
  • "implementationVersion": "string",
  • "changelogUrl": "http://example.com",
  • "erpName": "string",
  • "environment": "test",
  • "masterData": {
    },
  • "features": {
    },
  • "modules": {
    },
  • "limits": {
    }
}

Vestigingen

Filialen of magazijnen van de grossier.

Vestigingen van de grossier

Alleen vestigingen uit deze lijst tellen; voorraad op een vestigingscode die hier niet in staat, negeert het platform. De vestiging van de klant (Customer.branchCode) toont de shop als "uw vestiging", de andere samen als "elders bij de grossier". Of voorraad van een andere vestiging leverbaar is en wanneer, bepaalt het platform met zijn routes. Een ERP zonder vestigingen meldt feature branches false en levert voorraad als één getal zonder branchCode.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Artikelen

Artikelinfo live en artikelstam in bulk.

Artikelinfo live voor een lijst sleutels

Tot 500 sleutels per aanroep. Het ERP matcht exact (spec hoofdstuk 6): op erpArticleId (bekend id wint, zonder controle van de overige velden), anders op ean (voorloopnullen tellen niet; past hij op meer artikelen, dan stopt de reeks met ambiguous), anders op articleNumber + brand/brands, anders op articleNumber alleen als dat binnen het ERP uniek is en het platform géén merk meestuurt. Klopt een meegegeven merk niet, dan not_found (met candidates als het nummer bij een ander merk bestaat). Nooit op een deel van het nummer. Inactieve artikelen tellen mee voor de uniciteit.

Elke sleutel komt precies één keer terug, herkenbaar aan requestId. Onbekend = known: false. Fouten per sleutel raken alleen die sleutel; een sleutel zonder requestId, een dubbele requestId of meer dan 500 sleutels geeft 400 voor de hele aanroep.

Voorraad per vestiging uit GET /branches, altijd alle vestigingen (ook met 0); zonder vestigingen één StockLevel zonder branchCode (spec 11).

Met module pricing en een meegegeven erpCustomerId bevat elk bekend, actief artikel het blok price. Zonder de module negeert het ERP erpCustomerId, zonder waarschuwing.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
erpCustomerId
string

Alleen met module pricing; dan bevat het antwoord per artikel het blok price.

required
Array of objects [ 1 .. 500 ] items

Responses

Request samples

Content type
application/json
{
  • "erpCustomerId": "string",
  • "keys": [
    ]
}

Response samples

Content type
application/json
{
  • "asOf": "2019-08-24T14:15:22Z",
  • "warnings": [
    ],
  • "items": [
    ]
}

Artikelstam, volledig of als delta

Zonder updatedSince de volledige stam, gepagineerd. Met updatedSince alleen rijen die sindsdien gewijzigd zijn, inclusief inactief gemaakte artikelen (active: false). Stabiele sortering op (updatedAt, erpArticleId).

Authorizations:
bearerKey
query Parameters
updatedSince
string <date-time>

Alleen rijen gewijzigd op of na dit tijdstip (inclusief), op milliseconden en met offset; zonder offset = 400. Gebruik de asOf van de vorige pagina-reeks. Een niet-gecodeerde + (spatie) mag het ERP als + lezen.

cursor
string

Ondoorzichtige cursor uit nextCursor van de vorige pagina; draagt positie en de asOf van de eerste pagina en is ten minste 24 uur geldig. De filters gaan bij elke pagina opnieuw mee; wijken ze af van de eerste pagina, dan mag het ERP ze negeren of 400 invalid_cursor geven. Ongeldig of verlopen = 400 invalid_cursor.

limit
integer [ 1 .. 1000 ]
Default: 500
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "nextCursor": "string",
  • "asOf": "2019-08-24T14:15:22Z",
  • "totalCount": 0,
  • "items": [
    ]
}

Artikel aanleggen of bijwerken vanuit het platform

Sleutel is de artikelsleutel (erpArticleId als bekend, anders EAN of artikelnummer + merk), gezocht volgens spec hoofdstuk 6. Bestaat het artikel niet, dan wordt het aangelegd (201). Bestaat het, dan (200):

  • articleNumber, brand en ean blijven ongemoeid (de schrijfwijze van de grossier wint);
  • de overige meegegeven velden worden bijgewerkt; null of weggelaten = niet wijzigen;
  • suppliers wordt per supplierCode bijgewerkt of aangevuld, nooit verwijderd;
  • een inactief artikel wordt weer actief.

Een onbekend erpArticleId is 404; een sleutel die op meer artikelen past is 422 business_rule; een inkoopprijs van 0 of lager is 400. Een onbekende supplierCode wordt bewaard zoals meegegeven. Idempotent: nogmaals sturen geeft hetzelfde artikel. Het antwoord bevat suppliers, vatRate en salesPriceGross zoals het ERP ze nu kent.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
erpArticleId
string

Als bekend; anders zoekt het ERP op EAN of artikelnummer + merk.

articleNumber
required
string <= 50 characters
brand
required
string <= 80 characters
ean
string or null^[0-9]{8,14}$
description
required
string <= 200 characters
orderUnit
integer >= 1
Default: 1
category
string
vatRate
number
salesPriceGross
number

Bruto adviesprijs, als het platform die kent.

imageUrl
string <uri>
Array of objects (ArticleSupplier)

Leveranciers met inkoopprijs; code uit GET /suppliers, of de naam zoals het platform hem kent als het platform geen code van het ERP heeft. Bij bijwerken per supplierCode bijgewerkt of aangevuld, nooit verwijderd.

Responses

Request samples

Content type
application/json
{
  • "erpArticleId": "string",
  • "articleNumber": "string",
  • "brand": "string",
  • "ean": "string",
  • "description": "string",
  • "orderUnit": 1,
  • "category": "string",
  • "vatRate": 0,
  • "salesPriceGross": 0,
  • "imageUrl": "http://example.com",
  • "suppliers": [
    ]
}

Response samples

Content type
application/json
{
  • "erpArticleId": "string",
  • "articleNumber": "string",
  • "brand": "string",
  • "ean": "string",
  • "description": "string",
  • "orderUnit": 1,
  • "active": true,
  • "replacedBy": "string",
  • "category": "string",
  • "imageUrl": "http://example.com",
  • "vatRate": 0,
  • "salesPriceGross": 0,
  • "suppliers": [
    ],
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Eén artikel op ERP-artikel-id

Authorizations:
bearerKey
path Parameters
erpArticleId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "erpArticleId": "string",
  • "articleNumber": "string",
  • "brand": "string",
  • "ean": "string",
  • "description": "string",
  • "orderUnit": 1,
  • "active": true,
  • "replacedBy": "string",
  • "category": "string",
  • "imageUrl": "http://example.com",
  • "vatRate": 0,
  • "salesPriceGross": 0,
  • "suppliers": [
    ],
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Voorraad

Vrije voorraad per vestiging, in bulk.

Vrije voorraad per vestiging, volledig of als delta

Eén rij per artikel per vestiging. quantityFree = fysiek aanwezig min gereserveerd. Een artikel dat op een vestiging op nul staat komt met quantityFree: 0 terug zodat de kopie wordt bijgewerkt. updatedAt van een rij wijzigt bij elke mutatie van aanwezig, gereserveerd of expectedAt; rijen van inactieve artikelen blijven staan. Zonder vestigingen (feature branches false) één rij per artikel, zonder branchCode. Stabiele sortering op (updatedAt, erpArticleId, branchCode).

Authorizations:
bearerKey
query Parameters
updatedSince
string <date-time>

Alleen rijen gewijzigd op of na dit tijdstip (inclusief), op milliseconden en met offset; zonder offset = 400. Gebruik de asOf van de vorige pagina-reeks. Een niet-gecodeerde + (spatie) mag het ERP als + lezen.

cursor
string

Ondoorzichtige cursor uit nextCursor van de vorige pagina; draagt positie en de asOf van de eerste pagina en is ten minste 24 uur geldig. De filters gaan bij elke pagina opnieuw mee; wijken ze af van de eerste pagina, dan mag het ERP ze negeren of 400 invalid_cursor geven. Ongeldig of verlopen = 400 invalid_cursor.

branchCode
string

Onbekende vestiging = 400.

limit
integer [ 1 .. 5000 ]
Default: 2000
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "nextCursor": "string",
  • "asOf": "2019-08-24T14:15:22Z",
  • "totalCount": 0,
  • "items": [
    ]
}

Klanten

Debiteuren van de grossier.

Klanten opzoeken (debiteurnummer, platformreferentie, e-mail) of als delta

Precies één van debtorNumber, platformReference, email of updatedSince. Vergelijking van debtorNumber genormaliseerd (letters en cijfers, hoofdletterongevoelig); het ERP geeft alle klanten die passen. Meer dan één treffer is dubbelzinnig: het platform koppelt dan niet. updatedSince met een tijdstip ver in het verleden levert de volledige klantenlijst.

Authorizations:
bearerKey
query Parameters
debtorNumber
string
platformReference
string
email
string <email>
updatedSince
string <date-time>

Alleen rijen gewijzigd op of na dit tijdstip (inclusief), op milliseconden en met offset; zonder offset = 400. Gebruik de asOf van de vorige pagina-reeks. Een niet-gecodeerde + (spatie) mag het ERP als + lezen.

cursor
string

Ondoorzichtige cursor uit nextCursor van de vorige pagina; draagt positie en de asOf van de eerste pagina en is ten minste 24 uur geldig. De filters gaan bij elke pagina opnieuw mee; wijken ze af van de eerste pagina, dan mag het ERP ze negeren of 400 invalid_cursor geven. Ongeldig of verlopen = 400 invalid_cursor.

limit
integer [ 1 .. 500 ]
Default: 100
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "nextCursor": "string",
  • "asOf": "2019-08-24T14:15:22Z",
  • "totalCount": 0,
  • "items": [
    ]
}

Nieuwe debiteur aanmaken

Idempotent op platformReference. Het ERP kent debiteurnummer en betaalvoorwaarden toe en geeft ze terug. Bestaat er al een debiteur met hetzelfde e-mailadres of KvK-nummer, dan mag het ERP weigeren met 422 business_rule. Het platform plaatst de order daarna op het teruggegeven erpCustomerId; een order maakt zelf nooit een klant aan.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
platformReference
required
string <= 64 characters

Idempotentiesleutel.

name
required
string
required
object (Address)

Het platform heeft één adresregel: ontbreekt houseNumber, dan mag street straat en huisnummer samen bevatten.

object (Address)
email
string <email>

Optioneel; het platform heeft niet van elke garage een e-mailadres.

phone
string
vatNumber
string
chamberOfCommerceNumber
string
branchCode
string

Responses

Request samples

Content type
application/json
{
  • "platformReference": "string",
  • "name": "string",
  • "address": {
    },
  • "deliveryAddress": {
    },
  • "email": "user@example.com",
  • "phone": "string",
  • "vatNumber": "string",
  • "chamberOfCommerceNumber": "string",
  • "branchCode": "string"
}

Response samples

Content type
application/json
{
  • "erpCustomerId": "string",
  • "debtorNumber": "string",
  • "platformReference": "string",
  • "name": "string",
  • "address": {
    },
  • "deliveryAddress": {
    },
  • "email": "user@example.com",
  • "phone": "string",
  • "branchCode": "string",
  • "routeCode": "string",
  • "isBlocked": true,
  • "blockReason": "string",
  • "paymentTerms": "account",
  • "creditLimit": 0,
  • "openBalance": 0,
  • "iban": "string",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Garage-inlog valideren

Het platform roept dit alleen aan bij het inloggen. Daarna werkt het op erpCustomerId. Een mislukte inlog is 401 met code: invalid_credentials, geen 200 met een vlag. De inlognaam is hoofdletterongevoelig, het wachtwoord hoofdlettergevoelig. Een geblokkeerde klant logt in en komt terug met isBlocked: true.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
login
required
string
password
required
string <password>

Responses

Request samples

Content type
application/json
{
  • "login": "string",
  • "password": "pa$$word"
}

Response samples

Content type
application/json
{
  • "erpCustomerId": "string",
  • "debtorNumber": "string",
  • "platformReference": "string",
  • "name": "string",
  • "address": {
    },
  • "deliveryAddress": {
    },
  • "email": "user@example.com",
  • "phone": "string",
  • "branchCode": "string",
  • "routeCode": "string",
  • "isBlocked": true,
  • "blockReason": "string",
  • "paymentTerms": "account",
  • "creditLimit": 0,
  • "openBalance": 0,
  • "iban": "string",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Klant lezen

Authorizations:
bearerKey
path Parameters
erpCustomerId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "erpCustomerId": "string",
  • "debtorNumber": "string",
  • "platformReference": "string",
  • "name": "string",
  • "address": {
    },
  • "deliveryAddress": {
    },
  • "email": "user@example.com",
  • "phone": "string",
  • "branchCode": "string",
  • "routeCode": "string",
  • "isBlocked": true,
  • "blockReason": "string",
  • "paymentTerms": "account",
  • "creditLimit": 0,
  • "openBalance": 0,
  • "iban": "string",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Platformreferentie op een bestaande debiteur zetten

Wijzigt alleen platformReference; andere velden in de body negeert het ERP. Daarna is de klant te vinden met GET /customers?platformReference=. Nogmaals met dezelfde waarde geeft 200 met dezelfde klant. Draagt een andere klant deze referentie al, dan 422 business_rule.

Authorizations:
bearerKey
path Parameters
erpCustomerId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
platformReference
required
string <= 64 characters

Responses

Request samples

Content type
application/json
{
  • "platformReference": "string"
}

Response samples

Content type
application/json
{
  • "erpCustomerId": "string",
  • "debtorNumber": "string",
  • "platformReference": "string",
  • "name": "string",
  • "address": {
    },
  • "deliveryAddress": {
    },
  • "email": "user@example.com",
  • "phone": "string",
  • "branchCode": "string",
  • "routeCode": "string",
  • "isBlocked": true,
  • "blockReason": "string",
  • "paymentTerms": "account",
  • "creditLimit": 0,
  • "openBalance": 0,
  • "iban": "string",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Orders

Verkooporders plaatsen en lezen.

Verkooporder plaatsen (idempotent)

platformReference is de idempotentiesleutel, uniek per grossier. Het ERP controleert hem vóór elke andere validatie.

  • Nieuw: 201 met de aangemaakte, bevestigde order; het ERP legt de order vast vóór het antwoordt.
  • Bestaat al: 200 met de bestaande order in zijn huidige stand, ongeacht de inhoud van de nieuwe aanvraag, ook als die nu ongeldig zou zijn; het ERP vergelijkt niet.

Een onbekende klant is 404, een onbekende vestiging 400, een geblokkeerde klant 422 customer_blocked. Boven de kredietlimiet neemt het ERP de order aan en mag het regels op manual zetten; weigeren op krediet is 422 business_rule. Een onbekend artikel wijst de order niet af: de regel krijgt status: manual. Met module articles.manage legt het platform het artikel vóór de order aan; de regel volgt daarna de gewone regelstatussen (zie OrderLineStatus). Het ERP boekt unitPriceNet zoals meegegeven. Met module pricing vergelijkt het exact op twee decimalen met zijn actuele berekening bij het bestelde aantal; bij een verschil mag het corrigeren en meldt het dat met priceCorrected en requestedUnitPriceNet. Bij payment.method: online corrigeert het niet; toeslagen (per regel en op orderniveau) corrigeert het nooit. Eigen voorraad wordt gereserveerd op source.branchCode, anders delivery.branchCode, anders de vestiging van de klant.

Toeslagen op orderniveau (verzendkosten, kleine-orderkosten, bezorgtoeslag) komen in surcharges, nooit als artikelregel; het ERP legt ze vast zoals het wil, geeft ze terug in Order.surcharges en telt ze mee in totalNet en totalGross. Het levermoment op de kop (delivery.promisedAt) geldt voor elke regel zonder eigen promisedAt; het ERP neemt beide over zoals meegegeven. Na het plaatsen is statusCode ten minste confirmed.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
platformReference
required
string <= 64 characters

Idempotentiesleutel; uniek per bestelling.

erpCustomerId
required
string
customerReference
string <= 100 characters

Referentie van de garage of het garagepakket, bijv. een werkordernummer.

remark
string <= 2000 characters
source
string
Enum: "webshop" "integrator" "platform"

Waar de bestelling vandaan komt: webshop = de garage in de shop; integrator = vanuit garagesoftware; platform = een order die de grossier in het platform namens de garage invoert.

orderedAt
string <date-time>

Tijdstip van bestellen volgens het platform; het ERP boekt dit tijdstip.

required
object (Delivery)
required
object (Payment)
Array of objects (OrderSurcharge)

Toeslagen op orderniveau, optioneel. Verzendkosten, kleine-orderkosten en bezorgtoeslag staan hier, nooit als regel.

required
Array of objects (OrderLineCreate) [ 1 .. 200 ] items

Responses

Request samples

Content type
application/json
{
  • "platformReference": "string",
  • "erpCustomerId": "string",
  • "customerReference": "string",
  • "remark": "string",
  • "source": "webshop",
  • "orderedAt": "2019-08-24T14:15:22Z",
  • "delivery": {
    },
  • "payment": {
    },
  • "surcharges": [
    ],
  • "lines": [
    ]
}

Response samples

Content type
application/json
{
  • "erpOrderId": "string",
  • "erpOrderNumber": "string",
  • "erpCustomerId": "string",
  • "platformReference": "string",
  • "customerReference": "string",
  • "remark": "string",
  • "source": "webshop",
  • "orderedAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "statusCode": "open",
  • "status": "string",
  • "deliveryStatus": "pending",
  • "isCredit": true,
  • "delivery": {
    },
  • "payment": {
    },
  • "surcharges": [
    ],
  • "totalNet": 0,
  • "totalGross": 0,
  • "documents": {},
  • "lines": [
    ]
}

Orders van een klant, als delta of met zoekfilter

Twee gebruikswijzen. Delta (updatedSince): over alle klanten, of met erpCustomerId per klant; sortering oplopend op (updatedAt, erpOrderId), sort wordt genegeerd. Zoeken (zonder updatedSince): erpCustomerId verplicht, tenzij op platformReference wordt gezocht; sort naar keuze. De zoekfilters werken ook op regelniveau (articleNumber, vehicleRegistration, text) en geven dan de hele order terug, met alle regels. Delta en zoekfilters mogen samen; alle filters gelden tegelijk. Alleen platformReference is het minimum; elke andere combinatie vraagt feature orders.history. Retouren die via het platform zijn aangemeld staan nooit in deze lijst (zie /returns).

Authorizations:
bearerKey
query Parameters
erpCustomerId
string

Verplicht bij zoeken; optioneel bij een delta of bij platformReference. Onbekend = 404.

platformReference
string
updatedSince
string <date-time>

Alleen rijen gewijzigd op of na dit tijdstip (inclusief), op milliseconden en met offset; zonder offset = 400. Gebruik de asOf van de vorige pagina-reeks. Een niet-gecodeerde + (spatie) mag het ERP als + lezen.

sort
string
Enum: "orderedAt:asc" "orderedAt:desc" "updatedAt:asc" "updatedAt:desc"

Alleen bij zoeken. Standaard orderedAt:desc.

orderNumber
string

Exact op het ordernummer, na normalisatie (letters en cijfers, hoofdletterongevoelig).

articleNumber
string

Artikelnummer op een regel, exact na normalisatie (ongevoelig voor hoofdletters, spaties en leestekens).

vehicleRegistration
string

Kenteken of VIN op een regel, exact na normalisatie.

text
string

Deel van de tekst, hoofdletterongevoelig, in ordernummer, customerReference, platformReference, opmerkingen op order en regel, en omschrijvingen van regel en voertuig.

deliveryStatus
Array of strings (DeliveryStatus)
Items Enum: "pending" "partial" "full" "cancelled"

Eén of meer waarden, kommagescheiden.

cursor
string

Ondoorzichtige cursor uit nextCursor van de vorige pagina; draagt positie en de asOf van de eerste pagina en is ten minste 24 uur geldig. De filters gaan bij elke pagina opnieuw mee; wijken ze af van de eerste pagina, dan mag het ERP ze negeren of 400 invalid_cursor geven. Ongeldig of verlopen = 400 invalid_cursor.

limit
integer [ 1 .. 500 ]
Default: 100
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "nextCursor": "string",
  • "asOf": "2019-08-24T14:15:22Z",
  • "totalCount": 0,
  • "items": [
    ]
}

Eén order

Geeft elke order van de grossier, ongeacht de klant; de sleutel is per grossier en het platform controleert zelf of de order bij de vragende klant hoort.

Authorizations:
bearerKey
path Parameters
erpOrderId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "erpOrderId": "string",
  • "erpOrderNumber": "string",
  • "erpCustomerId": "string",
  • "platformReference": "string",
  • "customerReference": "string",
  • "remark": "string",
  • "source": "webshop",
  • "orderedAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "statusCode": "open",
  • "status": "string",
  • "deliveryStatus": "pending",
  • "isCredit": true,
  • "delivery": {
    },
  • "payment": {
    },
  • "surcharges": [
    ],
  • "totalNet": 0,
  • "totalGross": 0,
  • "documents": {},
  • "lines": [
    ]
}

Pakbon- of factuur-PDF van een order

Het document met de sleutel, voor het platform; het platform geeft het zelf aan de garage door. Het zusje van GET /invoices/{erpInvoiceId}/document. Bestaat het document (nog) niet, dan 404.

Authorizations:
bearerKey
path Parameters
erpOrderId
required
string
kind
required
string
Enum: "packingSlip" "invoice"
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/problem+json
{
  • "title": "string",
  • "status": 0,
  • "detail": "string",
  • "code": "validation_error",
  • "requestId": "string",
  • "errors": [
    ]
}

Facturen

Facturen en creditnota's.

Facturen en creditnota's, per klant of als delta

Met updatedSince is erpCustomerId optioneel (delta over alle klanten); zonder is hij verplicht. Zonder delta aflopend op factuurdatum, daarna id. unpaidOnly = open en partial, ook open creditnota's.

Authorizations:
bearerKey
query Parameters
erpCustomerId
string

Verplicht zonder updatedSince. Onbekend = 404.

updatedSince
string <date-time>

Alleen rijen gewijzigd op of na dit tijdstip (inclusief), op milliseconden en met offset; zonder offset = 400. Gebruik de asOf van de vorige pagina-reeks. Een niet-gecodeerde + (spatie) mag het ERP als + lezen.

unpaidOnly
boolean
Default: false
cursor
string

Ondoorzichtige cursor uit nextCursor van de vorige pagina; draagt positie en de asOf van de eerste pagina en is ten minste 24 uur geldig. De filters gaan bij elke pagina opnieuw mee; wijken ze af van de eerste pagina, dan mag het ERP ze negeren of 400 invalid_cursor geven. Ongeldig of verlopen = 400 invalid_cursor.

limit
integer [ 1 .. 500 ]
Default: 100
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "nextCursor": "string",
  • "asOf": "2019-08-24T14:15:22Z",
  • "totalCount": 0,
  • "items": [
    ]
}

Factuur- of creditnota-PDF

Het document met de sleutel, voor het platform; het platform geeft het zelf aan de garage door. Daarnaast is er documentUrl (zonder sleutel, tijdgebonden), ook alleen voor het platform. Bestaat het document (nog) niet, dan 404.

Authorizations:
bearerKey
path Parameters
erpInvoiceId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/problem+json
{
  • "title": "string",
  • "status": 0,
  • "detail": "string",
  • "code": "validation_error",
  • "requestId": "string",
  • "errors": [
    ]
}

Retouren

Retouraanmeldingen en hun status.

Retour aanmelden (idempotent)

Idempotent op platformReference, zoals een order. Elke regel verwijst naar een regel van een eerdere order (erpOrderId of erpOrderNumber, plus orderLineNo of article). Staat het artikel op meer regels van die order, dan 422 business_rule met het verzoek orderLineNo mee te geven. Per orderregel hoogstens het geleverde aantal min eerder aangemelde retouren, per soort (article, coreOnly) apart; afgewezen retouren tellen niet mee. Overschrijden is 422 met errors[] per regel.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
platformReference
required
string <= 64 characters
erpCustomerId
required
string
remark
string <= 2000 characters
refundIban
string or null
required
Array of ReturnLineCreate (object) or ReturnLineCreate (object) (ReturnLineCreate) non-empty

Responses

Request samples

Content type
application/json
{
  • "platformReference": "string",
  • "erpCustomerId": "string",
  • "remark": "string",
  • "refundIban": "string",
  • "lines": [
    ]
}

Response samples

Content type
application/json
{
  • "erpReturnId": "string",
  • "erpReturnNumber": "string",
  • "erpCustomerId": "string",
  • "platformReference": "string",
  • "status": "announced",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "creditNoteNumber": "string",
  • "refundIban": "string",
  • "remark": "string",
  • "lines": [
    ]
}

Retouren, per klant, op platformreferentie of als delta

Twee gebruikswijzen, zoals bij orders. Delta (updatedSince): over alle klanten, of met erpCustomerId per klant; oplopend op (updatedAt, erpReturnId), met dezelfde cursor- en asOf-regels als orders en facturen. Zo haalt het platform retourwijzigingen periodiek op. Per klant (zonder updatedSince): erpCustomerId verplicht, tenzij op platformReference wordt gezocht; aflopend op aanmaakmoment, daarna id. Zo leest het platform live als de garage zijn retouren opent. Een onbekende erpCustomerId is 404.

Authorizations:
bearerKey
query Parameters
erpCustomerId
string

Verplicht zonder updatedSince en zonder platformReference. Onbekend = 404.

platformReference
string
updatedSince
string <date-time>

Alleen rijen gewijzigd op of na dit tijdstip (inclusief), op milliseconden en met offset; zonder offset = 400. Gebruik de asOf van de vorige pagina-reeks. Een niet-gecodeerde + (spatie) mag het ERP als + lezen.

cursor
string

Ondoorzichtige cursor uit nextCursor van de vorige pagina; draagt positie en de asOf van de eerste pagina en is ten minste 24 uur geldig. De filters gaan bij elke pagina opnieuw mee; wijken ze af van de eerste pagina, dan mag het ERP ze negeren of 400 invalid_cursor geven. Ongeldig of verlopen = 400 invalid_cursor.

limit
integer [ 1 .. 500 ]
Default: 100
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "nextCursor": "string",
  • "asOf": "2019-08-24T14:15:22Z",
  • "totalCount": 0,
  • "items": [
    ]
}

Eén retour

Authorizations:
bearerKey
path Parameters
erpReturnId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "erpReturnId": "string",
  • "erpReturnNumber": "string",
  • "erpCustomerId": "string",
  • "platformReference": "string",
  • "status": "announced",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "creditNoteNumber": "string",
  • "refundIban": "string",
  • "remark": "string",
  • "lines": [
    ]
}

Inkoop

Module purchaseOrders.

Leveranciers zoals het ERP ze kent

De grossier legt in het platform vast welke leverancier bij welke code hoort. Op een inkooporder gebruikt het platform alleen codes uit deze lijst; voor een leverancier zonder code maakt het geen inkooporder in het ERP, maar koopt het zelf in.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Inkooporder per leverancier plaatsen (idempotent)

Idempotent op platformReference; dat is de enige uniciteit. Een tweede inkooporder voor dezelfde verkooporder en leverancier met een andere referentie is toegestaan. Het platform stuurt alleen een supplierCode uit GET /suppliers; voor een leverancier zonder code in het ERP plaatst het geen inkooporder, maar koopt het zelf in. Een leverancier die het ERP niet kent is 422 business_rule. Het antwoord geeft per regel orderLineNo, description en expectedAtWholesaler terug.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
platformReference
required
string <= 64 characters

Idempotentiesleutel, bijv. ':'.

erpOrderId
required
string

De verkooporder waar deze inkoop bij hoort.

supplierCode
required
string

Code uit GET /suppliers; het platform stuurt geen andere. Onbekend = 422 business_rule.

mode
required
string
Enum: "confirmed" "draft"
expectedAtWholesaler
string or null <date-time>
required
Array of objects non-empty

Responses

Request samples

Content type
application/json
{
  • "platformReference": "string",
  • "erpOrderId": "string",
  • "supplierCode": "string",
  • "mode": "confirmed",
  • "expectedAtWholesaler": "2019-08-24T14:15:22Z",
  • "lines": [
    ]
}

Response samples

Content type
application/json
{
  • "erpPurchaseOrderId": "string",
  • "erpPurchaseOrderNumber": "string",
  • "erpOrderId": "string",
  • "platformReference": "string",
  • "supplierCode": "string",
  • "status": "draft",
  • "lines": [
    ]
}

Inkooporders bij een verkooporder

Authorizations:
bearerKey
query Parameters
erpOrderId
string

De verkooporder waar de inkooporders bij horen.

platformReference
string

Terugvinden na een verloren antwoord. Eén van beide parameters is verplicht.

header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Routes

Module deliverySchedule.

Routeschema van een klant

Tijden in Europe/Amsterdam, zonder uitzonderingen (feestdagen). Een klant zonder routes krijgt een lege lijst routes, geen 404. Het schema geldt voor regels uit eigen voorraad (source.kind ownStock); voor regels die de grossier eerst bij een leverancier haalt, bepaalt het platform het levermoment zelf en geeft het dat per regel mee (promisedAt op de regel).

Authorizations:
bearerKey
path Parameters
erpCustomerId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "erpCustomerId": "string",
  • "routeCode": "string",
  • "routes": [
    ]
}

Exports

Module exports.

Export als bestand starten

De job is ten minste 24 uur op te vragen met GET /exports/{exportId}; het platform vraagt de status op met een oplopende tussenpoos tot 5 seconden. Onbekende branchCode = 400.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
dataset
required
string
Enum: "articles" "stock"
updatedSince
string <date-time>

Leeg = volledige set.

branchCode
string

Responses

Request samples

Content type
application/json
{
  • "dataset": "articles",
  • "updatedSince": "2019-08-24T14:15:22Z",
  • "branchCode": "string"
}

Response samples

Content type
application/json
{
  • "exportId": "string",
  • "dataset": "articles",
  • "status": "pending",
  • "requestedAt": "2019-08-24T14:15:22Z",
  • "asOf": "2019-08-24T14:15:22Z",
  • "rowCount": 0,
  • "downloadUrl": "http://example.com",
  • "expiresAt": "2019-08-24T14:15:22Z",
  • "error": "string"
}

Status en download-URL van een export

Authorizations:
bearerKey
path Parameters
exportId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "exportId": "string",
  • "dataset": "articles",
  • "status": "pending",
  • "requestedAt": "2019-08-24T14:15:22Z",
  • "asOf": "2019-08-24T14:15:22Z",
  • "rowCount": 0,
  • "downloadUrl": "http://example.com",
  • "expiresAt": "2019-08-24T14:15:22Z",
  • "error": "string"
}

Testomgeving

Module testing: reset en beheerhandelingen voor de acceptatiescenario's (spec 8.4). Alleen met environment: test.

Testdata terugzetten naar de beginstand

Zet alle testdata terug. Cursors van vóór de reset mogen 400 invalid_cursor geven.

Authorizations:
bearerKey
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "asOf": "2019-08-24T14:15:22Z"
}

Voorraad van een artikel zetten (testomgeving)

Zet per genoemde vestiging de aanwezige en de gereserveerde voorraad, en eventueel expectedAt. Vestigingen die niet in de aanvraag staan, blijven ongewijzigd. De voorraadrij krijgt een nieuwe updatedAt, zoals bij een gewone mutatie. Op productie 501.

Authorizations:
bearerKey
path Parameters
erpArticleId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
required
Array of objects non-empty

Responses

Request samples

Content type
application/json
{
  • "levels": [
    ]
}

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Order (deels) leveren (testomgeving)

Zet per regel het geleverde aantal. Zonder deliveryStatus leidt het ERP de leverstatus af uit de aantallen (regels met rejected tellen niet mee); met deliveryStatus neemt het die over. statusCode volgt (processing of delivered). De order krijgt een nieuwe updatedAt. Op productie 501.

Authorizations:
bearerKey
path Parameters
erpOrderId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
deliveryStatus
string (DeliveryStatus)
Enum: "pending" "partial" "full" "cancelled"

Optioneel; zonder leidt het ERP de leverstatus af uit de aantallen.

required
Array of objects non-empty

Responses

Request samples

Content type
application/json
{
  • "deliveryStatus": "pending",
  • "lines": [
    ]
}

Response samples

Content type
application/json
{
  • "erpOrderId": "string",
  • "erpOrderNumber": "string",
  • "erpCustomerId": "string",
  • "platformReference": "string",
  • "customerReference": "string",
  • "remark": "string",
  • "source": "webshop",
  • "orderedAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "statusCode": "open",
  • "status": "string",
  • "deliveryStatus": "pending",
  • "isCredit": true,
  • "delivery": {
    },
  • "payment": {
    },
  • "surcharges": [
    ],
  • "totalNet": 0,
  • "totalGross": 0,
  • "documents": {},
  • "lines": [
    ]
}

Order annuleren (testomgeving)

Annuleert de order; daarna deliveryStatus en statusCode cancelled en een nieuwe updatedAt. Op productie 501.

Authorizations:
bearerKey
path Parameters
erpOrderId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Responses

Response samples

Content type
application/json
{
  • "erpOrderId": "string",
  • "erpOrderNumber": "string",
  • "erpCustomerId": "string",
  • "platformReference": "string",
  • "customerReference": "string",
  • "remark": "string",
  • "source": "webshop",
  • "orderedAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "statusCode": "open",
  • "status": "string",
  • "deliveryStatus": "pending",
  • "isCredit": true,
  • "delivery": {
    },
  • "payment": {
    },
  • "surcharges": [
    ],
  • "totalNet": 0,
  • "totalGross": 0,
  • "documents": {},
  • "lines": [
    ]
}

Retourstatus zetten (testomgeving)

Zet de status van de retour volgens de toegestane overgangen (announced → received → credited; announced of received → rejected). Een andere overgang is 422 business_rule. Bij credited mag het gecrediteerde bedrag per regel mee; zonder rekent het ERP het zelf uit. De retour krijgt een nieuwe updatedAt. Op productie 501.

Authorizations:
bearerKey
path Parameters
erpReturnId
required
string
header Parameters
X-Request-Id
string <= 64 characters

Correlatie-id van het platform; overnemen in antwoord en logging. Ontbreekt hij, dan maakt het ERP er zelf een; is hij langer dan 64 tekens, dan neemt het ERP hem toch over.

Request Body schema: application/json
required
status
required
string
Enum: "received" "credited" "rejected"
Array of objects

Alleen bij credited, optioneel.

Responses

Request samples

Content type
application/json
{
  • "status": "received",
  • "lines": [
    ]
}

Response samples

Content type
application/json
{
  • "erpReturnId": "string",
  • "erpReturnNumber": "string",
  • "erpCustomerId": "string",
  • "platformReference": "string",
  • "status": "announced",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "creditNoteNumber": "string",
  • "refundIban": "string",
  • "remark": "string",
  • "lines": [
    ]
}