---
showToc: true
---

# Connecteur

Un connecteur CSV permet d’exporter les données via des fichiers CSV. Il permet de configurer les
données à exporter et les règles de transformation sont paramétrables dans un « Mapping ».
Il est également possible de développer un connecteur spécifique pour prendre en compte des règles
métier spécifiques et pour envoyer les données dans un format spécifique.


beCPG met à disposition un connecteur standard permettant d'extraire
des entités et leurs listes au format CSV, ou bien des documents
(images, fiches techniques) au format natif.


## Version

Différentes versions du connecteur existent en fonction de votre version de beCPG. 
Il est conseillé d'utiliser la dernière version stable du connecteur, l'option *isV1Api* active la compatibilité avec la version 1.

> Certaines options du connecteur ne sont pas valable avec toutes les versions de l'[API](./API.md), cela est indiqué dans la documentation par `[>=3.2.1]`


| Connector version | JAVA version | beCPG Tools version | API Support | Major changes |
| ---- | ---- | ---- | ---- | ---- |
| <a href="files/becpg-connector-3.2.2-distribution.zip" target="_blank" download="becpg-connector-3.2.2-distribution.zip">3.2.2</a> | JDK11 | 3.2.1 | 3.2^, 3.0, 2.1 ,2.0, 1.0^^ ( ^^ with connector.isV1APi = true) | Equadis and X3 export plugins |
| <a href="files/becpg-connector-3.2.1-distribution.zip" target="_blank" download="becpg-connector-3.2.1-distribution.zip">3.2.1</a> | JDK11 | 3.2.0 | 3.1^, 3.0, 2.1 ,2.0, 1.0^^ ( ^^ with connector.isV1APi = true) | JDK11, number and csv format, XLS Mapping support |
|  <a href="files/becpg-connector-3.0.0-distribution.zip" target="_blank" download="becpg-connector-3.0.0-distribution.zip">3.0.0</a>  | JDK8 | 3.0.0 | 3.1^, 3.0, 2.1 ,2.0, 1.0^^ (^Not recommended, ^^with connector.isV1APi = true) | SFTP support, API V2 Support, compressParam Support [V2.1] |
| <a href="files/becpg-connector-1.6-distribution.zip" target="_blank" download="becpg-connector-1.6-distribution.zip">1.6.0</a> | JDK8 | 1.4 | 3.1^, 3.0^, 2.1^ ,2.0^, 1.0  (^Not recommended) | Workflow and document export plugin  |


## Installation

Installer la **JDK** Java sur votre machine à la version correspondante à votre version du connecteur.
Télécharger et dé-zipper l'archive <a href="files/becpg-connector-3.2.2-distribution.zip" target="_blank" download="becpg-connector-3.2.2-distribution.zip">becpg-connector-3.2.2-distribution.zip</a>


