Formulation de la recette (composition)
La formulation permet de calculer les caractéristiques du produit en fonction de sa composition (recette). Les listes suivantes sont calculées automatiquement par la formulation :
- Coûts
- Nutriments ou Valeurs Nutritionnelles
- Ingrédients
- Étiquetage
- Allergènes
- Certaines caractéristiques Physico-chimiques
- Les Allégations de type certification
La liste composition est composée de plusieurs colonnes :
- Le composant (produit : matière première, semi-fini, ou même un produit fini)
- La quantité mise en œuvre dans la recette
- L'unité de mise en œuvre (kg, mg, g, L, mL, P, %);
- Le poids
- La Freinte (%)
- Le Rendement (%)

4 informations sont nécessaires à la formulation :
- La Composition du produit.
- La Quantité nette après transformation : il s'agit de la quantité de produit obtenue après l'étape de transformation en prenant en compte les pertes liées au rendement.
- L'Unité du produit (kg, L, P) : unité de vente du produit. C'est cette unité qui définit l'unité du prix (€/kg, €/L) et l'unité des nutriments (/100g ou /100mL).
- La Densité des produits liquides : la densité permet de convertir un litre ou une pièce de produit en kg.
Ajout d'une matière première (MP)
Naviguez vers la composition du produit en cliquant sur la liste "Composition".
Pour travailler en mode plein écran, cliquez sur le logo entouré en rouge sur la capture d'écran ci-dessous :
Ajouter une MP existante
Ajoutez une matière première existante à la recette en tapant les 3 premières lettres de son nom :

Créer une nouvelle MP
Il est également possible de créer une nouvelle MP en renseignant son nom et l'unité d'utilisation (par défaut le kg).


