Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

MercatorPenguin en écriture : transferts de dépôts

0000002986     -      19/06/2022

MercatorPenguin 2.9 permet la création et la modification de transferts de dépôts, pour tous les types (standard, préparation, envoi, réception). Ceci requiert une licence spécifique par appareil mobile utilisant cette fonctionnalité (PENGUINBILLING=...) ainsi qu'une version 10.8 ou ultérieure de Mercator.

La gestion des licences contient un système d'activation et de désactivation des appareils mobiles pouvant utiliser cette fonctionnalité. Cette désactivation peut être effectuée, soit via la page de maintenance de MercatorPenguinServer, soit via le bundle de maintenance. Dans tous les cas, MercatorPenguinServer doit pouvoir se connecter à un web service hébergé chez Mercator (host = restapi.mercator.eu) sur le port https (TCP 443). La fonctionnalité décrite dans cette page n'est pas disponible si MercatorPenguinServer ne peut communiquer avec ce serveur.

Note concernant le RGPD à ce propos : dans le cadre de cette gestion des licences par appareil mobile, seules ces informations sont transmises :

  • l'identifiant unique de l'appareil, généré aléatoirement : par exemple 3f2504e0-4f89-11d3-9a0c-0305e82c3301
  • le nom du host hébergeant MercatorPenguinServer : par exemple penguin.mercator.eu
  • le nom de la configuration (nom du fichier ini de MercatorPenguinServer).

Aucune donnée personnelle de l'utilisateur, ni aucune donnée contenue dans Mercator ou MercatorPenguin ne sont communiquées.


L'accès à un transfert de dépôts se fait toujours au départ d'un bundle de type "Liste", via un bouton TransferEditButton, dont les propriétés suivantes doivent être spécifiées :

  • TransferId = id du document : ID_DOC de PIEDS_D
  • TransferPiece = le n° du transfert de dépôts
  • TransferType = la valeur de TYPE dans PIEDS_D.

 

<m:TransferEditButton Text="Modifier" Font="Small" 
TransferId="@ID_DOC" TransferPiece="@PIECE" TransferType="@TYPE" />

 

Exemple de bundle liste : Transferts_de_Depots_Std.pngb

Le layout d'une fenêtre de modification dans MercatorPenguin doit être créé en XAML, au départ de la fiche de la séquence correspondante "Outils > Séquences > Mouvements Divers" de Mercator et en utilisant cet élément de ce bouton déroulant :

param_penguin_invent

 

Un écran de transfert de dépôts requiert deux paramétrages XAML :

  1. la saisie proprement dite : les informations du pied et de la ligne en cours d'édition
  2. le format de chaque cellule de la ListView affichant les lignes du document en cours.

Exemple de paramétrage XAML Tab 1

<StackLayout Margin="10, 10, 10, 10">
<m:EditDatePicker Source="date" HorizontalOptions="FillAndExpand" />
<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">
<Label Text="De" FontSize="12" VerticalOptions="Center" WidthRequest="100" />
<m:EditPicker Source="id_depot1" HorizontalOptions="FillAndExpand" />
</StackLayout>
<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">
<Label Text="Vers" FontSize="12" VerticalOptions="Center" WidthRequest="100" />
<m:EditPicker Source="id_depot2" HorizontalOptions="FillAndExpand" />
</StackLayout>
<m:EditEntry Placeholder="Reference" Source="reference" HorizontalOptions="FillAndExpand" />

<BoxView HorizontalOptions="FillAndExpand" HeightRequest="2" Margin="0,25,0,25" Color="%ThemeColor%"/>

<Grid RowSpacing="10" ColumnSpacing="2">
<Grid.ColumnDefinitions>
        <ColumnDefinition Width="120" />
<ColumnDefinition Width="25" />
<ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
    </Grid.RowDefinitions>

<Label Text="Dépôt (de)" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="0" />
<m:EditPicker Source="LINE|ID_DEPOT1" HorizontalOptions="FillAndExpand" Grid.Column="2" Grid.Row="0" />

<m:EditEntry Placeholder="Empl. (de)" Source="LINE|ID_MPLACE1" HorizontalOptions="FillAndExpand" Grid.Column="0" Grid.Row="1" />
<m:EditScanButton TargetSource="LINE|ID_MPLACE1" Grid.Column="1" Grid.Row="1" />
<m:TargetSigLabel Origin="LINE|ID_MPLACE1" Font="Medium" VerticalOptions="Center" HorizontalOptions="FillAndExpand" Margin="10,0,0,0" Grid.Column="2" Grid.Row="1" />

