Proizvodi
Proizvod je ono što prodajete. Ima jednu ili više varijanti, jedinica koje držite na zalihama i prodajete, svaku sa sopstvenom šifrom i barkodom. Katalog šaljete preko POST /int/products, a čitate ga onako kako ga prodavnica vidi preko GET /products: aktivne proizvode, sa cenama za vaše tržište i valutu, na vašem jeziku.
Od čega se proizvod sastoji#
| Deo | Šta sadrži |
|---|---|
| product | Zajednički identitet: code, barcode, external_ref, slug, status, vrstu, jedinicu mere, slike, oznake. |
| variants | Jedinice koje držite na zalihama i prodajete, na primer veličine ili pakovanja. Svaka ima code, barcode i external_ref, i svoje zalihe, cene i slike. Proizvod uvek ima bar jednu. |
| details | Vaša polja: name, description, brend, težina i sve ostalo što vaša aplikacija definiše. Svako je tip podatka proizvoda vaše aplikacije (pogledajte GET /product_data_types). I naziv je detalj, a ne kolona. Detalji mogu da se prevode. |
| prices | Redovi u vašim katalozima (cenovnicima), po proizvodu ili po varijanti. Liste prikazuju cenu za tržište i valutu vašeg tokena. |
| attributes | Veze sa vašim definicijama atributa, na primer Boja › Crvena. |
| stock | Po varijanti po magacinu. Pogledajte Zalihe. |
status proizvoda je 0 nacrt, 1 aktivan, 2 arhiviran ili 3 povučen iz prodaje. Liste prikazuju samo aktivne proizvode koji imaju slug, i samo njihove aktivne varijante.
Kako se proizvodi i varijante uparuju#
U POST /int/products proizvode i varijante navodite onako kako ih vaš sistem zna:
- Proizvod: po našem
id, pa pocode, pa poexternal_ref. Važi prvi koji pronađe proizvod vaše aplikacije. Ako se ništa ne nađe, proizvod se pravi. - Varijanta: po
code, pa pobarcode, pa poexternal_ref. Ako se ništa ne nađe, varijanta se pravi na ovom proizvodu. Šifra koja pripada varijanti drugog proizvoda obara proizvod saProduct Variant not found.
Proizvode uparujte po code. POST /int/products čita external_ref da bi našao proizvod, ali ga ne čuva, pa proizvod koji napravi ne može kasnije da se nađe po external_ref. Varijante čuvaju svoj.
Proizvod u listama#
Ono što GET /products vraća za svaki proizvod. GET /product/{id} umesto toga vraća ceo zapis.
| Polje | Opis |
|---|---|
| idinteger | Naš id proizvoda. |
| code, barcode, external_refstring · može biti null | Identifikatori proizvoda. Svaki je jedinstven u vašoj aplikaciji. |
| slugstring | Naziv u URL-u koji prodavnica koristi. |
| statusinteger | Ovde uvek 1: liste sadrže samo aktivne proizvode. |
| product_type_id, product_type, product_type_name | Vrsta: real, service i ostale iz GET /product_types. |
| measuring_unit_id, measuring_unitmože biti null | Jedinica mere, iz GET /measuring_units. |
| name, description, …polja detalja | Vaši detalji, svaki pod nazivom svog tipa podatka, na jeziku tokena. |
| track_stock, available_onlineboolean | Da li se prate zalihe i da li se proizvod prodaje onlajn. |
| tags, catalog_tagsniz stringova | Oznake proizvoda i oznake kataloga koji mu daju cenu. |
| image_url, images | Glavna slika i ostale. |
| product_attributesniz celih brojeva | Id-jevi povezanih definicija atributa. |
| pricesniz objekata | Najniža cena proizvoda za vaše tržište i valutu, kao jedan unos. Polja su ista kao u variants[].prices. |
| price_from, price_tonumber | Najniža i najviša cena varijante. |
| variantsniz objekata | Aktivne varijante: id, code, barcode, external_ref, slug, status, ordinal, image_url, images, tags, track_stock, on_stock, store_availability, prices i detalji varijante. Varijanta bez sopstvenih cena ili slika prikazuje one sa proizvoda. |
| variants[].on_stockboolean | Da li varijanta ima zalihe za prodaju. |
| variants[].store_availabilityniz objekata | Zalihe po prodavnici: app_location_id, code, name, adresa i quantity. |
| variants[].pricesniz objekata | Cene varijante za vaše tržište i valutu: price, default_price, member_price, volume_price, unit_price, member_unit_price, display_price (formatirana), currency_sign, currency_id, market_id, catalog_id, catalog_item_id, subscription_interval, subscription_qty. |
| review_score, review_count, sales_quantitynumber | Ocene i prodata količina. |
| inserted_atdatetime · ISO 8601, UTC | Kad je proizvod napravljen. Šalje se bez pomaka. |
Slanje proizvoda u paketu#
Pravi ili menja proizvode sa njihovim detaljima, varijantama, cenama i atributima. Svaki proizvod se uparuje po code i upisuje u sopstvenoj transakciji. Koristite ga da katalog držite usklađenim sa ERP-om.
Novi proizvodi počinju kao nacrti. Ovaj poziv ne postavlja status ni slug, pa proizvod koji napravi još nije u GET /products. Aktivirajte ga jednom preko POST /products, sa njegovim id, status: 1 i slug, ili u Admin-u.
Obrađuje se svaki proizvod iz poziva. Kad jedan ne prođe, odgovor je ta greška, ali proizvodi pre i posle njega se upisuju. Ispravite proizvod koji nije prošao i pošaljite poziv ponovo: proizvodi se uparuju po šifri, pa ponovljen poziv menja, a ne duplira. Izuzetak su slike, pogledajte niže.
Parametri tela zahteva
| Parametar | Opis |
|---|---|
| productsobaveznoniz objekata | Jedan unos po proizvodu. |
| products[].codestring | Vaša šifra proizvoda. Uparuje proizvod, ili postaje šifra novog. |
| products[].id, products[].external_ref | Drugi načini da se nađe postojeći proizvod. Pogledajte uparivanje. |
| products[].barcodestring | Barkod proizvoda. Uvek ga pošaljite za proizvod koji ga ima: izmena bez barcode ga briše. |
| products[].<detail>any | Svaki drugi ključ je detalj, na primer "name": "Hrana za pse" ili "brand": "Acme", upisan na jeziku tokena. Koristite nazive svojih tipova podataka malim slovima. Naziv koji vaša aplikacija još nema pravi novi tip podatka koji nije označen kao važeći, a GET /product/{id} ga izostavlja dok ga u Admin-u ne označite kao važeći. |
| products[].variantsniz objekata | Varijante, uparene po code, barcode ili external_ref. Ako ih izostavite, proizvod bez varijanti dobija jednu, sa šifrom i barkodom proizvoda. Prihvata se i kao product_variants. |
| variants[].code, variants[].barcode, variants[].external_refstring | Identifikatori varijante, svaki jedinstven u vašoj aplikaciji. |
| variants[].statusinteger · podrazumevano 1 | 1 aktivna. Druge vrednosti skrivaju varijantu iz lista. |
| variants[].<detail> | Detalji varijante, direktno na varijanti kao kod proizvoda, na primer "size": "2 kg". |
| variants[].prices, variants[].images | Sopstvene cene i slike varijante, kao niže. |
| products[].pricesniz objekata | Cene na nivou proizvoda, za varijante bez sopstvenih. Prihvata se i kao catalogs. |
| prices[].catalog_idobaveznointeger | Jedan od vaših kataloga. |
| prices[].pricenumber | Cena sa PDV-om. Šaljite brojeve, ili stringove sa tačkom kao decimalnim separatorom. |
| prices[].member_price, default_price, volume_pricenumber · podrazumevano price | Za novi red cene podrazumevano su jednake price. |
| prices[].unit_pricenumber | Cena po osnovnoj jedinici, na primer po kilogramu. |
| prices[].subscription_interval, subscription_qtyinteger | Za kataloge pretplata. Jedan red po katalogu, proizvodu, varijanti i intervalu. |
| imagesniz objekata | Na proizvodu ili varijanti: image_url (obavezno), tag, ordinal, alt_text. URL čuvamo onako kako ga pošaljete. Svaka slika se dodaje kao nova, pa slike pošaljite jednom, a ne uz svaku sinhronizaciju. |
| products[].product_attributesniz objekata | Definicije atributa za povezivanje, sa poljima iz attributes[] u PUT /int/product_attributes. |
Vraća
data: proizvode onako kako su upisani, svaki sa svojim poljima, product_attributes, variants (sa njihovim images i catalogs) i catalogs, redovima cena na nivou proizvoda. Cene su u ovom odgovoru stringovi, na primer "12.50". Detalji i slike proizvoda se ne vraćaju.
Liste preuzimaju svaki proizvod ubrzo pošto se njegova transakcija završi.
Greške
| Status | Kada |
|---|---|
| 401 | Token nedostaje ili je opozvan. Pogledajte Autentifikaciju. |
| 422 | Prvi proizvod koji nije prošao, na primer zauzeta šifra (API.Products.CodeAlreadyExists, BarcodeAlreadyExists), šifra varijante koju koristi drugi proizvod (Product Variant not found), katalog koji nije vaš (Please provide catalog ids that exist) ili detalj koji ne prolazi pravilo svog tipa podatka (API.ProductData.ValueNotValid). |
curl -X POST "https://api.morffeus.com/api/v2/int/products" \ -H "Authorization: Bearer $MORFFEUS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "products": [ { "code": "P-1001", "barcode": "8600123456000", "name": "Dog food", "brand": "Acme", "prices": [{ "catalog_id": 4, "price": 1290 }], "variants": [ { "code": "SKU-1001", "barcode": "8600123456789", "size": "2 kg" }, { "code": "SKU-1002", "barcode": "8600123456796", "size": "10 kg", "prices": [{ "catalog_id": 4, "price": 5490 }] } ] } ] }'
const res = await fetch('https://api.morffeus.com/api/v2/int/products', { method: 'POST', headers: { Authorization: `Bearer ${process.env.MORFFEUS_TOKEN}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ products: [{ code: 'P-1001', barcode: '8600123456000', name: 'Dog food', brand: 'Acme', prices: [{ catalog_id: 4, price: 1290 }], variants: [ { code: 'SKU-1001', barcode: '8600123456789', size: '2 kg' }, { code: 'SKU-1002', barcode: '8600123456796', size: '10 kg', prices: [{ catalog_id: 4, price: 5490 }] }, ], }], }), }); if (!res.ok) throw new Error(JSON.stringify(await res.json()));
{
"data": [
{
"id": 48377,
"code": "P-1001",
"barcode": "8600123456000",
"status": 0,
"slug": null,
"product_attributes": [],
"catalogs": [
{
"catalog_id": 4,
"product_id": 48377,
"product_variant_id": null,
"price": "1290",
…
}
],
"variants": [
{
"id": 91120,
"code": "SKU-1001",
"barcode": "8600123456789",
"status": 1,
"images": [],
…
},
{ "id": 91121, "code": "SKU-1002", … }
],
…
}
]
}
{
"errors": {
"message": ["Please provide catalog ids that exist"]
}
}
Lista proizvoda#
Vaši aktivni proizvodi onako kako ih prodavnica vidi, iz indeksa za pretragu koji prati vaše upise za nekoliko trenutaka i obnavlja se svake noći. Cene su za tržište i valutu vašeg tokena, a detalji na jeziku tokena.
Podrazumevano se prikazuju samo proizvodi na stanju. Pošaljite onlyOnStock=false da biste prikazali i ostale. Podešavanje aplikacije može da promeni ovo podrazumevano ponašanje.
Parametri upita
| Parametar | Opis |
|---|---|
| limitinteger · podrazumevano 10 | Proizvoda po stranici. Prihvata se i kao perPage. |
| offsetinteger | Koliko proizvoda da se preskoči. Ili pošaljite pageNo, od 1. |
| id, code, barcode, slug | Nalaženje po identifikatoru. code se poredi sa šifrom proizvoda ili bilo koje varijante; barcode sa barkodovima varijanti; id prima listu odvojenu zarezima. Jedan od njih sam vraća jedan proizvod u data, ili {} kad ništa ne odgovara. |
| searchstring | Reči iz naziva proizvoda, najbolji pogoci prvi. |
| searchAllstring | Kao search, i još šifre i barkodovi proizvoda i varijanti. Tačna šifra ide prva. |
| priceFrom, priceTonumber | Raspon cena, poredi se sa price_from i price_to. |
| attributeDefIdslista celih brojeva | Proizvodi povezani sa bilo kojom od ovih definicija atributa. |
| baseAttributeDefIdslista celih brojeva | Proizvodi povezani sa svima njima. |
| attributeDefSlugstring | Proizvodi ispod definicije sa ovim slugom, ili putanje slugova. |
| productTags, tagslista stringova | Proizvodi sa bilo kojom od ovih oznaka, ili sa cenom u katalozima sa bilo kojom od ovih oznaka. |
| onlyOnStockboolean | Pogledajte napomenu iznad. |
| orderBystring · podrazumevano naziv | name, price, inserted_at ili sales_quantity, svaki po želji sa desc malim slovima iza. Više njih odvojite zarezom bez razmaka. Pogledajte Paginaciju i filtriranje. |
| productListOnlyoznaka | Vraća data kao običnu listu proizvoda. Uključuje ga bilo koja vrednost. |
Vraća
Podrazumevano data.products, listu proizvoda, uz data.product_attributes, stablo atributa prikazanih proizvoda, i data.product_data_values, vrednosti detalja po kojima može da se filtrira. Ukupnog broja nema. GET /products/{id} je ista lista za jedan proizvod, i vraća {} sa 200 kad proizvod nije na listi.
curl "https://api.morffeus.com/api/v2/products?code=SKU-1001" \ -H "Authorization: Bearer $MORFFEUS_TOKEN"
{
"data": {
"id": 48377,
"code": "P-1001",
"slug": "dog-food",
"status": 1,
"name": "Dog food",
"brand": "Acme",
"product_type": "real",
"price_from": 1290.0,
"price_to": 5490.0,
"prices": [{
"price": 1290.0,
"display_price": "1.290,00",
"currency_sign": "RSD",
…
}],
"variants": [
{
"id": 91120,
"code": "SKU-1001",
"barcode": "8600123456789",
"size": "2 kg",
"on_stock": true,
"store_availability": [{
"app_location_id": 31,
"code": "NS-1",
"quantity": 40.0,
…
}],
"prices": [{
"catalog_id": 4,
"price": 1290.0,
"member_price": 1290.0,
"currency_id": 1,
…
}]
},
{ "id": 91121, "code": "SKU-1002", … }
],
…
}
}
Ceo proizvod#
Ceo zapis proizvoda iz baze, kakav god da mu je status: i nacrti. Koristite ga da proverite šta je sinhronizacija upisala.
Parametri upita
| Parametar | Opis |
|---|---|
| definitionboolean | true dodaje definition: vaše tipove podataka, sa njihovom vrstom, pravilima i dozvoljenim vrednostima. |
| catalogTypestring | Koje cene da se uključe: current, future, current_future ili past. Podrazumevano: sve. |
Vraća
data: polja proizvoda, njegove detalje pod nazivima tipova podataka (formatirani tekst kao {"value", "json"}), images, vat, product_attributes_names (povezane definicije kao stablo), prices (redove na nivou proizvoda za vaše tržište i valutu, sa nazivom i važenjem kataloga) i variants, svaku sa detaljima, images i prices. Proizvod koji nije u vašoj aplikaciji vraća 404 sa praznim telom.
curl "https://api.morffeus.com/api/v2/product/48377" \ -H "Authorization: Bearer $MORFFEUS_TOKEN"
{
"data": {
"id": 48377,
"code": "P-1001",
"status": 0,
"name": "Dog food",
"description": {
"value": "Complete food for adult dogs.",
"json": […]
},
"vat_id": 2,
"vat": { "vat_id": 2, "market_id": 1, "vat_name": "20%" },
"images": [],
"prices": [{
"catalog_id": 4,
"catalog_name": "Retail",
"price": 1290.0,
"valid": true,
…
}],
"variants": [{
"id": 91120,
"code": "SKU-1001",
"size": "2 kg",
"prices": […],
…
}],
…
}
}
Pravljenje ili izmena jednog proizvoda#
Upisuje jedan proizvod sa svim poljima, uključujući status, slug i external_ref. Bez id pravi proizvod; sa id jednog od vaših proizvoda menja taj proizvod. Proizvode ne traži po šifri.
Parametri tela zahteva
| Parametar | Opis |
|---|---|
| productobaveznoobject | Proizvod. |
| product.idinteger | Naš id, za izmenu. Id koji nije vaš obara poziv sa API.Products.NotFound. |
| product.code, barcode, external_refstring | Identifikatori, svaki jedinstven u vašoj aplikaciji. |
| product.slugstring | Naziv u URL-u. Liste ga zahtevaju. |
| product.statusinteger · podrazumevano 0 | 1 aktivira proizvod, pa ga liste prikazuju čim ima slug. |
| product.product_type_id, measuring_unit_idinteger | Iz lista šifarnika. |
| product.track_stock, available_onlineboolean | Podrazumevano false i true. |
| product.tags, image_url | Oznake i glavna slika. |
| product.detailsobject | Vaši detalji, po nazivu tipa podatka: {"name": "Hrana za pse"}. Ovde su ugnežđeni, za razliku od POST /int/products. |
| product.details_fill_onlyniz stringova | Nazivi detalja koji se upisuju samo kad proizvod još nema vrednost, pa izmene iz Admin-a ostaju. |
| product.data_managed_keysniz stringova | Nazivi detalja koje vodi vaš sistem: oni koje navedete a izostavite iz details brišu se, na svim jezicima. |
| product.vat_idinteger | Jedna od vaših stopa PDV-a iz GET /vats, za tržište vašeg tokena. Bez nje novi proizvod dobija podrazumevanu stopu tržišta. |
| product.variantsniz objekata | Varijanta sa id jedne od varijanti ovog proizvoda je menja; varijanta bez id se pravi. Ovde se ne uparuju po šifri. |
| product.prices, product.images | Kao u POST /int/products. |
| product.return_databoolean | true vraća ceo proizvod, kao GET /product/{id} sa definicijom. |
Vraća
data.id, id proizvoda, ili ceo proizvod sa return_data. Greške su iste kao u POST /int/products, uz 400 kad telo zahteva nema product. Za povezivanje atributa koristite PUT /int/product_attributes.
curl -X POST "https://api.morffeus.com/api/v2/products" \ -H "Authorization: Bearer $MORFFEUS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": { "id": 48377, "status": 1, "slug": "dog-food", "external_ref": "ERP-5510", "details": { "description": "Complete food for adult dogs." }, "details_fill_only": ["description"] } }'
{
"data": { "id": 48377 }
}
{
"errors": {
"Products": ["API.Products.CodeAlreadyExists"]
}
}
Provera koji proizvodi postoje#
Za svaku šifru ili barkod koji pošaljete kaže vam kom proizvodu i varijanti odgovara, bez ikakvog upisa. Pokrenite ga pre prve sinhronizacije da vidite šta će biti napravljeno.
Parametri tela zahteva
| Parametar | Opis |
|---|---|
| productsobaveznoniz objekata | Redovi sa code, barcode ili oba, plus sve ostalo što želite da vam se vrati. |
Vraća
data: vaše redove, istim redom. Prvo tražimo varijantu, po šifri ili barkodu, bez obzira na velika i mala slova i razmake oko vrednosti. Pogodak dodaje product_variant_id, product_id, product_name, product_variant_code i product_variant_barcode. Inače pogodak proizvoda dodaje product_id, product_name, product_code i product_barcode. Red bez ovih polja nije uparen. Nazivi su na podrazumevanom jeziku vaše aplikacije.
curl -X POST "https://api.morffeus.com/api/v2/product/verify" \ -H "Authorization: Bearer $MORFFEUS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "products": [{ "code": "SKU-1001" }, { "code": "SKU-9999" }] }'
{
"data": [
{
"code": "SKU-1001",
"product_variant_id": 91120,
"product_id": 48377,
"product_name": "Dog food",
"product_variant_code": "SKU-1001",
"product_variant_barcode": "8600123456789"
},
{ "code": "SKU-9999" }
]
}
Čitanje varijanti#
Sve varijante vaše aplikacije, kakav god im je status, onako kako su sačuvane: id, product_id, code, barcode, external_ref, slug, status, ordinal, image_url, tags, available_online, weight, base_unit_volume, product_type_id, inserted_at, updated_at. Lista nije podeljena na stranice, pa očekujte veliki odgovor; da biste za nekoliko proizvoda uparili šifre sa id-jevima, lakši je POST /product/verify.
GET /product_variants/{id} vraća jednu varijantu, ili 404 sa Product Variant not found. Status varijante je 1 aktivna; varijanta obrisana dok su je porudžbine ili zalihe još koristile ima status 2.
{
"data": {
"id": 91120,
"product_id": 48377,
"code": "SKU-1001",
"barcode": "8600123456789",
"external_ref": "ERP-778",
"status": 1,
"ordinal": 0,
…
}
}
Liste šifarnika#
Id-jevi na koje polja proizvoda upućuju. Pročitajte ih jednom i čuvajte mapu u svom sistemu.
| Poziv | Vraća |
|---|---|
| GET /product_data_types | Vaša polja detalja: id, name (ključ koji šaljete), type (string, text, list, boolean, float i drugi), translate, mandatory, valid, regex, variant_specific, filterable, searchable, ordinal i grupu kojoj pripadaju. |
| GET /vats | Vaše stope PDV-a za tržište tokena: id, name, percent, default, external_ref, market_id. |
| GET /measuring_units | Vaše jedinice mere: id, unit, description, decimal (da li količine smeju da imaju decimale), external_ref. |
| GET /product_types | Vrste proizvoda, iste za svaku aplikaciju: id, name, type, description, na primer real i service. |
Povezano#
- Atributi proizvoda: stablo definicija sa kojima se proizvodi povezuju.
- Katalozi: cenovnici, i kako cene stižu do proizvoda.
- Zalihe: količine po varijanti i magacinu.
- Vodič: Sinhronizacija kataloga iz ERP-a: prvo punjenje, pa samo izmene.