Si votre application utilise HTTPS et que le certificat SSL n'est pas reconnu par JAVA celui-ci doit être installé. Pour windows ce référer à [l'annexe 1](#annexe1).



## Utilisation

Sous linux, exécutez la commande suivante dans un terminal :

```bash
./becpg-connector.sh
```

Sous windows, double-cliquer sur le fichier **becpg-connector.bat**

Dans un environnement docker il est nécessaire de créer son propre script de lancement et de monter le volume docker correspondant au chemin de destination des fichiers :

Exemple de script de lancement docker:

```bash
docker run --rm -v "$PWD":/usr/becpg-connector -v "$PWD"/data:/usr/becpg-connector/data -w /usr/becpg-connector/data \
   --net inst1_internal --link inst1_becpg-mail_1 openjdk:8 java -Dfile.encoding=UTF8 \
   -jar /usr/becpg-connector/lib/becpg-connector-3.2.0-jar-with-dependencies.jar -file=/usr/becpg-connector/becpg-connector.properties >> $TMPFILE 2>&1
```


Les fichiers csv sont créés dans **connector.dest.path**

Exemple de fichiers obtenus :

    csv/:
    bcpg_client.csv           bcpg_semiFinishedProduct.csv  compoList.csv  organoList.csv     physicoChemList.csv
    bcpg_finishedProduct.csv  bcpg_supplier.csv             nutList.csv    packagingList.csv


## Configuration

Pour configurer le connecteur, il est nécessaire d'éditer le fichier *becpg-connector.properties*.

Ces paramètres peuvent également être surchargés directement dans le script d'appel avec l'option JAVA **-D** [>=3.0.0].

Exemple: 

```bash
java -Dremote.scheme=https -Dremote.host=server.becpg.local -Dremote.port=443 
      -Dconnector.query.template="+TYPE:\"bcpg:finishedProduct\""
      -Dconnector.dest.path=".\data\case-units" 
      -jar ./lib/becpg-connector-3.2.0-jar-with-dependencies.jar -file=becpg-connector-case-units.properties
```


> Le fichier becpg-connector.properties est spécifié grâce à l'option -file=*sample-config.properties* 

### Serveur et destination

Tout d'abord, vous devez indiquer l'adresse du serveur beCPG :

```properties
remote.scheme=http
remote.host=localhost
remote.port=8080
remote.login=admin
remote.password=becpg
```

Il faut également indiquer l'emplacement de destination des fichiers CSV
(par défaut dans le dossier courant)

```properties
connector.dest.path=.
```

> Attention : les chemins doivent s'écrire sous windows
> c:\\\\Temp\\\\becpg-connector (ou c:/Temp/becpg-connector)

### Notifications

Il est possible d'envoyer une notification par e-mail à la fin de l’exécution du
connecteur :

```properties
notify.enabled=false
connector.notify.from=support@becpg.fr
connector.notify.to=support@becpg.fr

mail.smtp.host=localhost
mail.smtp.port=25
```

Il est également possible d'envoyer les fichiers par FTP à la fin de
l’exécution du connecteur :

```properties
ftp.protocol=ftp or ftps or sftp (default is ftp) [ >= 3.0.0]
ftp.enabled=false
ftp.host= 
ftp.port=21
ftp.login= 
ftp.password=
ftp.destFolder=
ftp.deleteOnSuccess=false
```

Il est également possible d'écrire des propriétés dans le PLM sur chaque entité synchronisé en utilisant le format XML de l'API [>=3.0.0]: 

```properties
plm.activity.enabled=false
plm.activity.syncRemoteXml=<gs1:isPublicated xmlns:gs1="http://www.bcpg.fr/model/gs1/1.0" type="d:boolean" >false</gs1:isPublicated> \
						   <gs1:publicationDate xmlns:gs1="http://www.bcpg.fr/model/gs1/1.0" type="d:date" >%s</gs1:publicationDate>
```

### Compatibilité

Dans certains cas, si la liste des champs à extraire est trop longue il peut être nécessaire de compresser les entêtes [API >= 2.1]:

```properties
connector.compress.param=true
```

 Ou d'utiliser l'API V1 [>=3.0.0]:

```properties
connector.isV1APi=true
```

### Actions post-connecteur

Il est possible d'executer d'exécuter des actions après le passage du connecteur en utilisant les paramètres suivants :

```properties
connector.channel.onSuccess.remote=
connector.channel.onError.remote=
```

Voici un exemple de JSON à appliquer à l'entité après l'exécution du connecteur, au format remoteEntity :

```properties
connector.channel.onSuccess.remote={"attributes": {"bcpg:productState": "Simulation"}}
```

### Création d'un répertoire backup

Dans le cadre d'un export CSV, vous pouvez choisir d'enrichir les fichiers CSV existants (connector.csv.appendToExistingFiles=true) ou bien de créer un répertoire backup (connector.csv.appendToExistingFiles=false) dans lequel les anciens CSV sont déplacés. Pour cela, il faut utiliser le paramètre connector.csv.appendToExistingFiles (par défault, absent donc false).

Pour enrichir les CSV existants et ne pas créer de répertoire backup :

```properties
connector.csv.appendToExistingFiles=true
```

### Debugging

Vous pouvez augmenter les niveaux de débuggage en utilisant la propriété **connector.debug.level** dans les arguments de la ligne de commande

```
-Dconnector.debug.level=trace
-Dconnector.debug.level=debug
-Dconnector.debug.level=info 
-Dconnector.debug.level=warn
-Dconnector.debug.level=error
```

Par défaut, le niveau INFO est utilisé.

### SSL

Il est possible de desactiver la vérification SSL avec l'option (Pour les tests seulement pour des raisons de sécurité) [>=3.2.2]:

```
ssl.trustAll=true
```

### Configuration des plugins

Un ou plusieurs plugins peuvent être utilisés pour extraire les données du PLM [ >= 3.0.0]

| Plugins                                           | Fonction                                      |
| ------------------------------------------------- | --------------------------------------------- |
| fr.becpg.connector.plugin.StandardCSVVisitor      | Extraction des données produits au format CSV |
| fr.becpg.connector.plugin.StandardDocumentVisitor | Extraction des documents                      |
| fr.becpg.connector.plugin.MultiLevelCSVVisitor    | Extractions des nomenclatures en multiniveau  |
| fr.becpg.connector.plugin.WorkflowCSVVisitor      | Extraction des worflows                       |
| fr.becpg.connector.plugin.EquadisVisitor          | Extraction au format Equadis XML              |
| fr.becpg.connector.plugin.X3CSVVisitor            | Extraction multiniveau X3                     |

Pour spécifier un ou plusieurs plugins, utilisez le paramètre suivant: 

```properties
connector.plugin.class=fr.becpg.connector.plugin.StandardCSVVisitor,fr.becpg.connector.plugin.StandardDocumentVisitor,fr.becpg.connector.plugin.WorkflowCSVVisitor    
```

### Plugin standard

#### Format CSV

Le plugin standard 'fr.becpg.connector.plugin.StandardCSVVisitor' permet de spécifier le format CSV  de sortie via l'option **connector.csv.format** 

```
connector.csv.format=
```

 

| Format          | Delimiter | Quote | Separator | Description                                                  |
| --------------- | --------- | ----- | --------- | --------- |
| (beCPG) |     ;     |    "   |     \r\n      |     Excel like format with ; separator. Quoted are forced     |
| NoQuoteFormat |     ;     |       |     \r\n      |     Excel like format with ; separator. Values are not quoted and special characters are escaped with `'\'`     |
| Excel            |      ,     |    "   |     \r\n      | Excel file format (using a comma as the value delimiter). Note that the actual value delimiter used by Excel is locale dependent, it might be necessary to customize this format to accommodate to your regional settings. |
| InformixUnloadCsv | , | " | \n | Values are not quoted and special characters are escaped with `'\'`The default NULL string is `"\\N"`. |
| MongoDBCsv | , | " |           | This is a comma-delimited format. Values are double quoted only if needed and special characters are escaped with `'"'`. A header line with field names is expected. |
| MySQL | \t |       | \n | This is a tab-delimited format with a LF character as the line separator. Values are not quoted and special characters are escaped with `'\'`. The default NULL string is `"\\N"`. |
| Oracle | , | " |           | This is a comma-delimited format with the system line separator character as the record separator.Values are double quoted when needed and special characters are escaped with `'"'`. The default NULL string is `""`. Values are trimmed. |
| PostgreSQLCsv | , | " | \n | This is a comma-delimited format with a LF character as the line separator. Values are double quoted and special characters are escaped with `'"'`. The default NULL string is `""`. |
| RFC4180 | , | " | \r\n | Comma separated format as defined by [RFC 4180](http://tools.ietf.org/html/rfc4180). |
|  	 	TDF | \t | " | \r\n | Tab-delimited format. |

Plus de détails sur les différents formats:

https://commons.apache.org/proper/commons-csv/apidocs/org/apache/commons/csv/CSVFormat.html



D'autres options permettent de spécifier le séparateur des associations ( ,  par défaut) [>=3.0.0]:

```
mapping.csv.assoc_separator=|
```

Le format des nombres (notation scientifique par defaut)  [>=3.2.1]:

```
connector.csv.decimalFormat=#.####
```

Ainsi que le format des dates (par défaut, notation ISO):

```
connector.csv.dateFormat=dd/MM/yyyy
```

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/DecimalFormat.html


#### Configuration des entités à extraire

La liste des entités à extraire est configurée par une requête de recherche où *%* est remplacé par la date de dernier import. Cette date est stockée dans le fichier **lastImport** qui peut être modifié ou supprimé manuellement.

```properties
connector.query.template=(@cm\\:created:[%s TO MAX] OR @cm\\:modified:[%s TO MAX]) AND ( ASPECT:\"bcpg:productAspect\" OR TYPE:\"bcpg:client\" OR TYPE:\"bcpg:supplier\" ) 
```

Dans l'exemple, toutes les entités de type produit ainsi que les clients et fournisseurs modifiés ou créés depuis le dernier import sont extraits.

#### Configuration des champs à extraire

Pour chaque type d'entités renvoyées, il faut définir les champs à
exporter dans le fichier CSV.

##### Export des entités

Pour chaque fichier à extraire il faut utiliser comme clé le prefix *mapping.csv* et le type d'entité, **mapping.csv.bcpg_finishedProduct** par exemple pour le type produit fini. Par défaut le nom du csv généré sera le nom du type, dans l'exemple précedent bcpg_finishedProduct.csv.

Il est possible de redéfinir le nom du fichier créé [>=3.2.1]:

```properties
mapping.csv.bcpg_finishedProduct.fileName=Custom file name
```

Il est également possible de mapper jusqu'a 10 fichiers pour un même type [>=3.2.1]:

```properties
mapping.csv.bcpg_finishedProduct.1.fileName=Sample file name
mapping.csv.bcpg_finishedProduct.1=bcpg:code,bcpg:erpCode,cm:name	
```

Il est également possible de spécifier des alias pour mapper plusieurs types avec le même mapping [>=3.2.2]:

```properties
mapping.csv.bcpg_rawMaterial.alias=article
mapping.csv.bcpg_semiFinishedProduct.alias=article
mapping.csv.article=bcpg:entityTplRef,cm:name,cm:title,bcpg:productHierarchy1|bcpg:erpCode
```

Exemple de mapping pour le type produit fini :

```properties
mapping.csv.bcpg_finishedProduct=bcpg:code,bcpg:erpCode,cm:name,cm:title,bcpg:eanCode,bcpg:code,bcpg:legalName,cm:description,bcpg:entityTplRef\
                    ,bcpg:productHierarchy1,bcpg:productHierarchy2,bcpg:bestBeforeDate,bcpg:certificateDate,bcpg:contractDate\
                    ,bcpg:foodContact,bcpg:netWeightUnit,bcpg:numberOfServings,bcpg:packagingDescription,bcpg:periodAfterOpening\
                    ,bcpg:precautionOfUseRef,bcpg:preparationTips,bcpg:priceCurrency,bcpg:productComments,bcpg:productDensity\
                    ,bcpg:productMicrobioCriteriaRef,bcpg:productQty,bcpg:productSpecifications,bcpg:productState,bcpg:productUnit\
                    ,bcpg:projectedQty,bcpg:servingSize,bcpg:startEffectivity,bcpg:storageConditionsRef\
                    ,bcpg:supplierPlants,bcpg:suppliers,bcpg:suppliers|bcpg:code,bcpg:suppliers|bcpg:erpCode\
                    ,bcpg:clients,bcpg:clients|bcpg:code,bcpg:clients|bcpg:erpCode,bcpg:unitPrice,bcpg:useByDate
```

Chaque champ est spécifié par son nom interne **bcpg:code** par exemple.  

Il est possible de spécifier le chemin d'un document afin de pouvoir le partager et obtenir son URL publique de partage. 

**Exemple pour exporter l'URL publique de documents:** 

```
/Images/produit.jpg,/Documents/${cm:name} - Fiche Technique Client.pdf
```

Ici le système va partager les documents produit.jpg et la fiche technique client, s'ils existent, puis il va ajouter leurs URL publiques dans le CSV.

Il est possible de spécifier plusieurs chemins sur une même colonne, permettant de tester chaque chemin jusqu'à l'obtention d'une URL. Exemple : 

```
/Images/produit.jpg|/Images/product.jpg
```

Pour les associations c'est le nom qui est exporté par défaut. Vous pouvez spécifier la propriétés de l'association à extraire avec la syntaxe **assoc_name|prop_name**. L'attribut bcpg:nodeRef est également disponible **assoc_name|bcpg:nodeRef**

**Exemple pour exporter le code ISO d'une association:** 

```
bcpg:ingListGeoOrigin|bcpg:geoOriginISOCode
```

Le connecteur standard permet aussi l'exportation des valeurs multilangues d'un champ de type "d:mltext". Pour exporter les différentes valeurs de ce champ, il suffit d'ajouter à la fin du nom le code "*locale*" de la langue concernée.

**Exemple :** 

**cm:description_en**, pour exporter la description en Anglais.

**bcpg:legalName_ja_JP**, pour exporter la valeur du libellé légal en Japonais.

##### Export des listes:

Comme les entités  il faut définir pour chaque liste un mapping des champs à exporter.

Exemple pour la liste nutriment et emballages :

```properties
mapping.csv.nutList=entity|bcpg:code,entity|bcpg:erpCode,bcpg:nutListNut,bcpg:nutListValue,bcpg:nutListFormulatedValue,bcpg:nutListUnit
mapping.csv.packagingList=entity|bcpg:code,entity|bcpg:erpCode,bcpg:packagingListProduct,bcpg:packagingListProduct|bcpg:erpCode,bcpg:packagingListQty,bcpg:packagingListUnit,bcpg:packagingListLossPerc,bcpg:packagingListPkgLevel,bcpg:packagingListIsMaster
```

Les champ préfixé par **entity|** permettre d'exporter les champs de l'entité (**article|** est un synonyme).

Exemple:

```
 entity|bcpg:code, entity|bcpg:erpCode, entity|bcpg:nodeRef
```


 Certaines listes spécifiques on leur propre champs [>=3.0.0]
 
###### Liste nutriment

Accés de la valeur du nutriment arrondi en colonne dans l'export d'entité

- **nut\["Code"\]** ("locale") Permet d'avoir une colonne avec la valeur arrondi du nutriment pour un pays

Exemple : 

- **nut\["ENER-KJO"\]**  ou  **nut\["ENER-KJO"\]("EU")**  ou  **nut\[ENER-KJO\](EU**) : Valeur arrondie de l'énergie pour l'europe équivalent à équivalent à 
- **nut\["FAT"\]("US")**  Valeur arrondie des Lipides pour les Etats Unis


Il est également possible dans la liste *bcpg:nutList* d'afficher les colonnes correspondants aux valeurs arrondis suivantes:

- roundedValue_locale
- roundedSecondaryValue_locale
- roundedSecondaryValuePerServing_locale
- roundedMini_locale
- roundedMaxi_locale
- roundedValuePerServing_locale
- roundedGDAPerc_locale
- roundedValuePerContainer_locale
- roundedGDAPercPerContainer_locale

Exemple:

```
roundedValue_EU
```

Nb: Il est nécessaire d'avoir les champs suivant dans le mapping

mapping.csv.nutList=bcpg:nutListNut|gs1:nutrientTypeCode,bcpg:nutListRoundedValue

###### Liste allégation

**claim[Code]** - Renvoi  true si l'allégation est respecté

Exemple : 

```
claim[ORGANIC_GS1]
```

Renvoi vrai si le produit est bio 

Nb: Il est nécessaire d'avoir les champs suivant dans le mapping

mapping.csv.labelClaimList=bcpg:lclLabelClaim|bcpg:labelClaimCode,bcpg:lclClaimValue,bcpg:lclComments

###### Liste ingrédient

**ingLabelingList[label]|value** - Renvoie l'étiquetage manuel s'il est renseigné, sinon l'étiquetage formulé correspondant au libellé "label".

**ingLabelingList[label]|manualValue** [>=4.1.1] - Renvoie l'étiquetage manuel correspondant au libellé "label".

**ingLabelingList[label]|formulatedValue** [>=4.1.1] - Renvoie l'étiquetage formulé correspondant au libellé "label".

Le "label" peut être soit l'index soit le libellé de l'étiquette.

Par défaut, le HTML est supprimé de l'étiquetage. En ajoutant "@" à la fin, vous pouvez obtenir la version avec le HTML.

Exemple :

```
ingLabelingList[Liste des ingrédients]|value
```

Remarque : Les champs suivants doivent être présents dans le mapping

mapping.csv.ingLabelingList=bcpg:illManualValue,bcpg:illValue,bcpg:illGrp|bcpg:lrLabel

###### Allergènes


**voluntaryAllergen** libellés légaux des allergènes volontaires séparés par des virgules
**voluntaryAllergen|code** codes des allergènes volontaires séparés par des virgules
**inVoluntaryAllergen** libellés légaux des allergènes involontaires séparés par des virgules
**inVoluntaryAllergen|code** codes des allergènes involontaires séparés par des virgules

Il est possible de récupérer les libellés légaux des allergènes volontaires et involontaires dans la langue souhaitée en rajoutant un underscore suivi par le code de la langue.

exemple :

**voluntaryAllergen_en** renvoi les libellés légaux des allergènes volontaires séparés par des virgules en Anglais

Nb: Il est nécessaire d'avoir les champs suivant dans le mapping

mapping.csv.allergenList=bcpg:allergenListAllergen|bcpg:allergenCode,bcpg:allergenListAllergen|bcpg:legalName,bcpg:allergenListVoluntary,bcpg:allergenListInVoluntary

###### Autre listes

**listName[0]|prop** - Renvoi la propriété prop de l'item 0 de la liste listName

Exemple :

```
compoList[0]|bcpg:compoListQty
```

#### Configuration via un fichier excel

Le mapping est défini dans becpg-connector.properties par défaut mais peut être réalisé directement dans un fichier excel en spécfiant l'option:

```properties
connector.csv.xlsxMapping=./sample/mapping.xlsx
```

Les entêtes du fichier sont les suivantes:

| Colonne A    |  Colonne B | Description                                   |
| ------- | -------------------- | ------------------------------------------------------------ |
| TYPE    | bcpg:finishedProduct | Indique le type à exporter                                   |
| HEADER  | Code ERP             | Indique le ou les entêtes du fichier CSV                    |
| FILTER  | props["entity|gs1:tradeItemUnitDescriptorCode"]!=null | Filtre les données |
| COLUMNS | bcpg:erpCode         | Indique les champs à exporter                                |
| #       | Commentaire          | Indique un commentaire dans le mapping non exporter dans le CSV |

- Chaque onglet du fichier excel correspondra à un fichier CSV.  
- Un onglet sans mapping n'est pas exporté
- Des formules excel peuvent être utilisés dans les headers
- \#MaValeur dans une colonne indique une valeur fixe

Exemple:

| TYPE    | bcpg:finishedProduct           |                   |                                |             |                   |
| ------- | ------------------------------ | ----------------- | ------------------------------ | ----------- | ----------------- |
| HEADER  | IMPORT                         | 3160920000201     | FICHEP_EA                      | SP          | M                 |
| HEADER  | ADDDESCRIPTION                 | ADDIDENTIFICATION | ADDITIONALDESCRIPT             | BARCODETYPE | BRANDNAME         |
| HEADER  | ADDDESCRIPTION                 | ADDIDENTIFICATION | ADDITIONALDESCRIPT             | BARCODETYPE | BRANDNAME         |
| COLUMNS | cm:title                       | bcpg:erpCode      | cm:description                 | #EAN-13     | bcpg:trademarkRef |
| #       | PCE LA COURSE DU PERE NOEL 55g | RX046             | PCE LA COURSE DU PERE NOEL 55g | EAN-13      | MARQUE CO.        |

Il est possible de définir un même mapping pour plusieurs types, par exemple :

| TYPE    | bcpg:finishedProduct,bcpg:semiFinishedProduct |

Il est également possible de définir un mapping pour une liste d'un type en particulier, par exemple :

| TYPE    | bcpg:rawMaterial|nutList |


#### Formules

Il est possible dans le mapping des champs d'utiliser des formules au format **SPEL**

La création d’une formule dans une colonne nécessite trois parties :

- Partie 1 : le mot **formula** (mot statique), utilisé pour dire que cette
  colonne est une formule SPEL.
- Partie 2 : un trait vertical | ;
- Partie 3 : la formule elle-même.

 Grâce aux formules SPEL vous pouvez personnaliser les colonnes qui seront affichées.

La formule la plus simple est d’afficher la valeur d’une propriété
(standard, dynamique, calculée).

Exemple :

     formula|props["bcpg:erpCode"] 

Permet d'obtenir le code ERP de l'entité

La liste props contient quant à elle toutes les propriétés d’une entité
ou d’une liste de données. Par la suite, vous pouvez récupérer la valeur
d’une propriété en passant le nom de cette dernière entre 2 crochets :
**props[ "NOM_PROPRIÉTÉ"]**

Pour les propriétés liées à des associations le caractère | doit être échappé par \\:

**props["bcpg:clients\\|cm:title"]** 

Pour faire des formules compliquées en utilisant des conditions :

```
formula|props["qty"] != null ? props["qty"] / prop["bcpg:compoListQty"] : props["qty"] 
```

Ce qui signifie :

Si la propriété **qty** n’est pas vide (null), calculer le pourcentage (qty / compoListQty ). Sinon, afficher la **qty**

Dans les formules SPEL vous pouvez faire des opérations mathématiques, logiques ou personnaliser l’affichage de données.


Exemple pour formater une valeur:

```
formula|(new java.text.DecimalFormat("#.###")).format(props["qty"])
```


Pour plus d’info sur le langage SPEL :

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/expressions.html

### Champs obligatoires

Il est possible de définir une liste de champs obligatoires via l'option **connector.csv.mandatoryFields**

Lorsqu'un champ obligatoire est défini et qu'un mapping contient ce champ, le système n'extraira pas les entités pour lesquelles ce champ est vide.

Exemple :

```
connector.csv.mandatoryFields=bcpg:useByDate,bcpg:unitPrice
```

### Configuration du connecteur de documents

Le connecteur de documents est un plugin du connecteur standard. Vous
devez donc tout d'abord l'activer en saisissant la ligne suivante dans
le fichier becpg-connector.properties

    connector.plugin.class=fr.becpg.connector.plugin.StandardDocumentVisitor

A noter que cette ligne est présente par défaut dans le fichier mais
commentée par un \# en début de ligne, il suffit alors de supprimer ce
caractère.

Une fois que le plugin est pris en compte dans la configuration, vous
pouvez modifier quels fichiers seront extraits pour chaque type d'entité
(produit fini, matière première, etc)

Chaque entité aura un mapping défini comme ceci :

    mapping.document.bcpg_<type de l'entité> = <champs à extraire>

Des mappings par défaut sont fournis avec le connecteur, permettant
d'extraire les fiches techniques clients et l'image du produit, et ce
pour les produits finis, semi-finis et les matières premières.

    mapping.document.bcpg_finishedProduct=/Images/produit.jpg|img_produit${bcpg:erpCode}.jpg;/Documents/${cm:name} - Fiche Technique Client.pdf|FT_client${bcpg:erpCode}.pdf
    mapping.document.bcpg_rawMaterial=/Images/produit.jpg|img_produit${bcpg:erpCode}.jpg;/Documents/${cm:name} - Fiche Technique Client.pdf|FT_client${bcpg:erpCode}.pdf
    mapping.document.bcpg_semiFinishedProduct=/Images/produit.jpg|img_produit${bcpg:erpCode}.jpg;/Documents/${cm:name} - Fiche Technique Client.pdf|FT_client${bcpg:erpCode}.pdf

On constate que chaque entité à extraire est formée de la même façon :

-   On a d'un côté le chemin sur l'instance du fichier à extraire
-   Ensuite, un trait vertical |
-   Suivi du nom (et chemin) du fichier extrait. Ceci permet de choisir
    comment sera nommé votre fichier, et s'il doit être rangé dans un
    autre dossier.

Ensuite, il est important de constater que chaque entité à extraire est
séparée de la suivante par des points virgules ;

Deux variables seront encodées et utilisables dans le nom du fichier
source (sur le système beCPG) et cibles (extraites sur votre système),
le code erp du produit en question, et son nom.
On peut donc imaginer extraire les fiches techniques dans un dossier
ayant pour nom "code ERP - nom de l'entité" :

    /Documents/${cm:name} - Fiche Technique Client.pdf|${bcpg:erpCode} - ${cm:name}/FT_client${bcpg:erpCode}.pdf
    
Il est possible d'utiliser une expression régulière pour matcher le fichier (*.pdf par exemple), les variables doc_cm:name, doc_path, doc_id, et doc_bcpg:nodeRef sont également disponible [>=3.2.2], un même fichier peut être exporter deux fois avec des noms différents.

    /Documents/*.xlsx|Documents/${doc_id}_${doc_cm:name}     
    

### Configuration du connecteur de workflows


Le connecteur de workflow permet d'exporter les workflows et leurs tâches au format CSV. Vous
pouvez l'activer en saisissant la ligne suivante dans le fichier becpg-connector.properties

	connector.plugin.class=fr.becpg.connector.plugin.WorkflowCSVVisitor


Les mapping suivants sont disponibles pour configurer les champs à extraire:

	mapping.csv.workflow_instances=id,name,title,description\
									,package|cm:name,formula|props["package\\|path"]!=null ?props["package\\|path"].split("/")[props["package\\|path"].split("/").length-1]:""\
									,isActive,startDate,priority,message,endDate,dueDate,initiator.userName,initiator.firstName,initiator.lastName
									
	mapping.csv.workflow_tasks=workflowInstance|id,workflowInstance|name,id,state,name,title,description,bpm:completionDate,bpm:workflowDueDate


La propriété **connector.query.template** permet de filtrer les workflows:

	connector.query.template=startedAfter=%sZ


Les valeurs possibles sont:

	 state,initiator,priority
	 ,dueBefore,dueAfter,
	 ,definitionId,definitionName,
	 ,startedBefore,startedAfter
	 ,completedBefore,completedAfter,exclude


### Configuration du connecteur multiniveaux

Le « Connecteur de Multi-niveau » est un plugin du connecteur standard.
Il permet d’extraire en format CSV les entités (produits finis, produits
semi-finis), leurs listes « Compositions », « Emballages en
multi-niveau » ainsi que les autres listes (nutriments, ingrédients,
ext.).
Ce plugin permet également d’extraire le niveau de chaque composant
(produit semi fini, matière première) et sa quantité au niveau du
produit.

En d’autres termes, le plugin permet d’extraire la composition d'un
semi-fini présent dans la composition d’un produit fini, celle d’un
semi-fini présent dans la composition d’un autre semi-fini et ainsi de
suite. De plus, il permet d’afficher le niveau de chaque composant.

Exemple :

Composition d’un produit fini :

![](./images/CMN1.png)

#### Calcul de la quantité de semi-fini au niveau du produit

Le niveau du **Semi-fini C** est égal à 3. Ainsi, pour calculer sa
quantité au niveau du produit, il faut commencer par calculer la
quantité de **Semi-fini B** au niveau du produit en appliquant la règle
de trois :

    QTE de Semi-fini B = (Poids du Semi-fini B / Poids du Semi-fini A) * Pois de Semi-fini A au niveau du produit 

- Poids du Semi-fini A = Somme des ses composants et on peut la trouver
aussi dans les caractéristiques formulées

![](./images/MeO.png)

- QTE de Semi-fini B = (0.31 / 0.66) \* 5 = 2,348 Kg.

Ce résultat est la quantité que vous utiliserez pour calculer la
quantité de **Semi-fini C**, et ainsi de suite à chaque fois que vous
descendez dans le niveau de composition.

Dans l’exemple :

- La quantité de **Semi-fini B** au niveau du produit =&gt; après le
calcul = 2,348 kg.

- Le poids de Semi-fini B = 0,17 kg ;

- La quantité de **Semi-fini C** utilisée dans la composition du
**Semi-fini B** = 0,1 kg.
- La quantité de **Semi-fini C** utilisée au niveau du produit = (0,1 / 0,17) * 2,348 = 1,381 kg.

Le raisonnement est le même pour calculer la quantité de matière
première MP 3 au niveau du produit en utilisant cette fois le résultat
1,381 kg.

Le plugin multi-niveau permet également de calculer les
valeurs suivantes :

- Nombre de produits par emballage PCB.

- Nombre de colis par palette dans chaque niveau d’emballage (primaire,
secondaire, tertiaire).
- La quantité d’emballage par produit c’est à dire la quantité
d’emballage utilisée par unité de produit.

De plus, il met à disposition les valeurs des caractéristiques formulées
(caractéristiques dynamiques). [Documentation sur les caractéristiques formulées](recipe-formulation.md#caracteristiques-formulées)

Ces caractéristiques sont extraites et vous pouvez les afficher
directement et/ou les utiliser pour faire des calculs comme
expliqué dans la partie : les formules SPEL.

N.B : les noms de ces propriétés sont bien les noms renseignés dans
l’application à l’exception près qu’il faut remplacer les espaces par
 un tiret du 8 ( _ ) et ajouter le préfixe **dyn_** au début du nom.

Par exemple : 

- Nom de propriété : « qty en multiniveau ».
- Nom extrait: « dyn_qty_en_multiniveau ».

#### Configuration

Comme dans le connecteur standard, pour activer le connecteur
multi-niveau, il suffit de saisir la ligne suivante dans le fichier
becpg-connector.properties :

    connector.plugin.class=fr.becpg.connector.plugin.MultiLevelCSVVisitor

Cette ligne débute par un # dans le fichier de configuration qu’il faut supprimer.

Une fois que le plugin est pris en compte dans la configuration, vous
pouvez modifier les fichiers qui seront extraits pour chaque type
d'entité (Produit fini, matière première, etc).
Chaque entité aura un mapping défini comme ceci :

    mapping.document.bcpg_<type de l'entité> = <champs à extraire>

#### Configuration des entités à extraire

Sachant que le plugin est dédié aux deux types d’entités (produit fini et
produit semi-fini), les fichiers csv sont indisponibles pour les autres
types d’entités (clients, fournisseurs, ext.).

Ainsi, la requête de recherche est assez similaire à la requête du
connecteur standard. En revanche, dans ce cas, il n’y a pas besoin
d’importer les entités de type client et fournisseur (supplier).

    connector.query.template=(@cm\\:created:[%s TO MAX] OR @cm\\:modified:[%s TO MAX]) AND ( TYPE:\"bcpg:finishedProduct\" OR TYPE:\"bcpg:semiFinishedProduct\")

## Annexe 1: Installation de certificat (Windows) {#annexe1}



Récupérer le certificat du serveur beCPG:

Sur Firefox, cliquer sur l'icône du cadenas.

![](./images/certificate-1.PNG)

Puis, cliquer sur la flèche à droite de Connexion sécurisée.

![](./images/certificate-2.PNG)

Puis, cliquer sur "Plus d'information".

![](./images/certificate-3.PNG)

Puis, cliquer sur "Afficher le certificat".
Puis, aller dans la section "Divers" et télécharger le certificat *PEM (cert)*.

![](./images/certificate-4.PNG)

Sauvegarder le certificat dans un dossier sur votre ordinateur.

Puis, ouvrir un terminal sur le dossier java. 
Vous pouvez l'ouvrir rapidement en écrivant cmd sur l'explorateur de dossier windows une fois dans le bon dossier.

Note: il est parfois nécessaire de démarrer le terminal avec les droits d'administrateurs pour procéder à la suite des étapes. Pour ouvrir un terminal en droit d'administateurs, vous pouvez chercher cmd sur votre barre windows, clique droit et "Ouvrir en tant qu'administrateur".

![](./images/certificate-6.PNG)

Vous pouvez ensuite vous positionner dans le bon dossier avec la commande *cd*.

Exemple avec un dossier java positionné dont l'itinéraire est C:\Program Files\Java\jre1.8.0_241.

Vérifier également que le bin\keytool et lib\security\cacerts sont présents dans votre dossier java.

![](./images/certificate-5.PNG)

Une fois le terminal ouvert, vous pouvez utiliser la commande suivante :

bin\keytool -import -alias **{nom certificat}** -file **{DESTINATION FICHIER .pem}** -keystore lib\security\cacerts

Exemple, avec un certificat becpg.pem positionné dans C:\tmp et un alias becpg :

    bin\keytool -import -alias becpg -file C:\tmp\becpg.pem -keystore lib\security\cacerts

Le mot de passe par défaut est : "**changeit**".

Suivre les messages affichés par le terminal.
Une fois installé, vous pouvez utiliser la commande suivante :

bin\keytool -list -v -alias **{nom certificat}** -keystore lib\security\cacerts

En reprenant notre exemple précédent:

    bin\keytool -list -v -alias becpg -keystore lib\security\cacerts  