Importer des MP depuis les bases de données nutritionnelles
Il est possible de créer une matière première à partir d'une base nutritionnelle. beCPG met à disposition les bases de données nutritionnelles CIQUAL et USDA. L'import des matières premières est disponible depuis la composition d'un produit :
- Cliquez sur l'icône en forme de flèche puis sur "Importer une MP" ;
- Choisissez une des bases de données proposées ;
- Tapez ensuite les premières lettres du nom de la MP que vous souhaitez importer ;
- Le système suggère des MP ;
- Sélectionnez la MP que vous souhaitez importer ;
- Cliquez sur "OK" pour importer la MP (vous pouvez sélectionner plusieurs MP avant d'importer) ;
- Un message vous dit que la MP a été importée avec succès.


Renseigner les quantités
Une fois les MP ajoutées, vous pouvez renseigner leurs quantités.
Éditez la ligne en cliquant sur l'action "Modifier".

Double-cliquez sur la cellule d'une ligne et éditez-la. Pour changer de cellule, utilisez le clavier ou la souris.

Renseignez les données des MP nouvellement créées pour la formulation (le coût, les ingrédients, les allergènes, etc.).


Remarque : pour travailler sur la matière première en gardant la fenêtre du produit fini affichée, ouvrez un nouvel onglet. Pour cela, faites un clic droit > "Ouvrir dans un nouvel onglet".

Création d'un semi-fini
- Naviguez sur la composition de la soupe en cliquant sur la liste "Composition". Cliquez sur "Créer un produit..." et sélectionnez "Semi-fini...".

Renseignez son nom "Crouton de pain" et sa quantité nette (100kg). La quantité nette du semi-fini correspond à la quantité du batch après transformation. Une fois le semi-fini créé, il apparaît dans la composition. Renseignez la quantité mise en œuvre dans la recette (30g).
Cliquez sur le semi-fini pour naviguer sur sa recette. Passez en mode plein écran. Ajoutez les composants (farine, eau, sel...).

- Cliquez sur "Formuler". Sur cette recette, le rendement est de 62,7% car on a mis en œuvre 159,5kg de matière pour 100kg de produit après transformation.

- Quittez le mode plein écran (en cliquant sur l'icône plein écran).
- Naviguez sur le produit "Soupe aux courgettes" en passant par les cas d'emploi.

- Cliquez sur "Formuler" pour que le produit "Soupe aux courgettes" prenne en compte les caractéristiques du Semi-fini "Croutons de pain".
Copier les enfants
La fonction "Copier les enfants" permet de remplacer un composant de type semi-fini ou produit fini dans une composition par les composants qui le constituent. Le niveau est ainsi supprimé de la composition et ses composants sont ajoutés directement au premier niveau de la composition. Les quantités sont automatiquement recalculées en fonction de la quantité initiale du semi-fini.
Par exemple, le semi-fini SF1 (quantité nette : 10 kg) est composé de :
- 5 kg de MP1
- 2 kg de MP2
- 3 kg de MP3
Si la composition utilise 1 kg de SF1 dans le PF1, la fonction ajoute directement dans le PF1 :
- 500 g de MP1
- 200 g de MP2
- 300 g de MP3

Si le semi-fini contient des variantes, seuls les composants de la variante par défaut sont pris en compte.

Note : pour regrouper les composants en doublon, accédez à la composition, sélectionnez tous les composants, puis cliquez sur « Regrouper ».

Copie d'un composant d'une recette
La fonction « Copier le produit » permet de cloner un article directement depuis la liste « composition ». Elle est particulièrement utile pour expérimenter une nouvelle formulation, qu’il s’agisse d’un produit semi-fini ou d’une matière première, sans impacter le produit original. De plus, l’entité est automatiquement remplacée dans la composition par la copie.
Pour effectuer une copie, ouvrez la composition d’un produit, cliquez sur « … » à côté du composant concerné, puis sélectionnez « Copier le produit ».

Vous pouvez ensuite modifier cette copie en accédant à son détail via la navigation. Un raccourci situé en haut à gauche vous permet de revenir facilement à la composition principale.
Simuler un composant de la recette
La fonction « Simuler le produit » permet de créer une branche d'un article directement depuis la liste « composition ». Elle est particulièrement utile pour expérimenter une nouvelle formulation, qu’il s’agisse d’un produit semi-fini ou d’une matière première, sans affecter les produits finis existants qui en dépendent. De plus, l’entité est automatiquement remplacée dans la composition par la nouvelle branche.
Pour effectuer une simulation, ouvrez la composition d’un produit, cliquez sur « … » à côté du composant concerné, puis sélectionnez « Simuler le produit ».

Vous pouvez ensuite effectuer les modifications nécessaires en naviguant dans cette nouvelle branche. Un raccourci situé en haut à gauche vous permet de revenir facilement à la composition principale.
Dupliquer la ligne d'un composant
L’outil « Dupliquer la ligne » permet de créer une copie exacte d'une ligne dans la composition. Si un composant est jugé intéressant, il est possible de l'ajouter une seconde fois dans la composition sans avoir à le rechercher en cliquant sur « Ajouter un élément ».
Pour dupliquer une ligne, accédez à la composition d’un produit, puis cliquez sur « … » au niveau du composant concerné et sélectionnez « Dupliquer la ligne ».

Une nouvelle ligne de ce composant est alors automatiquement ajoutée dans la composition.
Rendements
Le rendement représente la perte en eau subie au cours des différents procédés de transformation. Il correspond au rapport entre la quantité de produit final et de produit initial.
Rendement = Quantité finale/Quantité initial x 100
Lorsque le rendement est pris en compte, les valeurs nutritionnelles du produit s’en trouvent impactées par l'augmentation de la matière sèche.
Dans le logiciel beCPG, on appelle la quantité de produit initiale « Quantité mise en œuvre » et la quantité de produit finale « Quantité nette ». Il existe 2 façons d'appliquer un rendement :
La quantité utilisée dans la composition est supérieure à la quantité nette du produit (propriété). Un rendement est calculé et appliqué automatiquement.

L'ajout d'un rendement sur la ligne de la composition va recalculer le poids pour atteindre la quantité nette affichée. Ex : pour avoir 210 g avec un rendement à 80 %, il faut mettre en œuvre 266,3 g.

Il est possible de voir apparaître les champs « Quantité nette » et « Rendement » dans les caractéristiques dynamiques.
Impacter le rendement à l'ingrédient eau
Les produits subissant une cuisson voient leur quantité d'eau diminuer par évaporation. Les quantités des autres ingrédients sont augmentées proportionnellement à la concentration. beCPG propose un paramétrage supplémentaire afin d'impacter le rendement à l'ingrédient "eau". La colonne "Qté ap. rdmt (%)" de l'onglet ingrédient affichera les quantités en prenant en compte l'évaporation de l'eau dans le produit.

Il est aussi possible d'étiqueter les quantités après cuisson. Cliquez ici pour plus d'informations.
Pour cela, installez au préalable l'aspect "eau" sur l'ingrédient "eau" et la(les) MP eau(x) : N'hésitez pas à nous contacter si vous avez besoin d'assistance sur cette opération.
- Prérequis : soyez Administrateur du système.
- Récupérez le nœud de l'ingrédient eau et de la(les) MP eau(x). (Uniquement celle(s) composée(s) à 100% d'eau)
- Dans la console Admin, appliquez le script suivant :
var node = search.findNode("workspace://SpacesStore/<identifiant-du-noeud>");
node.addAspect('bcpg:waterAspect');
Note : si vous réalisez des étiquetages en utilisant les quantités après rendement, pensez à renseigner la dénomination légale de la matière première eau.
Rendement manuel
Dans le cas où les quantités des composants de votre recette sont entrées en pourcentage, beCPG ne prend pas en compte le rendement. Il n'est en effet pas possible d'effectuer le rapport entre les quantités rentrantes et sortantes pour déterminer le rendement. Dans ce type de cas, vous devez entrer votre rendement manuellement. La première étape consiste à rentrer vos composants en pourcentage dans la liste composition de votre produit fini. Vous devez également entrer un poids net dans les propriétés de votre produit fini.
Retournez ensuite dans la liste composition de votre produit fini et dans la section caractéristiques dynamiques de la liste composition. La formule "Rendement manuel" vous permet de renseigner manuellement votre rendement. Le logiciel calcule ensuite le poids d'entrée à partir de la quantité nette et du rendement.
Rendement après remise en œuvre
Sur la liste des ingrédients, vous avez la possibilité d'afficher le pourcentage des ingrédients après remise en œuvre.
Pour cela, ajoutez la règle "secondaryYield" en veillant bien à indiquer "Début" dans le champ "Ordre d'exécution" :

La colonne "Qté ap. REO (%)" présente sur la liste des ingrédients va ensuite se calculer automatiquement en fonction de la valeur indiquée dans "SecondaryYield".

Si vous souhaitez ensuite réaliser l'étiquetage en fonction des quantités après remise en œuvre, cliquez ici.
Freinte
En droit international de la vente, la freinte correspond à une diminution de la valeur d’une marchandise liée à une avarie de transport ou à une perte (source). En d’autres termes, il s’agit d’une perte de matière au cours du transport ou sur le lieu de production. Par exemple, pour le fromage, il peut s’agir d’une perte de matière durant la lipolyse ou la protéolyse. Concernant les pommes, il peut s’agir des pertes dues à l’épluchage. Lorsque la freinte est prise en compte, il y a un impact sur les coûts mais pas sur les valeurs nutritionnelles du produit. En effet, puisqu’il y a des pertes, la quantité nette diminue donc il faut produire plus pour avoir la quantité souhaitée par le client.
Freinte = [(Quantité consommée / Quantité nette après pertes) * 100] - 100
Dans le logiciel beCPG, on la renseigne pour chaque matière première au niveau de la composition du produit. Par exemple, si on a 10% de pertes de farine sur le tapis roulant, on marque 10% au niveau de la freinte ce qui augmentera les coûts de 10%.
Quantité consommée = Quantité nette après pertes * (1 + Freinte / 100)
Coût avec freinte = Coût unitaire * Quantité nette après pertes * (1 + Freinte / 100)
Coûts avant freinte :

Modification de la freinte pour la farine :

Coûts après ajout de la freinte :

Caractéristiques dynamiques
Caractéristiques dynamiques simples
Les caractéristiques dynamiques sont personnalisables. Ces caractéristiques spécifiques à votre activité seront calculées avec la formulation.
Exemple :
- Profit ;
- Rendement ;
- HPD < 78% (% eau x 100 )/(100 - % lipides) ;
- Détail du Nutri-Score :
var context = T(fr.becpg.repo.product.formulation.score.NutriScoreContext).parse(nutrientDetails);
#context.toHtmlDisplayValue();
- Afficher le Nutri-Score :
"@html<span class='viewmode-value nutrient-class'><span class='selected nutrient-class-"+nutrientClass.toLowerCase()+"' >"+nutrientClass+"</span></span>"
Une fois que la composition du produit est définie, le système calcule les caractéristiques dynamiques du produit lorsque l'on clique sur le bouton « Formuler ».

Pour ajouter une caractéristique formulée :
- Cliquez sur "Ajouter" (dans l'encart "Caractéristiques formulées" de la liste "Composition") ;
- Renseignez le nom du calcul ;
- Renseignez le titre (nom en multilingue qui peut être traduit dans l'application) ;
- Renseignez l'expression en sélectionnant la liste, la caractéristique et le champ que l'on souhaite (ex : nutriments > Sel > Valeur). La formule apparaît alors dans l'éditeur de formules.
Lors de la création d'une caractéristique formulée, plusieurs options se proposent à vous pour la synchronisation :
- Modèle : le calcul est présent sur le modèle mais n’apparaît pas. Le calcul est masqué pour éviter la surcharge de la fenêtre ;
- Manuel : le calcul est spécifique à un produit ;
- Synchronisé : si vous modifiez le calcul, celui-ci se synchronise automatiquement sur tous les produits.

Caractéristiques dynamiques en colonne (colonnes dynamiques)
Ces caractéristiques dynamiques sont disponibles sous un format colonne dans la composition ou les emballages. Ces colonnes sont masquées par défaut. En sélectionnant une colonne, elle apparaît. 10 colonnes dynamiques sont disponibles.

Pour ajouter une caractéristique formulée en colonne, il faut :
- Cliquez sur "Ajouter" ;
- Renseignez le nom de la caractéristique formulée en colonne ;
- Renseignez le titre (nom en multilingue qui peut être traduit dans l'application) ;
- Renseignez la colonne ;
Renseignez l'expression en sélectionnant la liste, la caractéristique et le champ que l'on souhaite (ex : nutriments > Sel > Valeur). La formule apparaît alors dans l'éditeur de formules.
S'il s'agit d'une caractéristique de la MP, il faut ajouter "dataListItemEntity." devant l'expression.
- S'il s'agit d'une caractéristique du produit formulé, il faut ajouter "entity." devant l'expression.

Voici quelques exemples de caractéristiques (pour les copier, il faut copier/coller dans l'éditeur bloc-notes) :
- Coût Matière première (€/kg) :
dataListItemEntity.costList.size() != 0 ? dataListItemEntity.costList[0].value * dataListItem.qty : ""
Avec prise en compte de la densité.
dataListItemEntity.costList.size() != 0 ? dataListItemEntity.costList[0].value * dataListItem.qty / (entity.qty * entity.density) : ""
- Indicateur de l’impact des coûts des matières premières (via une barre de progrès)
'<progress value="'+100*(dataListItemEntity.cost['workspace://SpacesStore/2ea642fd-792d-494b-b295-37577cd4d60e']?.value?:0) * (dataListItem.compoListUnit.toString().equals("P") and dataListItemEntity.unit.toString().equals("P") ? dataListItem.qtySubFormula : (dataListItemEntity.isLiquid() ? dataListItem.volume : dataListItem.qty)) * (1 + (dataListItem.lossPerc?:0) / 100)/entity.cost['workspace://SpacesStore/2ea642fd-792d-494b-b295-37577cd4d60e']?.valuePerProduct+'" max="100" style="width:80px;"></progress>'
Quantité Échantillon (kg)
dataListItem.qty * entity.compoListView.dynamicCharactList.?[title == 'Nb Ech'][0].valueCoût Emballage (€/kg)
dataListItemEntity.costList.size() != 0 ? dataListItemEntity.costList[0].value * (dataListItem.packagingListUnit.toString() == "PP" ? 1/dataListItem.qty : dataListItem.qty) / (entity.qty * entity.density) : ""Coût Emballage (€/UVC)
dataListItemEntity.costList.size() != 0 ? dataListItemEntity.costList[0].value * (dataListItem.packagingListUnit.toString() == "PP" ? 1/dataListItem.qty : dataListItem.qty) : ""À ce jour, il n'existe pas d'éditeur pour ajouter une caractéristique de type colonne. Il faut donc écrire directement la formule. Plusieurs variables sont accessibles :
entity : accès au produit formulé ;
- dataListItemEntity : accès au composant et à ses listes de données (ex : dataListItemEntity.costList permet d'accéder aux coûts du composant);
- dataListItem : accès à l'élément de la liste composite (Composition, Emballage).
Dans ce mode, les fonctions sum(RANGE, FORMULE) et avg(RANGE, FORMULE) sont disponibles. Dans la formule, dataListItem désigne chaque ligne de la plage et dataListItemEntity son composant :
sum(@beCPG.children(dataListItem, entity.compoListView.compoList), "dataListItemEntity.costList[0].value * dataListItem.qty")
ou :
sum(entity.compoListView.compoList.?[parent == #root.dataListItem], "dataListItemEntity.costList[0].value * dataListItem.qty")
Plus d'informations sur le langage SpEL
Format des résultats
Par défaut, le système affiche 4 décimales significatives. Il est possible de préciser le format des résultats :
- new java.text.DecimalFormat("0.00##").format(1.22222222) ou @beCPG.formatNumber(1.22222222, "0.00##") affichera 1,2222
- new java.text.DecimalFormat("0.00##").format(1.2200) ou @beCPG.formatNumber(1.2200, "0.00##") affichera 1,22
- new java.text.DecimalFormat("0.0000").format(1.2200) ou @beCPG.formatNumber(1.2200, "0.0000") affichera 1,2200
Pour les champs numériques de type double :
- T(java.lang.Math).round(12.2) affichera 12 et T(java.lang.Math).round(12.22*10)/10 affichera 12.2