<Label Text="Dépôt (vers)" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="2" />
<m:EditPicker Source="LINE|ID_DEPOT2" HorizontalOptions="FillAndExpand" Grid.Column="2" Grid.Row="2" />

<m:EditEntry Placeholder="Empl. (vers)" Source="LINE|ID_MPLACE2" HorizontalOptions="FillAndExpand" Grid.Column="0" Grid.Row="3" />
<m:EditScanButton TargetSource="LINE|ID_MPLACE2" Grid.Column="1" Grid.Row="3" />
<m:TargetSigLabel Origin="LINE|ID_MPLACE2" Font="Medium" VerticalOptions="Center" HorizontalOptions="FillAndExpand" Margin="10,0,0,0" Grid.Column="2" Grid.Row="3" />

<m:EditEntry Placeholder="Article" Source="LINE|ID_ART" HorizontalOptions="FillAndExpand" Grid.Column="0" Grid.Row="4" />
<m:EditScanButton TargetSource="LINE|ID_ART" Grid.Column="1" Grid.Row="4" />
<m:TargetSigLabel Origin="LINE|ID_ART" Font="Medium" VerticalOptions="Center" HorizontalOptions="FillAndExpand" Margin="10,0,0,0" Grid.Column="2" Grid.Row="4" />

<Label Text="Q" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="5" />
<m:EditEntry Source="LINE|Q" DefaultLineValue="1" WidthRequest="120" Decimals="2" Grid.Column="2" Grid.Row="5" />

<Label Text="PU" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="6" />
<m:EditEntry Source="LINE|PU" WidthRequest="120" Decimals="2" Grid.Column="2" Grid.Row="6" />

  </Grid>

<m:EditAddLineButton Margin="25,25,25,25" HorizontalOptions="FillAndExpand" />

</StackLayout>

Exemple de paramétrage XAML ListViewCell

<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">  
<Label Text="Q=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@Q:### ##0.00" FontSize="12" Margin="0,0,25,0" HorizontalOptions="FillAndExpand" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="@ID_ART" FontSize="12" Margin="0,0,10,0" />
<Label Text="@DESIGNATIO" FontSize="12" />
</StackLayout>
<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">  
<Label Text="PU=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@PU:### ##0.00" FontSize="12" Margin="0,0,25,0" HorizontalOptions="FillAndExpand" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="De" FontSize="12" Margin="0,0,10,0" />
<Label Text="@LIB_DEPOT1" FontSize="12" Margin="0,0,10,0" />
<Label Text="@ID_MPLACE1" FontSize="12" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="Vers" FontSize="12" Margin="0,0,10,0" />
<Label Text="@LIB_DEPOT2" FontSize="12" Margin="0,0,10,0" />
<Label Text="@ID_MPLACE2" FontSize="12" />
</StackLayout>

Ce code XAML produit ces écrans :

penguin_transfers_1     penguin_transfers_lines

penguin_transfers_2     billinglignes4

Principes de paramétrage 

Dans le premier code XAML, il convient d'utiliser des contrôles de type Edit qui permettent la modification des champs du pied (au-dessus de la première ligne orange) ainsi que de la ligne en cours d'édition (en dessous de la ligne orange). Ces champs de ligne ont une source qui est constituée de LINE| suivi du nom de la colonne dans la table LIGNES_D.

La saisie de l'article en ligne se fait toujours dans un EditEntry, dont la source est LINE|ID_ART. Cette source sera reconnue comme étant une liaison vers le signalétique des articles, ce qui rend possible l'affichage de la désignation dans un TargetSigLabel. (Voir la fonction SQL LIBTARGETSIG_STOCK qui est modifiable).

Le code XAML doit contenir un EditAddLineButton qui permet l'ajout de la ligne en cours dans la liste des lignes déjà encodées.

Dans le second code XAML (ListViewCell), les variables à afficher doivent être précédées d'un @ et en majuscules. Il est possible de fixer un masque d'affichage sous la forme @COLONNE:masque. Ce masque fonctionne de façon identique à celui de string.Format() du Framework .net.

En sus des variables de la table LIGNES_D, on peut utiliser LIB_DEPOT1 et LIB_DEPOT2 pour obtenir les noms de dépôts à la ligne.

 

Utilisation

Si le dossier contient la gestion des emplacements, l'utilisateur peut saisir l'emplacement. Dans le cas contraire, les rows 1 et 3 de la grille peuvent être retirées et tous les Grid.Row adaptées en conséquence. Notez que la valeur de l'emplacement saisi n'est jamais réinitialisée, ce qui permet de saisir une seule fois l'emplacement et d'encoder ensuite de multiples articles à transférer entre ces emplacements.

