Gestion des imports
L'import de fichier vous permet d’importer une liste d'abonnés depuis votre ordinateur ou depuis votre SFTP Mindbaz. Si vous ne connaissez pas les identifiants pour vous connecter à votre SFTP, vous pouvez les demander au service client en cliquant ici.
Cette article du centre d'aide vous donnera plus d'informations sur les formats et encodages utilisés par l'import de fichier
Programmer un import
Pour importer un fichier d'abonnés, vous pouvez utiliser l'appel POST api/{idsite}/imports/scheduleNow.
Les paramètres à spécifier dans l'url sont les suivants:
Nom | Description | Type | Informations complémentaires |
---|---|---|---|
idsite | Identifiant de site MindBaz | Nombre entier | Obligatoire |
Dans le corps de la requête, les paramètres à passer sous la forme "application/json, text/json" sont les suivants:
Nom | Description | Type | Informations complémentaires |
---|---|---|---|
parameters | Paramètres de base pour créer un import | ImportParameters | Obligatoire |
Le type ImportParameters est une structure contenant les paramètres pour créer un import d'abonnés:
Nom | Description | Type | Informations complémentaires |
---|---|---|---|
filename | Nom du fichier à importer. Le fichier doit etre présent sur le ftp de votre base (accès a demander au support mindbaz). 500 caractères maximum. Remarque: Vous pouvez utiliser un sous-répertoire mais il faut également que ce sous-répertoire existe dans le répertoire "errors" | Chaine de caractères | Obligatoire |
startLine | Numero de la premiere ligne à importer (1 par defaut) | Nombre entier | Obligatoire |
columnNamesFirstLine | Entetes de colonne sur la premiere ligne | Booléen | Aucune |
textQualifier | Identificateur de texte (" par ex) 1 carac max | Chaine de caractères | Obligatoire |
columnDelimiter | Séparateur de colonne (; par ex) 1 carac max | Chaine de caractères | Obligatoire |
rowDelimiter | Séparateur de ligne (\\r\ par ex) 10 caractères maximum | Chaine de caractères | Obligatoire |
codepage | Codepage du fichier (1252 ou 65001 par ex) 1252 par defaut | Nombre entier | Aucune |
sheetName | Nom de la feuille excel à importer 255 carac max | Chaine de caractères | Obligatoire |
keyDbFieldName | Nom du champ bdd utilisé comme clef de déduplication. 255 carac max Par ex : fld1 pour utiliser l'email comme clef (val par defaut) fld0 pour l'id de l'abonné fld43 pour l'id client md5_fld1 pour le fld1 encodé en md5 (à activer par le support mindbaz avant) | Chaine de caractères | Obligatoire |
keepFld7 | Ne pas changer l'état de l'abonné? true par defaut | Booléen | Aucune |
insertEnabled | Autoriser l'insertion de nouveaux abonnés? true par defaut | Booléen | Aucune |
safeMode | Mode sans échec Activé : Des valeurs vides ou NULL remplacent les champs en erreur de la ligne. La ligne est quand meme importé Désactivé (par défaut) :La ligne complète est en erreur si au moins un de ses champs est en erreur. | Booléen | Aucune |
emailNotification | Liste des emails (séparé par des ;) qui recevront le rapport d'import à la fin. 500 caractères maximum | Chaine de caractères | Obligatoire |
deleteFile | Supprimer le fichier du ftp à la fin de l'import? false par defaut | Booléen | Aucune |
columnMapping | Mapping des colonnes et des valeurs fixes sur les champs de la bdd. Si une colonne du fichier n'est pas importée, il ne faut pas la mettre dans ce tableau. Attention: Champ obligatoire | Collection de ImportMapping | Obligatoire |
Le type ImportMapping enregistre le mapping d'une colonne du fichier sur un champ de la bdd. Dans cette classe, on peut aussi ajouter d'une valeur fixe dans un champ de la bdd (cette valeur fixe sera utilisée pour toutes les lignes du fichier).
Nom | Description | Type | Informations complémentaires |
---|---|---|---|
dbFieldName | Nom du champs dans la bdd. 15 carac max. Ex : fld1 pour l'email fld2 pour la date de premiere inscription etc. Attention Champ obligatoire | Chaine de caractères | Obligatoire |
idMappingMode | Id du mode de mapping: 1 (par defaut) : écraser (la donnée du fichier écrase la donnée en bdd - sauf si la donnée du fichier est null) 2 : conserver (la donnée du fichier est écrite que si la donnée en bdd est null) Attention Champ obligatoire | Nombre entier | Obligatoire |
fileColumnName | Nom de la colonne du fichier qui est mappé sur dbFieldName. Ne peut etre utilisé en meme temps que le champ fixedValue. 255 carac max Attention Champ obligatoire si fixedValue est null Attention Si le fichier n'a pas d'entete, il faut utiliser col0, col1,etc. comme nom de colonne | Chaine de caractères | Obligatoire |
fixedValue | Valeur fixe mappée sur dbFieldName. Pour une date, mettre au format "dd/MM/yyyy". Ne peut etre utilisé en meme temps que le champ fileColumnName. 1000 carac max Attention Champ obligatoire si fileColumnName est null | Chaine de caractères | Obligatoire |
format | Format (de date essentiellement) de la colonne du fichier. A renseigner uniquement pour un mapping sur une colonne (fileColumnName) de type DATE ou LISTE. Ex de format de DATE: "dd/MM/yyyy HH:mm:ss", "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", ... Pour un type LISTE, il faut choisir entre 2 formats: "ID" ou "VALUE" ID : les données dans le fichier pour cette colonne correspondent aux id de la liste (ex "0","1" pour le liste "0:Non,1:Oui") VALUE : les données dans le fichier pour cette colonne correspondent aux valeurs de la liste (ex "Non","Oui" pour le liste "0:Non,1:Oui") Pour les autres types, ce champ doit etre null. 30 carac max | Chaine de caractères | Aucune |
Voici un exemple d'import du fichier "ExportMindBaz_21-06-2022.csv" avec un mapping sur 2 colonnes:
{
"parameters":{
"filename": "ExportMindBaz_21-06-2022.csv",
"startLine": 1,
"columnNamesFirstLine": true,
"textQualifier": null,
"columnDelimiter": "|",
"rowDelimiter": "\r\n",
"codepage": 0,
"sheetName": null,
"keyDbFieldName": "fld1",
"keepFld7": false,
"insertEnabled": true,
"safeMode": false,
"emailNotification": "serviceclient@mindbaz.com;mindbaz@mail.com",
"deleteFile": true,
"columnMapping": [
{
"dbFieldName": "fld158",
"idMappingMode": 1,
"fileColumnName": "ANIMAL_DATE_NAISSANCE",
"fixedValue": null,
"format": "dd/MM/yyyy HH:mm:ss"
},
{
"dbFieldName": "fld157",
"idMappingMode": 1,
"fileColumnName": "ANIMAL_NOM",
"fixedValue": null,
"format": null
}
]
}
}
Codeline
- C#
- Java
- Python
var client = new RestClient("https://api.mindbaz.com/api/{idSite}/imports/scheduleNow");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer `TOKEN`");
request.AddHeader("Content-Type", "application/json");
var body = @"{
" + "\n" +
@" ""parameters"": {
" + "\n" +
@" ""filename"": ""ExportMindBaz_21-06-2022.csv"",
" + "\n" +
@" ""startLine"": 1,
" + "\n" +
@" ""columnNamesFirstLine"": true,
" + "\n" +
@" ""textQualifier"": null,
" + "\n" +
@" ""columnDelimiter"": ""|"",
" + "\n" +
@" ""rowDelimiter"": ""\r\n"",
" + "\n" +
@" ""codepage"": 0,
" + "\n" +
@" ""sheetName"": null,
" + "\n" +
@" ""keyDbFieldName"": ""fld1"",
" + "\n" +
@" ""keepFld7"": false,
" + "\n" +
@" ""insertEnabled"": true,
" + "\n" +
@" ""safeMode"": false,
" + "\n" +
@" ""emailNotification"": ""mail1@mindbaz.com;mail2@mindbaz.com"",
" + "\n" +
@" ""deleteFile"": true,
" + "\n" +
@" ""columnMapping"": [
" + "\n" +
@" {
" + "\n" +
@" ""dbFieldName"": ""fld158"",
" + "\n" +
@" ""idMappingMode"": 1,
" + "\n" +
@" ""fileColumnName"": ""ANIMAL_DATE_NAISSANCE"",
" + "\n" +
@" ""fixedValue"": null,
" + "\n" +
@" ""format"": ""dd/MM/yyyy HH:mm:ss""
" + "\n" +
@" },
" + "\n" +
@" {
" + "\n" +
@" ""dbFieldName"": ""fld157"",
" + "\n" +
@" ""idMappingMode"": 1,
" + "\n" +
@" ""fileColumnName"": ""ANIMAL_NOM"",
" + "\n" +
@" ""fixedValue"": null,
" + "\n" +
@" ""format"": null
" + "\n" +
@" }
" + "\n" +
@" ]
" + "\n" +
@" }
" + "\n" +
@"}";
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.post("https://api.mindbaz.com/api/{idSite}/imports/scheduleNow")
.header("Authorization", "Bearer `TOKEN`")
.header("Content-Type", "application/json")
.body("{\r\n \"parameters\": {\r\n \"filename\": \"ExportMindBaz_21-06-2022.csv\",\r\n \"startLine\": 1,\r\n \"columnNamesFirstLine\": true,\r\n \"textQualifier\": null,\r\n \"columnDelimiter\": \"|\",\r\n \"rowDelimiter\": \"\\r\\n\",\r\n \"codepage\": 0,\r\n \"sheetName\": null,\r\n \"keyDbFieldName\": \"fld1\",\r\n \"keepFld7\": false,\r\n \"insertEnabled\": true,\r\n \"safeMode\": false,\r\n \"emailNotification\": \"mail1@mindbaz.com;mail2@mindbaz.com\",\r\n \"deleteFile\": true,\r\n \"columnMapping\": [\r\n {\r\n \"dbFieldName\": \"fld158\",\r\n \"idMappingMode\": 1,\r\n \"fileColumnName\": \"ANIMAL_DATE_NAISSANCE\",\r\n \"fixedValue\": null,\r\n \"format\": \"dd/MM/yyyy HH:mm:ss\"\r\n },\r\n {\r\n \"dbFieldName\": \"fld157\",\r\n \"idMappingMode\": 1,\r\n \"fileColumnName\": \"ANIMAL_NOM\",\r\n \"fixedValue\": null,\r\n \"format\": null\r\n }\r\n ]\r\n }\r\n}")
.asString();
import http.client
import json
conn = http.client.HTTPSConnection("api.mindbaz.com")
payload = json.dumps({
"parameters": {
"filename": "ExportMindBaz_21-06-2022.csv",
"startLine": 1,
"columnNamesFirstLine": True,
"textQualifier": None,
"columnDelimiter": "|",
"rowDelimiter": "\r\n",
"codepage": 0,
"sheetName": None,
"keyDbFieldName": "fld1",
"keepFld7": False,
"insertEnabled": True,
"safeMode": False,
"emailNotification": "mail1@mindbaz.com;mail2@mindbaz.com",
"deleteFile": True,
"columnMapping": [
{
"dbFieldName": "fld158",
"idMappingMode": 1,
"fileColumnName": "ANIMAL_DATE_NAISSANCE",
"fixedValue": None,
"format": "dd/MM/yyyy HH:mm:ss"
},
{
"dbFieldName": "fld157",
"idMappingMode": 1,
"fileColumnName": "ANIMAL_NOM",
"fixedValue": None,
"format": None
}
]
}
})
headers = {
'Authorization': 'Bearer `TOKEN`',
'Content-Type': 'application/json'
}
conn.request("POST", "/api/100/imports/scheduleNow", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
Le fichier doit exister sur le sftp au moment de la création de l'import. Sinon vous aurez une erreur 400 avec en erreur "Error, file not found".
L'objet Import
En retour d'appel, j'obtiens un objet de type Import qui contient les informations de l'import nouvellement créé. Récupérez bien l'id de l'import créé. Il vous sera utile pour suivre son état d'avancement.
{
"success": true,
"data": {
"id":252,
"parameters":
{
"filename": "ExportMindBaz_21-06-2022.csv",
"startLine":1,
"columnNamesFirstLine":true,
"textQualifier":null,
"columnDelimiter": "|" ,
"rowDelimiter": "\r\n" ,
"codepage": 0,
"sheetName":null,
"keyDbFieldName": "fld1",
"keepFld7": false,
"insertEnabled": true,
"safeMode": false,
"emailNotification": "serviceclient@mindbaz.com;mindbaz@mail.com" ,
"deleteFile": true,
"columnMapping": [
{
"dbFieldName": "fld157" ,
"idMappingMode": 1,
"fileColumnName": "animal_nom",
"fixedValue": "",
"format": ""
},{
"dbFieldName": "fld158" ,
"idMappingMode": 1,
"fileColumnName": "animal_date_naissance" ,
"fixedValue": "",
"format": "dd/MM/yyyy HH:mm:ss"
}]
},
"creationDate": "2023-01-05T10:35:30.9983907+01:00" ,
"importState": 1,
"isDeleted": false,
"deletionDate":null,
"schedulingInfos":{
"isRecurring":false,
"recurringInfos":null,
"scheduledDate": "2023-01-05T10:37:30.8108812+01:00"
},
"lastImportLog":null
},
"error": null,
"typeName": "Import"
}
Nous retrouvons les paramètres d'entrée et le mapping. Nous obtenons en plus, les informations de programmation :
- la programmation dans schedulingInfos,
- le statut de l'import dans importState (1 = programmé)
- et le log du dernier import effectué dans lastImportLog '(pour l'instant null car l'import ne s'est pas encore lancé).
Le type ImportSchedulingInfos représente les informations d'ordonnancements d'un job d'import:
Nom | Description | Type | Informations complémentaires |
---|---|---|---|
scheduledDate | Date et heure prévues d'exécution | Date | Obligatoire |
isRecurring | Indique s'il s'agit d'une planification récurrente | Booléen | Aucune |
recurringInfos | Informations de récurrence | RecurringInfos | Aucune |
Le type RecurringInfos représente les informations de récurrence d'un job:
Nom | Description | Type | Informations complémentaires |
---|---|---|---|
filenameTemplate | Nom de fichier template | Chaine de caractères | Aucune |
frequencyUnits | Unité de fréquence pour qualifier la propriété Frequency | EFrequencyUnit | Aucune |
frequency | Fréquence d'exécution (ex: Frequency=5, FrequencyUnits=Day signifie "tous les 5 jours") | Nombre entier | Aucune |
monthDay | Jour du mois programmé (ex: MonthDay=5 signifie "le 5 de chaque mois") | Octet non signé | Aucune |
monthDay2 | Jour du mois programmé (ex: premier lundi, dernier jour ouvrable...) | Chaine de caractères | Aucune |
weekDays | Jour(s) de la semaine programmé | Collection de Octet non signé | Aucune |
time | Heure de la journée programmée | Chaine de caractères | Aucune |
startDate | Date de début | Date | Aucune |
endDate | Date de fin | Date | Aucune |
Le type EFrequencyUnit est de type Enum:
Nom | Valeur | Description |
---|---|---|
Day | 1 | L'unité de fréquence est en jours |
Week | 2 | L'unité de fréquence est en semaines |
Monthly | 3 | L'unité de fréquence est en mois |
Suivre l'état d'avancement de mon import
Si vous voulez connaitre l'état de votre import, vous pouvez utiliser l'api GET /api/{idsite}/imports/{idImport} avec l'id de l'import que vous venez de créer. Vous récupérez également le même objet Import en réponse.
Le paramètre qui nous intéresse est le champ importState (EImportState). Le type EImportState est de type Enum:
Nom | Valeur | Description |
---|---|---|
Scheduled | 1 | L'import est programmé |
InProgress | 2 | L'import est en cours d'exécution |
Completed | 3 | L'import est terminé |
Paused | 4 | L'import est en pause |
PackageErrorCreation | 5 | Erreur lors de la création du package |
Si votre import a été mal configuré ou si le mapping a été mal fait, vous aurez un état=5 (PackageErrorCreation).
Lorsque l'import sera fini, vous obtiendrez son log d'execution dans le champ lastImportLog (ImportLog):
Nom | Description | Type | Informations complémentaires |
---|---|---|---|
id | Identifiant du log | Nombre entier | Aucune |
filename | Nom du fichier importé | Chaine de caractères | Aucune |
startDate | Date de début de l'import | Date | Aucune |
endDate | Date de fin de l'import | Date | Aucune |
errorMessage | Message en cas d'erreur | Chaine de caractères | Aucune |
totalRows | Nombre total de lignes dans le fichier | Nombre entier | Aucune |
totalDuplicateKeys | Nombre de lignes en doublon selon la clef selectionnée | Nombre entier | Aucune |
nbValidations | Nombre de lignes validées suite à la validation | Nombre entier | Aucune |
nbErrorRows | Nombre de lignes en erreurs (avec des valeurs non valides, emails, format de date, longueur de chaines...) | Nombre entier | Aucune |
nbBadFormattedRows | nombre de lignes avec des problèmes de format de colonnes (trop de colonnes, colonne avec le texte mal identifié ex: "valeur;"valeur";) | Nombre entier | Aucune |
badFormattedRowNumbers | Numeros des lignes du fichier avec un mauvais format (1000 carac max) | Chaine de caractères | Aucune |
totalUpdates | Nombre total de lignes à mettre à jour | Nombre entier | Aucune |
nbUpdates | Nombre total de lignes mises à jour | Nombre entier | Aucune |
totalInserts | Nombre total de lignes a insérer | Nombre entier | Aucune |
nbInserts | Nombre total de lignes insérées | Nombre entier | Aucune |
nbForbiddenInserts | Nombre d'insertions interdites (si option interdire les insertions actives ou s'il y a des doublons dans le fichier) | Nombre entier | Aucune |