# Spécifications Technique 2.16.0
### ==TMA-155 Ajout des frais de distribution en fiche produit et actualisation composition pack (si existant).==
Travail a faire :
- Lors de l'intégration d'un CGN, valoriser et stocker la valeur contenue dans les champs tauxDistri et fraiDistri associé à un article si une valeur est différente de "vide".
- Ajouter un nouveau service qui renvoie les frais de distribution ainsi que le montant MLO ALO pour un article Commande donnée en paramètre.
Ajouter deux nouveaux champs en fiche article :
**Taux frais de distribution** : XX,XX %
**Montant frais de distribution** : YY,YY €
Par défault les montants seront initialiser a 0.0 pour les deux lignes.
#### **Scénario 1 : visualiser la fiche article depuis le catalogue général**
Conditions **Taux frais de distribution** :
```
Si tauxDistri > 0
Taux frais de distribution = **tauxDistri** %
Sinon si tauxDistri == 0
Taux frais de distribution = 0.00 %
Sinon
Ne pas afficher la ligne
```
Conditions **Montant frais de distribution** :
```
Si tauxDistri > 0
Montant frais de distribution = **fraisDistri** %
Sinon si tauxDistri == 0
Montant frais de distribution = 0.00 €
Sinon
Ne pas afficher la ligne
```
#### **Scénario 2 : Visualiser la fiche article depuis une commande**
Récupération des deux valeurs auprès d'un nouveau service coté remise qui va envoyer les frais de distrib ET la remise MLO/ALO de l'article du bon de commande.
Conditions **Taux frais de distribution** :
```
Si l'article du bon de commande contient une remise de type MLO ou ALO supérieur ou égale à 0
- Alors Taux frais de distribution = **taux** (MLO ou ALO) %
Sinon
- Cacher ligne
```
Conditions **Montant frais de distribution** :
```
Si une valeur existe dans la colonne frais distribution du bon de commande et que supérieur ou égale à 0
- Alors Montant frais de distribution = **Frais distribution du bon de commande**.
Sinon
- Cacher ligne
```
Respecter ce fonctionnement avec les boutons précédant suivant
#### **En addition**
Ajouter deux nouvelles colonnes dans le tableau de l'onglet "Composition du pack" :
**Prix hors FD (En €)**
```
Si tauxDistri > 0
PrixHorsFD = puht - fraisDistri
Sinon
PrixHorsFD = puht
```
**Frais distrib. (en €)**
```
Si tauxDistri > 0
FraisDistrib = fraisDistri
Sinon si tauxDistri == 0
FraisDistrib = 0
Sinon
FraisDistrib = vide
```
Renommer la colonne Prix de vente unitaire HT par **Prix Catalogue HT (en €)**
### ==TMA-308 Ordre d'affichage du BDC sur lot2==
Ajouter le champ "ordre" sur les articles des catalogues d'offres.
Trier les articles en fonction de cette nouvelle valeur dans le BDC, l'export BDC Excel, l'affichage SA et les retours ERP par ordre d'affichage croissant.
Règle de regroupement :
Si valeur de champ "ordre" consécutive ET si arborescence en commun, alors regrouper l'arborescence (nature/rayon/famille/sous-famille) des articles au maximum,
Sinon répéter les niveaux.
#### **Scénario 1 : Champs "ordre" nul**
Si le champ "ordre" n'existe pas alors on laisse l'ordre existant (aujourd'hui).
#### **Scénario 2 : Tous les articles possèdent un champ "ordre" différent de null**
Trier les articles en fonction de leur valeur "ordre" par ordre croissant ET respecter règle de regroupement.
Si même valeur de champ "ordre" alors on laisse l'ordre existant (aujourd'hui).
#### **Scénario 3 : Seulement une partie des articles possèdent un champ "ordre" non nul**
Si champ "ordre" alors afficher en premier ces articles par ordre croissant ET respecter règle de regroupement puis afficher les autres articles d'ordre existant (aujourd'hui).
:::info
### Risque de regression
Risque de regression au niveau de l'export du bon de commande
Risque de regression sur l'affichage des article MERCURIALE
:::
### ==TMA-127 - Persistance des filtres sur onglet Liste Magasin/Recap Commande pour utilisateur SA==
Ajouter la persistance des filtres pour les onglets : récap commande et Liste magasins
Faire en sorte de mémoriser les filtres "conseiller ALI/NAL/ULF", "plateforme" statut et BOX/CAM Obligatoire/Vrac
- Conserver filtres "conseiller ALI/NAL/ULF" tout le temps. (Il n'y a pas de bouton de réinitialisation.
- Ne pas conserver le filtre "Statut", "Plateforme et BOX/CAM Obligatoire/Vrac" lors d'un changement d'offre ni après déconnexion/reconnexion
:::info
### Risque de regression
Risque de régression sur les autres éléments persistant de b2bio
:::
### ==TMA-281 - Ré-import des stocks limités==
#### **Travail a faire :**
- Ajouter un service dédié à Redis au projet BtoBio-Back
- Service de connection à Redis
- Implémenter les différentes fonction utiles à la récupération et la modification de données
- Prévoir l'architecture permettant l'ajout de nouveau service REST dédié à Redis
- Ajouter le champ "stockLimite": (boolean) à un article du catalogue (true = un article à stock limité sinon false)
- Ajouter le champ "maj" à CatalogueDto (XML OFFRE COM)
- Adapter la fonction d'import d'une offre pour permettre la mise a jour du stock sur les articles associés à une offre
#### **Architecture Redis**
CLE :
```
codeOffre#codeProduit // A verifier codeOffre peut pas '#' et codeProduit
```
VALEUR :
```json
{
"stockCommandee" : number, // NB Articles disponible à la commande
"stockInitial" : number, // NB articles lors de la premiere intégration
"stockActuel" : number // Dernier stock initial mit à jour
}
```
:::info
### Attention
En clé, il faut ajouter le code de l'offre et le code produit.
Nous suggérons d'ajouter le symbole '**#**' comme délimiteur.
Cela implique que le code produit ET que le code d'une offre ne pourra jamais contenir le symbole '**#**'.
:::
#### **Algorithme stock restant Integration d'une offre**
Lors de l'intégration d'un Catalogue d'offre
```
Si <maj></maj> est présent ET est égale à "contingentement"
Mettre a jour les stocks de tous les articles
Pour chaque article :
Si contingentement est vide ou absent
stockLimite = false (L'article n'a pas de stock limité)
Sinon
stockLimite = true (L'article à un stock limité)
Si aucune valeur existe dans redis
stockInitial = contingentement
stockActuel = contingentement
stockCommandee = 0
Sinon
Si stockCommandee est vide (exemple : erreur serveur, tout est supprimé pour X raison)
stockCommandee = Récupération des quantités déja commandées (sum(qte) articlecommande coté BDD)
Si contingentement >= stockCommandee
stockActuel = contingentement (mise à jour du stock)
Sinon
stockActuel = stockCommandee
Afficher Warning
```
:::info
### Risque de regression
Risque de régressions sur des incohérences de données
:::
### ==TMA-280 - Gestion des stocks limités==
#### **Travail a faire :**
- Ajouter un nouveau end point permettant de fournir les stocks restant d'une liste d'articles.
- Ajouter une nouvelle ligne 'Stock restant XXX' en dessous de la quantité d'un article en bon de commande et en fiche article et afficher le stock restant associé
- Modifier la requête PATCH permettant l'ajout ou la modification d'une quantité d'un article en vérifiant si la quantité demandée est inférieur ou égale au stock restant.
- Modifier la requête de création d'une commande et vérifier que la quantité de l'article est inférieur ou égale au stock restant.
- Ajuster les erreurs à l'affichage
#### **Algorithme Lecture et Ecriture**
```
// Lecture des stocks pour une commande magasin
Lock de la clé Redis(codeOffre#codeProduit)
Stocks = Récupération des stock de rédis
Si(Stocks inexistant){
Stocks.stockActuel = Récupération du stock actuel de l'article pour l'offre
Stocks.stockCommandee = Récupération des quantités déja commandées (sum(qte) articlecommande)
Stocks = Valorisation du stock dans la variable locale
Mise à jour dans Redis de la clé Redis(codeOffre#codeProduit)
}
Libération du Lock de la clé Redis(codeOffre#codeProduit)
renvoyer Stocks
```
```
// Mise à jour des stocks pour une commande magasins
Lock de la clé Redis(codeOffre # codeProduit)
Stocks = Récupération des stock de rédis
Si(Stocks inexistant){
Stocks.stockActuel = Récupération du stock actuel de l'article pour l'offre
Stocks.stockCommandee = Récupération des quantités déja commandées (sum(qte) articlecommande)
Stocks = Valorisation du stock dans la variable locale
}
Stocks.stockCommandee = Stocks.stockCommandee + quantités commandées par le magasin
Stocks.stockRestant = Stocks.stockActuel - Stocks.stockCommandee
Mise à jour dans Redis de la clé Redis(codeOffre#codeProduit)
Libération du Lock de la clé Redis(codeOffre # codeProduit)
```
#### **Scénario 1 : Création d'une commande (bon de commande ou fiche article)**
```
Si la quantité est supérieure au stock restant ALORS
- Créer commande ET Afficher message
```
#### **Scénario 2 : Modification de commande (Statut Brouillon) (bon de commande ou fiche article)**
```
Si la quantité est supérieure au stock restant ALORS
- Afficher message erreur
```
#### **Scénario 3 : Click sur "commander"**
```
boolean miseAJourPossible = true
Parcourir chaque article avec stockRestant de la commande
VERROU
Si qte <= stockRestant
Alors ajuster les stocks restant dans redis (stockCommandee +1)
Sinon
Renvoyer Erreur de Stock 409
VERROU
```
#### **Scénario 4 : Modification de commande (Statut Commandé) (bon de commande ou fiche article)**
```
Si modification de la quantité ET QUE click sur enregistrer ou calculerRemise ALORS
Si augmentation de la quantité ET qu'elle est inférieur au stock restant
Parcourir chaque article avec stockRestant de la commande
VERROU
Si qte >= stockRestant
Alors ajuster les stocks restant dans redis (stockCommandee +1)
Sinon
Renvoyer Erreur de Stock 409
VERROU
Sinon SI diminution de la quantité
Parcourir chaque article avec stockRestant de la commande
VERROU
Si qte >= stockRestant
Alors ajuster les stocks restant dans redis (stockCommandee +1)
Sinon
Renvoyer Erreur de Stock 409
VERROU
```
#### **Scénario 5 : Modification d'une quantité coté GESTIONNAIRE (Controle des quantités)**
```
Pour chaque article du tableau
Si l'Article contient un stock limité
- Alors griser la colonne + readonly
Sinon
- Laisser tel quel
```
:::info
### Risque de regression
Risque de régression sur l'affichage du bon de commande
:::
### ==TMA-161 - Affichage du suivi de commande en magasin==
Modifier l'affichage des offres sur onglet suivi de commande en fonction de leur ancienneté et le leur type
- Offre précommande ferme ou avec réassort
Afficher les offres de type "offre évenementielle" datant de moins de 14 mois après la date de fin d'opération (commandes préco et réassort)
--> Récupérer en base les commandes si finCommande >= dateDuJour - 14 mois puis afficher commande
--> Récupérer en base les commandes si dateFinReassort >= dateDuJour - 14 mois puis afficher commande
Afficher les offres pour tous les autres types datant de moins de 6 mois après date de fin d'opération (commandes préco et réassort)
--> Récupérer en base les commandes si finCommande >= dateDuJour - 6 mois puis afficher commande
--> Récupérer en base les commandes si dateFinReassort >= dateDuJour - 6 mois puis afficher commande
- Offre précommande FEL
Afficher les offres datant de moins de deux mois après la date de fin de précommande
--> Récupérer en base les commandes si dateFinPrecommande >= dateDuJour - 2 mois puis afficher commande
- Offre opération
Afficher les offres de type "FEL" datant de moins de 2 mois après la date de création de commande
--> Récupérer en base les commandes si dateCreationCommande >= dateDuJour - 2 mois puis afficher commande
Afficher les autres offres datant de moins de 2 mois après la date de création de commande réelle
--> Récupérer en base les commandes si dateCreationCommande >= dateDuJour - 2 mois puis afficher commande
Ajouter 5 nouvelles valeurs en BDD (table paramètres fonctionnels, schéma référentiel) correspondant au critère d'affichage (en nb de mois) :
- PRECO : 6
- PRECO_EVENEMENTIEL : 14
- PRECO_FEL : 6
- OPE : 2
- OPE_FEL : 2
### ==TMA-314 - Suppression sur offre en réassort des semaines ou jours affichés en opérations==
#### **Travail a faire :**
Masquer la colonne 'Sem Jour livraison'
Modifier l'intégration des articles à une commande si l'offre est en période de réassort lors d'un retour ERP.
Modifier l'affichage du recap commande
Ajout d'un nouveau flag pour déterminer que la commande est de type OPE
#### **Ajout d'article à une commande:**
```
Si precommande == NULL ET que la date du jour est supérieur ou égale à la date de debut réassort
FLAG OPE = true (commande)
article.commandeSemaine = vide;
article.typeSemaine = null;
article.semaineOriginal = null;
article.semaine = null;
Sinon
FLAG OPE = false (commande)
```
#### **Retour ERP**
Lors de l'intégration d'une offre sur une commande dont le flag OPE = true, l'intégration se fait uniquement sur **codeArt**
#### **Page récap coté gestionnaire**
Ajout d'une nouvelle colonne "OPE" sur les onglets : 'Contrôle des quantités / engagement / Total'.
Afficher dans cette colonne à côté de chaque article si la date du jour est superieur ou egale a la periode de réassort. Les quantités correspondent aux commandes dont le flag OPE est égale à TRUE.
Pas de modification de l'export appro et tableau intégration.