L'utilisateur saisit ensuite un code article. Le cas échéant, MercatorPenguin présente une liste d'articles afin d'en permettre la sélection. Il peut ensuite saisir les autres informations telles que la quantité, le prix, la remise, ...

Enfin, l'utilisateur doit ajouter effectivement la ligne en cours de saisie à la liste du second onglet en utilisant le bouton "Ajouter". Ceci remettra à blanc les données de l'article et le focus dans la zone "Article", afin de permettre la saisie du prochain article.

Les saisies d'articles et d'emplacements peuvent être effectuées via l'EditScanButton afin de scanner un code-barres.

Le second onglet permet de visualiser la liste des lignes encodées. Il permet aussi de supprimer une ligne encodée au préalable :

  • sous iOS : en tirant la ligne vers la gauche et en utilisant ensuite le bouton "Supprimer"
  • sous Android : en maintenant appuyé sur la ligne et en utilisant ensuite le bouton "Supprimer".

Il n'est pas possible de remettre en édition, pour la modifier, une ligne présente dans la liste. Le cas échéant, il convient donc de la supprimer et la recréer.

La finalisation d'un document se fait par ces boutons situés dans le haut de l'écran, qui offrent respectivement ces fonctions :

  • Annuler les modifications en attente et fermer l'écran du transfert de dépôts
  • Enregistrer les modifications en attente et fermer l'écran du transfert de dépôts
  • Enregistrer les modifications en attente tout en maintenant ouvert l'écran du transfert de dépôts en cours.

 

Limitations

Il est nécessaire de bien comprendre que les sauvegardes sont effectuées exclusivement par MercatorPenguinServer et que celui-ci est stateless. Cela veut dire que,type durant toute la durée de vie du transfert de dépôts dans MercatorPenguin, il n'est pas maintenu ouvert par MercatorPenguinServer. Dès lors, il est possible qu'un autre utilisateur modifie en parallèle celui-ci. Cette pratique doit être évitée. Lors de l'enregistrement des modifications, les règles suivantes sont d'application :

  • les lignes supprimées dans MercatorPenguin sont supprimées par MercatorPenguinServer si elles existent encore. Aucun message d'erreur n'est produit dans le cas contraire.
  • les lignes ajoutées dans MercatorPenguin sont toujours ajoutées par MercatorPenguinServer.

 

Circulation des données

Voir cette page.

 

Programmation

Les customizers exploitant les événements du TransferEngine sont bien utilisés par MercatorPenguinServer. Il est possible de savoir si le transfert de dépôts est géré par MercatorPenguin en utilisant cette propriété : MercatorUi.Globals.IsMercatorPenguinServer.

Pour rappel, il est impossible d'exécuter du code sur mesure dans l'appareil mobile. Il n'y a donc pas de customizer qui "tourne" dans l'application MercatorPenguin en tant que tel. Les plateformes Android et iOS ne l'autorisent pas. Dès lors, ce point ne sera jamais modifié.

 

Astuces

Voir comment peaufiner le paramétrage des transferts de dépôts.


Considérations à propos du changement de statut des transferts de dépôts

Il est possible d'effectuer des changements de statut via un bouton de type EditTransformButton. (Voir dans l'exemple "paramétrage XAML Tab 1" ci-dessus). Le code de ce bouton doit être comme celui-ci :

<m:EditTransformButton Margin="25,25,25,25" HorizontalOptions="FillAndExpand" Text="Changer Statut">
<m:EditTransformButton.TargetTransf>
    <x:Array Type="{x:Type x:Int32}">
<x:Int32>1</x:Int32>
<x:Int32>2</x:Int32>
    </x:Array>
</m:EditTransformButton.TargetTransf>
</m:EditTransformButton>

Dans l'array de la propriété TargetTransf, il faut lister les types vers lesquels l'utilisateur pourra transformer son transfert de dépôts. Il n'y a pas de distinction à effectuer entre une augmentation ou une diminution de statut. Cet aspect sera reconnu automatiquement par MercatorPenguinServer. 

Lors d'un clic sur ce bouton, une boîte de dialogue sera présentée à l'utilisateur lui permettant de choisir la séquence de destination.

penguinchangeandroidtransf    penguinchangeiostransf

