Skip to content

Instantly share code, notes, and snippets.

@StephaneBunel
Created November 19, 2021 09:36
Show Gist options
  • Save StephaneBunel/12c6890a3b9a429f512e38140ecc9def to your computer and use it in GitHub Desktop.
Save StephaneBunel/12c6890a3b9a429f512e38140ecc9def to your computer and use it in GitHub Desktop.
const csvFieldMapper = {
"ART_CODE": [mapID, 0], // item.id (ref)
"ART_CBAR": [mapProperty, 6], // 6 (ean1)
"ART_P_VTE": [mapValue, 0],
"ART_P_VTEB": [mapValue, 0],
"ART_MSUPPTPF1": [mapValue, 0],
"XXX_MARQUE": [mapProperty, 14], // 14 (fournisseur)
"ART_P_ACH": [mapProperty, 12], // 12 (prix_vente)
"ART_P_ACHUB": [mapProperty, 12], // 12 (prix_vente)
"ART_P_PRV": [mapProperty, 12], // 12 (prix_vente)
"_LAST_UPDATE": [mapUpdatedAt, ""], // item.updatedAt
"_LAST_SEEN": [mapProperty, 21], // 21 (seen_at)
"_STOCK": [mapStock, 13], // 13 (ltrim(dispo,'>'))
"_WEIGHT": [mapValue, 0],
"ART_PFOURN": [mapValue, 2],
"ART_NII": [mapProperty, 19], // 19 code_douane
"PCF_CODE": [mapValue, "DIFOX00001"],
"ART_MEMO": [mapProperty, 16], // 15 liste_accessoires
"ART_LIB": [mapLib, ""], // 5 + " " + 3 (sous_famille + " " + designation)
"FAR_CODE": [mapSousFamille, 5], // 5
"XXX_PCAT": [mapFamille, 4], // 4
};
const ln = "\n";
const comma = ";";
const header = Object.keys(csvFieldMapper);
// main is the entry point
function main(jsonItems) {
var Items = JSON.parse(jsonItems);
var csv = header.join(comma) + ln;
for (const item of Items) {
var fields = [];
for (const title of header) {
var fn = csvFieldMapper[title][0];
var arg = csvFieldMapper[title][1];
var v = fn(item, arg);
if ((typeof v === "string") && (v.search(/("|;|\n)/g) >= 0)) {
v = v.replace(/"/g, '""');
v = '"' + v + '"';
}
fields.push(v);
}
csv += fields.join(comma) + ln;
}
return csv;
}
// helper functions
function mapID(item, pid) {
return item.id
}
function mapValue(item, value) {
return value;
}
function mapProperty(item, pid) {
return (pid in item.values && !("deleteAt" in item.values[pid].status)) ? item.values[pid].value : "";
}
function mapUpdatedAt(item, dummy) {
return item.createdAt;
}
function mapStock(item, pid) {
var v = mapProperty(item, pid)
if (v == "") { return 0; }
if (typeof v === "string") {
v = v.replace(/\D+/g, "");
}
return v;
}
function mapLib(item) {
return mapProperty(item, 5) + " " + mapProperty(item, 3);
}
function mapFamille(item, pid) {
const retMap = {
"BRUN": ["electronique grand public", "sport & loisir", "univers jeux video", "energie", "jeux & jouets", "groupeprincipal", "photo", "fins de série %", "outillage & jardinage"],
"BLANC": ["cuisine", "soin du corps & santé", "equipement ménager"],
"GRIS": ["ordinateur & office", "support de stockage"],
}
var catchMe = mapProperty(item, pid).toLowerCase();
for (const [ret, arr] of Object.entries(retMap)) {
if (arr.some(elem => elem == catchMe)) {
return ret;
}
}
return "";
}
function mapSousFamille(item, pid) {
const retMap = {
"TV01": [
"pocket tv", "lcd"],
"VIDEOPR15": [
"projection", "écran de projection"],
"ANTENNE11": [
"récepteur - satellite", "récepteur - tnt", "antenne tv & satellite"],
"HIFI02": [
"amplificateur", "système de musique sans fil", "tourne-disque", "chaîne stéréo - midi/mini/micro",
"soundbar & soundboard", "home cinéma", "enceinte - étagère", "subwoofer", "enceintes encastrables",
"accessoires - haut-parleur", "haut-parleur smart/multiroom", "mélangeur dj", "ecouteurs dj",
"moniteur & haut-parleur", "système tout en 1"],
"LAVAGE16": [
"lave-vaisselle pose libre", "lave-vaisselle encastrable", "lave-vaisselle encastrable avec",
"lave-vaisselle avec panneau déco", "accessoires - lavage, séchage &"],
"CUISSON18": [
"hottes aspirantes", "nettoyage & soin"],
"FROID17": [
"réfrigérateur", "combiné réfrigérateur-congélateu", "congélateur", "congélateur armoire",
"réfrigérateur américain", "réfrigérateur encastrable"],
"ASPIRAT20": [
"aspirateur", "sachets - aspirateur", "accessoires - aspirateur", "aspirateur robot",
"aspirateur à main", "aspirateur - injecteur"],
"TELEPHO09": [
"téléphonie filaire", "téléphonie sans fil", "accessoires - téléphonie", "fax", "accessoires - fax",
"talkie walkie", "talkie-walkie - enfant", "cellulaire", "smartphone", "autres produits électroniques -",
"film de protection smartphone"],
"VIDEO03": [
"caméscope", "caméras 360°", "caméra embarquée", "caméscope professionel", "lecteur - dvd",
"lecteur - blu-ray", "baladeur dvd portable", "lecteur multimedia & récepteur n", "système video",
"système de navigation", "outdoor", "navigation routière", "autres accessoires", "système de fixation",
"consoles", "accessoires - jeux vidéo", "boîtier"],
"JOUET": [
"kits de circuit voiture", "voitures pour circuit", "accessoires pour circuit", "lego", "schleich",
"jeux de construction", "véhicules télécommandés", "bateaux télécommandés", "hélicoptères & quadrocoptères té",
"jeux de société", "puzzles", "etabli & outils", "ménager, jardin & mini-cuisine", "jeu d'imitation - commerçant",
"autres kits", "monde du film", "véhicules & accessoires", "jouet aquatique"],
"AUDIO05": [
"radio", "radio-cd-cassette", "radio internet", "radio-réveil", "baladeur cd", "mediaplayer",
"dictaphone numérique & accessoir", "microphone", "accessoires - microphone", "autres accessoires - audio",
"autoradio", "accessoires - hifi automobile", "amplificateur - voiture", "haut-parleur", "casque à arceau",
"ecouteur sans fil", "kit oreillette", "electronique grand public & offi", "écouteur - intra-auriculaire",
"casques gaming", "haut-parleur portable"],
"OUTILLAGE": [
"marteau perforateur", "perceuse", "meuleuse d'angle", "visseuse", "outillage & jardinage", "scie",
"ponceuse", "autres outils", "outillage pneumatique", "outil multifonction", "fraiseuses", "rabot électrique",
"radio de chantier", "accessoires - perceuse -", "accessoires - visseuse -", "accessoires - ponceuse -",
"accessoires - scie -", "taille-haies", "cisaille & sculpte haies", "tondeuse manuelle & robotisée",
"scarificateur & aérateur de pelo", "débroussailleuse & faux", "broyeur", "tronçonneuse",
"accessoires - machines de jardin", "nettoyeur à vapeur", "nettoyeur haute-pression", "aspirateur sec/humide",
"aspirateur & souffleur de feuill", "balai, pelle & balayeuse", "autres articles - nettoyage", "nettoyage des vitres",
"accessoires - nettoyage", "sécateur", "hache & elagueur", "epandeur & rouleaux", "outillage manuel de jardin",
"culture du sol", "bêche, fourche & pelle", "système combiné", "autres accessoires - jardin", "pompe",
"système d'irrigation", "tuyaux d'arrosage & chariot dévi", "pommes & lances d'arrosage", "connecteur & embrayage",
"equipement laser", "appareil de mesure", "multimètre & détecteur de tensio", "appareil de détection & détectio",
"autres appareils de mesure / con", "tournevis", "kit d'outils", "clé à molette", "pinces, ciseaux, couteaux",
"autre outil manuel", "marteau", "système de rangement d'outils", "rabot, ciseau à bois & raclage", "protection auditive",
"lunettes de protection", "casque & masque de protection", "vêtement de travail", "compresseurs",
"accessoires - entraînement indoo", "accessoires outillage pneumatiqu"],
"PHOTO24": [
"appareil photo - instantané", "cadre photo numérique", "appareil photo - analogique", "appareil photo - compact numériq",
"appareil photo - réflex", "appareil photo - hybride", "appareil photo - spécial", "objectifs - réflex",
"objectifs - hybride", "posemètre & accessoires", "jumelle", "reprographie & accessoires",
"table de prise de vue", "microscope", "télescope", "vision nocturne",
"télémètre", "longue-vue", "accessoires d''origine", "photo",
"poignée d''alimentation", "accessoires pour laboratoire", "autres accessoires - photo", "balance des blancs / charte gris",
"visionneuse & panneau lumineux", "encadrement & accessoires", "cadre photo", "passe-partout & leporello",
"papier photo - feuilles", "consommable - borne photo", "films s8", "consommable - périphérique",
"accessoires - système de kiosque", "adaptateur de filtre", "microphone directionnel & access", "autres accessoires - studio",
"hardware - photo d´identité", "caisson étanche", "accessoires - caméra embarquée", "télécommande & déclencheur à ret",
"déclencheur de flash / câble fla", "caisson étanche - caméscope", "protection imperméable", "boîtier outdoor & étanche",
"filtres", "convertisseur", "autres accessoires - objectif", "fixation & trépied - caméra emba",
"accessoires photo", "film de protection photo", "pare-soleil", "bouchons d''objectif",
"adaptateur - objectif", "trépied sans tête", "trépied avec tête", "tête de trépied",
"trépied & accessoires", "flash", "flash de studio", "eclairage continu",
"système de kiosque", "lampes - projection", "lampe - vidéo", "éclairage, flash, parapluie",
"réflecteur", "éclairage studio", "système de fond", "pied d''éclairage",
"tente à lumière", "diffuseur de lumière", "flash & accessoires", "films noir & blanc",
"négatifs couleur", "table lumineuse", "négatifs couleur pro", "diapositives",
"instantanés", "jetables"],
"PETITME19": [
"santé & sport connectés", "montre connectée", "montres sport", "accessoires - objet connecté",
"bouilloire", "trancheuse", "balance de ménage", "bol mixeur",
"mixeur", "oeufrier", "machine à café/à thé à filtre", "machine expresso à levier",
"machines à expresso", "toaster", "presse-fruit", "presse-citron",
"machine à pain", "moulin à café", "machine à capsules et dosettes", "grains de café",
"dosettes & capsules de café", "friteuse", "four à micro-ondes", "barbecue",
"raclette", "robot multifonction", "mixeur & batteur", "ouvre-boîte",
"gaufrier", "emulsionneur électronique de lai", "hachoir à viande", "soin dentaire",
"soin du corps & santé", "rasoir électrique homme", "rasoir pour dame", "epilateur à lumière pulsée",
"epilateur", "tondeuse à barbe/cheveux", "soin - cheveux", "sèche-cheveux",
"autres - santé", "montre & réveil", "station météorologique", "filtre à eau & accessoire",
"thermomètre", "machine de mise sous vide & acce", "autres - sport & fitness -", "beauté & bien-être",
"autres - électroménager", "plaque électrique", "sorbetière & pic à glace", "de 0 à 6 mois",
"sacs isothermes & glacières", "cuiseur à vapeur", "machine à coudre", "montres d''enfants",
"fer à repasser", "centrale vapeur", "humidificateur & déshumidificate", "ventilation",
"climatiseur", "radiateur", "accessoires - robot ménager", "accessoires - station météo",
"accessoires - soin dentaire", "accessoires - rasoir homme", "autres accessoires - hygiène", "barbecue à gaz",
"accessoires - barbecue", "ustensiles de cuisine", "couteaux de cuisine", "ciseaux",
"planches à découper", "râpe & eminceur", "plat de cuisson", "presser & ecraser",
"machine à nouilles", "moule à gâteau & plaque de cuiss", "ustensiles pour pâtisserie", "rouleau à pâtisserie",
"verre gradué", "verres & carafes", "couvert", "accessoires pour bar & vin",
"moulin à condiments", "boîte repas", "bac à aliment", "gourde",
"tasse & bouteille isotherme", "préparation thé & café", "pichet & vaisselle", "bouteille thermo",
"accessoires intérieurs", "boîte à couvercle", "grossesse & allaitement", "erotisme",
"babyphone", "babycare", "lampes infrarouge", "couverture & coussin chauffant",
"massage", "tensiomètre", "montre cardio", "thermomètre médical",
"pèse-personne", "casserole & poêles"],
"MICROIN25": [
"liseuse & accessoires", "tablettes", "système de fixation - tablette", "film de protection ordinateur /",
"autres accessoires - tablette", "alimentation pc", "onduleur", "écran tft",
"scanneur à plat - sans adaptateu", "scanneur à plat - avec adaptateu", "scanneur dia/film", "accessoires - scanneur",
"scanneur de documents", "scanneur de cartes de visite", "scanner portable", "imprimante - jet d´encre",
"imprimante - laser", "imprimante multifonction - encre", "imprimante multifonction - laser", "imprimante compacte - photo",
"accessoires - imprimante", "imprimante d''étiquettes", "imprimante matricielle - à impac", "claviers",
"souris avec fil", "souris", "tablette graphique", "webcam",
"souris sans fil", "accessoires simulation karting", "accessoires simulation de vol", "volant",
"clavier / manette", "jeux", "autres accessoires - pc", "logiciel - graphique & traitemen",
"carte graphique", "carte d''interface vidéo", "lecteur de cartes", "processeur",
"tapis de souris", "calibrage", "ventilateur", "carte réseau",
"hub / switch", "routeur sans fil / point d''accès", "réseau sans fil - pci", "réseau sans fil - usb",
"réseau sans fil - bluetooth", "powerline", "autres accessoires - réseau", "répéteur & amplificateur wifi",
"graveur dvd - externe", "boîtier - externe", "autres - fourniture de bureau", "etiqueteuse",
"accessoires - etiqueteuse", "sélecteur de donnée", "commutateur & splitter - vidéo", "disque dur externe",
"disque dur ssd - interne", "disque dur ssd - externe", "disque dur ssd/pci", "mémoire vive (ram) - ordinateur",
"clés usb", "energie & support de stockage", "clés otg", "sd / sdhc / sdxc",
"compact flash", "memory stick", "microsd", "cartes mémoire", "xqd", "cfast", "cd-r", "cd-rw",
"dvd-r", "dvd-rw", "dvd+r", "dvd+rw", "blu-ray", "vhs", "système raid", "papier jet d''encre - feuille",
"papier jet d''encre - rouleau", "papier jet d''encre & laser", "consommable - sublimation thermi", "consommable zink",
"feuilles", "etiquettes", "cartouche - imprimante", "encre", "ruban encreur", "imprimante 3d", "ergonomie", "mobilier"],
"DIVERSA13": [
"piles", "batteries universelles", "batteries spéciales", "chargeur universel",
"chargeur spécial", "adaptateur d''origine", "adaptateur universel", "testeur de batterie",
"power bank", "batteries - audio", "batterie - téléphone portable", "générateur",
"autres accessoires - vidéographi", "batteries", "batterie - caméra embarquée", "chargeur - caméra embarquée",
"chargeur à induction", "chargeur", "sacoche d''origine", "accessoires - projection numériq",
"sacs & coffrets - ordinateur", "sac & coffret - universel", "sac et coffret - objectif", "bandoulière & dragonne",
"sacoches", "sacoche & coffret - trépied", "housses de protection", "sacoches & etuis - tablette",
"sac & coffret - vidéo", "sacoche & sac à dos - loisir", "coffres - loisir", "valises - photo & vidéo",
"sacs et coffrets", "accessoires - sacoche & coffre", "archivage - photo", "archivage - diapositive",
"archivage cd / dvd / blu-ray", "album photo", "archivage - carte mémoire", "chemise photo d´identité & portr",
"boîte à photos", "câble & adaptateur - photo", "câbles & adaptateurs - tv/vidéo", "câbles & adaptateurs - audio/hif",
"câbles & adaptateurs - auto & na", "câbles & adaptateurs - smartphon", "câbles & adaptateurs - ordinateu", "câble, adaptateur & accessoires",
"câbles & adaptateurs - réseau", "câbles & adaptateurs - caméra em", "autres - câbles & adaptateurs", "bonnette",
"tube-allonge", "autres accessoires - vidéo", "autres accessoires - sat", "télécommande",
"pointeur laser", "lunettes 3d", "visualiseur", "système de fixation - vidéograph",
"moniteur - vidéographie", "dispositif de découpe", "fixation - smartphone", "fixation & support - ecran",
"boîtier - caméra embarquée", "lunettes vr", "accessoires - drone", "support mural & support plafond",
"destructeur de documents", "appareil à laminer", "calculatrice", "fourniture de bureau",
"balance pour courrier", "corbeille à papier & poubelle", "sonnettes", "support décoratif - photo",
"style de vie", "plateau & etagère", "aide visuelle", "accessoires - extérieur",
"vestimentaire", "luminaire", "eclairage intérieur", "lampes déco",
"lampes à lumière du jour", "eclairage extérieur", "eclairage", "lampe frontale",
"lampe de poche", "lanterne", "ampoules", "coffret d''introduction/complet",
"eclairage - domotique", "dispositif d''ombrage", "thermostat & accessoires", "système d''alarme",
"détecteur de danger", "accessoires - domotique", "protection antivol", "technique de chargement",
"accessoires technique de chargem", "scooter électrique", "couteau de poche", "cyclisme indoor",
"sécurité", "porte-boisson", "support de réparation", "pièces de rechange pour vélos",
"pupitre du chef d''orchestre", "musique - accessoires", "affichage dynamique", "autre décoration", "câble chargeur"]
}
var catchMe = mapProperty(item, pid).toLowerCase();
for (const [ret, arr] of Object.entries(retMap)) {
if (arr.some(elem => elem == catchMe)) {
return ret;
}
}
return "";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment