Sincronització per CSV: especificació completa
Especificació del CSV d'articles: camps, límits, atributs de cotxe i moto, i enviament per SFTP o per URL.
Per a la sincronització entre els clients i Portal Hero fem servir un sistema de fitxers CSV. El principal fitxer CSV és el d'articles (o feed d'articles), on es llisten tots els articles que es publiquen als diferents portals. En aquest fitxer es troben els articles amb les seves característiques.
Funcionament de la sincronització
La manera d'identificar cada article serà mitjançant el camp id en el qual ens basarem com a identificador únic per decidir si un article s'actualitza o deixa d'existir. Quan un article aparegui per primera vegada al feed d'articles, aquest es pujarà a tots els portals seleccionats pel client. Quan un article deixi d'estar present al feed es marcarà com a venut i quan es canviï qualsevol dada de l'article també serà actualitzat als portals. Per tenir més detalls de la sincronització en si els pots consultar aquí.
El format general d'aquests arxius CSV és el següent:
- Camps separats per comes
- La capçalera ha d'estar present per poder identificar els camps
- Camps delimitats per doble cometa (si és necessari o sempre)
- Codificació de l'arxiu UTF-8
Compartició d'arxius
Tenim dues opcions per fer-nos arribar l'arxiu:
- SFTP
Disposem d'un SFTP per compartir els arxius i facilitar l'intercanvi d'informació de manera segura. Es facilitaran les dades d'accés a l'SFTP (usuari i contrasenya) durant el procés d'onboarding.
La resta de dades comunes de connexió són les següents:- Host:
sftp.portalhero.pro - Port:
2222
A més l'SFTP està securitzat i restringit a nivell de xarxa i necessitarem una o diverses IPs per afegir-les a la nostra llista d'IPs d'accés permeses.
Dins de l'SFTP hi ha creada una carpeta anomenada upload on s'escriuran els arxius: Per al d'articles el nom de l'arxiu serà: item_feed.csv - Host:
- url
El feed d'articles pot ser enviat també via una URL pública des d'on el procés de Portal Hero el descarregarà en cada execució diària del procés.
La URL haurà de ser informada per part del client durant el procés d'onboarding. En cas de requerir més mesures de seguretat, ens pots facilitar qualsevol header(s) que afegirem a la petició.
Format dels arxius CSV
Relació dels camps, tipologia de detalls i exemples de l'arxiu CSV d'articles:
| Nom | Tipus | Obligatori | Descripció | Exemple |
|---|---|---|---|---|
| id | string | Sí | Identificador únic de l'article. Ha de ser únic per a tots els articles i és el que farem servir per fer referència als articles en les nostres comunicacions. (Longitud màxima: 150 caràcters) | wer432r |
| price | double | Sí | Preu en € amb una precisió de 2 decimals (no obligatoris) de l'article. | 344.95 |
| external_category | string | Sí | Identificador de la categoria on pujar l'article. Ha de ser un text amb la categoria, no un identificador numèric. Pot ser directament la categoria que hi hagi al teu sistema. | Camisetas manga corta |
| status | string | Sí | Condició de l'article. Els valors estan acotats a una enumeració que també es proporciona més endavant. | good |
| title | string | Sí | Títol de l'article. Màxim 60 caràcters. | Camiseta verde |
| description | string | Sí | Descripció de l'article. Màxim 600 caràcters. | Camiseta verde talla M… |
| images | list string | Sí | Camp compost creat amb la concatenació mitjançant "|" (pipe) de les diferents urls de les imatges de l'article. Aquestes han de ser públicament accessibles i en format jpg. Màxim 10 imatges. | https://image-cdn.com/image1.jpg|https://image-cdn.com/image2.jpg|https://image-cdn.com/image3.jpg |
| store | list string | No | Identificador del compte al portal on publicar aquest article. Només és necessari en cas de comptar amb més d'un compte on publicar articles. En el cas de tenir més d'un compte o més d'un portal associat al producte, ha de ser una llista d'enters separats per "|" (pipe). | 2|F5 |
| portal_status | string | No | Estat de publicació de l'article. Estats possibles: “active”, “reserved” | active |
| shipping | bool | No | Booleà per indicar si s'accepten enviaments dins del portal per a l'article. | true |
| shipping_weight_kg | int | No | Camp associat al camp "shipping", és necessari si el camp shipping és true. Indica el pes en kg (arrodonit cap amunt sense decimals) de l'article. | 3 |
| free_shipping | bool | No | Booleà per indicar si és el venedor qui assumeix els costos de l'enviament i per tant són gratis per al comprador. | true |
| hashtags | string | No | Camp compost creat amb la concatenació mitjançant "|" (pipe) dels diferents hashtags. Cadascun d'ells és una sola paraula sense espais i sense l'etiqueta (#) precedent. | bluetooth|bajoconsumo|geek |
| brand | String | No | Marca de l'article | Apple |
| model | String | No | Model de l'article | iPhone 15 pro |
| stock | int | No | Nombre d'articles | 3 |
| attributes | str | No | Camp per a atributs addicionals de l'article. Depenent de la categoria, alguns d'aquests atributs poden ser obligatoris. * | additional attributes |
* Per als articles de cotxes, s'han de proporcionar els següents atributs al camp 'attributes' com una cadena JSON serialitzada:
Respecte al camp status que fa referència a l'estat dels articles, les opcions són les següents:
["new", "as_good_as_new", "good", "fair", "has_given_it_all"]
Atributs del Cotxe
Els atributs del cotxe són un conjunt de característiques que descriuen un cotxe. Es fan servir al feed i per publicar-lo als marketplaces.
| Nom | Tipus | Obligatori | Descripció | Exemple |
|---|---|---|---|---|
| version | String | Sí | Versió del motor o nivell d'acabat del cotxe. | 1.6 TDI |
| year | Int | Sí | Any de fabricació. | 2018 |
| km | Int | Sí | Quilometratge en quilòmetres. | 60000 |
| horse_power | Int | Sí | Potència del motor en CV (DIN). | 105 |
| doors | Int | No | Nombre de portes. | 5 |
| body_type | String | No | Tipus de cos o estil. Valors possibles:'small_car', 'coupe_cabrio', 'sedan', 'family_car', 'mini_van', 'four_x_four', 'van', 'others' | sedan |
| engine | String | Sí | Tipus de combustible. Valors possibles:'gasoil', 'gasolina', 'electric_hybrid', 'others' | gasoil |
| gear_box | String | Sí | Tipus de caixa de canvis. Valors possibles are:'manual', 'automatic' | manual |
Exemple (python):
car_attrs = {
"version": "1.6 TDI Toyota",
"year": "2018",
"horse_power": 100,
"mileage": 12000,
"engine": "gasoil",
"gearbox": "manual"
}
attributes = json.dumps(car_attrs)
Atributs de la moto
Per integrar motos, l'article ha d'incloure la informació específica del vehicle. Les dades tècniques s'envien serialitzades com a JSON al camp 'attributes', mentre que la marca i el model viatgen als camps 'brand' i 'model' del CSV.
El camp 'external_category' ha de prendre un dels valors '2', 'Motos', 'Motorbikes' perquè l'article es processi com a moto. Aquesta integració requereix tenir actiu el servei d'ERP de motos al teu compte.
Els valors de 'brand' i 'model' han de coincidir exactament amb els de la nostra taxonomia de motos. Per consultar els valors vàlids disposem de dos endpoints públics (requereixen autenticació i el servei ERP de motos actiu):
GET /motorbike_brands— retorna la llista completa de marques disponibles, amb el seu 'uid' i 'value'.GET /motorbike_models?brand_id={uid}— retorna els models associats a la marca indicada mitjançant 'brand_id'.
Tingues en compte que el títol de l'article es genera automàticament a partir de la marca, el model, la versió (si s'informa) i l'any, per la qual cosa el valor del camp 'title' serà sobreescrit en les motos.
| Nom | Tipus | Obligatori | Descripció | Exemple |
|---|---|---|---|---|
| year | Int | Sí | Any de matriculació. Valor entre 1950 i l'any següent a l'actual. | 2020 |
| version | String | No | Nom comercial o versió del model. S'afegeix al títol generat automàticament. | modelo actual |
| km | Int | Sí | Quilometratge en quilòmetres. No pot ser negatiu. | 5420 |
| horse_power | Int | No | Potència del motor en CV. Ha de ser un valor positiu. | 47 |
| engine_capacity_cc | Int | No | Cilindrada del motor en centímetres cúbics. Ha de ser un valor positiu. | 400 |
| fuel_type | String | No | Tipus de combustible. Valors possibles: 'gasoline', 'electric'. Si no s'informa, per defecte és 'gasoline'. | gasoline |
| license_plate | String | No | Matrícula del vehicle. | 1234 ABC |
Exemple (python):
motorbike_attrs = {
"year": 2020,
"version": "modelo actual",
"km": 5420,
"horse_power": 47,
"engine_capacity_cc": 400,
"fuel_type": "gasoline",
"license_plate": "1234 ABC"
}
attributes = json.dumps(motorbike_attrs)