Le changement de statut sera effectué par MercatorPenguinServer lors de la prochaine sauvegarde. Notez qu'une fois la transformation demandée mais pas encore réalisée (sauvegarde non effectuée), le libellé de ce bouton devient "Annuler changer vers ...". Ceci permet d'annuler la demande de transformation. Les contrôles relatifs à la validité de la transformation demandée sont effectués exclusivement par MercatorPenguinServer, donc au moment de la sauvegarde. De même, tous les customizers liés à cet événement seront exécutés.

Notes :

  • Une fois la transformation demandée, il n'est plus possible de sauvegarder le document sans le fermer. 
  • Dans un transfert standard, ce bouton est toujours désactivé.

Considération à propos des numéros de série

Cette fonctionnalité est compatible avec la gestion des numéros de série. Les contrôles ne sont effectués que pour le niveau 3 (gestion in/out) et uniquement lors de la sauvegarde. A aucun moment, MercatorPenguin ne présente une liste de sélection de numéros de série, l'environnement mobile privilégiant le scan direct d'un numéro de série.

Pour qu'un numéro de série soit éditable, il faut ajouter un EditEntry lié à cette source : LINE|NUM_SERIE.
Pour qu'un numéro de série soit visible dans l'onglet des lignes, il faut ajouter dans le code XAML de la ListViewCell un code semblable à celui-ci :

<StackLayout Orientation="Horizontal">   
<Label Text="N° Série" FontSize="12" Margin="0,0,10,0" />
<Label Text="@NUM_SERIE" FontSize="12" />
</StackLayout>

Lorsqu'un article à numéro de série est scanné et que Mercator sait qu'il attendra un numéro de série pour le type de transfert en cours, l'EditEntry mentionné ci-dessus verra sa couleur de fond modifiée afin d'indiquer que cette zone est obligatoire. De plus, il ne sera pas possible d'ajouter une ligne dans ces conditions avec un numéro de série vide.

Contrairement à l'utilisation de la gestion "in/out" des numéros de série (niveau 3) dans Mercator Desktop, MercatorPenguin n'effectue pas de contrôle quant à l'utilisation simultanée d'un même numéro de série sur deux dispositifs différents, lors de la saisie d'une ligne. Ce contrôle est uniquement effectué lors de la sauvegarde du transfert en cours.

Si la gestion "in/out" des numéros de série est activée (niveau 3), alors MercatorPenguin prend en compte l'option "Encodage / Recherche n° série" (SEARCH_SER). Si cette option est à OUI, MercatorPenguin effectuera aussi une recherche dans les numéros de série disponibles sur base de l'information qui lui est passée et le numéro de série sera automatiquement saisi. Si l'utilisateur emploie exclusivement cette méthode, alors on peut retirer l'EditEntry lié à LINE|NUM_SERIE. Ainsi, on est certain que l'utilisateur ne modifiera pas le numéro de série qu'il vient de scanner.


Considérations relatives à la gestion des lots

MercatorPenguin est compatible avec la gestion des lots avec certaines réserves imposées notamment par l'ergonomie disponible dans un appareil mobile. 

L'affichage des informations de lot dans le second onglet peut se faire via ce type de code XAML de la ListViewCell :

<StackLayout Orientation="Horizontal">   
<Label Text="Lot" FontSize="12" Margin="0,0,10,0" />
<Label Text="@LIB_LOT" FontSize="12" />
</StackLayout>

Par défaut, cet affichage reprend le n° du lot suivi de son libellé, séparé par un double point. Ceci peut être modifié en adaptant le contenu de la fonction scalaire SQL dbo.LIBARTLOT. Elle est installée automatiquement par MercatorPenguinServer mais n'est jamais mise à jour par la suite. En conséquence, il est permis de modifier son code.

La façon la plus ergonomique et directe de mouvementer un lot en sortie est de mettre à OUI l'option "Encodage / Recherche Lots" (SEARCH_LOT). Ainsi, le scan d'un libellé de lot existant permet la saisie automatique, à la fois de l'article et du lot à utiliser.

Il est aussi possible d'ajouter un EditEntry associé à LINE|ID_LOT et d'y saisir l'identifiant d'un lot existant et associé à l'article sélectionné au préalable :

<m:EditEntry Source="LINE|ID_LOT" Placeholder="Lot" />

Si on veut généraliser l'usage des lots, il faut utiliser les capacités de Mercator en ce qui concerne la gestion implicite des lots, ainsi que la capacité qu'à MercatorPenguin d'échanger avec Mercator n'importe quelle colonne de la table des lignes. L'exemple décrit pour les achats (voir le bas de cette page : MercatorPenguin en écriture : documents de la gestion commerciale avec lignes) pourra être facilement converti pour les transferts de dépôts.