Table des matières
Les options d’extensibilité dont nous avons parlées jusqu’à présent concernent uniquement les contrôles intérieurs de POS. En cas de nécessité d’ajouter un nouveau contrôle gérable, nous pouvons utiliser le mécanisme d’extensibilité de la gestion d’interface. Ce mécanisme permet d’enregistrer de nouveaux types de contrôles et de définir lesquelles de propriétés seront gérables. À part de cela, il est également possible de rendre gérables les propriétés des contrôles existants et de masquer la gestion des propriétés sélectionnées.
Masquer les propriétés pour édition
Si une propriété est masquée, elle est supprimée de la gestion d’interface. L’utilisateur ayant accès à la gestion d’interface ne pourra pas modifier sa valeur. La valeur du contrôle dont la propriété sera masquée sera définie par défaut pour la valeur définie dans les styles. Pourtant, si la valeur par défaut a été définie dans le fichier ModernUI.xaml, elle sera ignorée (les différences dans la définition des valeurs par défaut ont été décrites dans le chapitre Définir les valeurs par défaut des propriétés gérables dans l’article Gestion de vues et de ses éléments).
Nous pouvons masquer des propriétés spécifiques sur un contrôle spécifique identifié de manière unique par son Layout Id. La méthode à masquer les propriétés est la méthode DisablePropertiesForLayoutElement dans la classe PropertiesManager. Paramètres de cette méthode :
- layoutId (string) – paramètre qui est l’identifiant du contrôle dont la propriété on veut masquer.
- properties (params DependencyProperty[]) – une ou plusieurs propriétés qui seront masquées pour un contrôle donné.
Exemple du masquage de la propriété Icône (ImageKey) de la mosaïque Nouvelle vente (layout id NewSalesDocument) :
PropertiesManager.Instance.DisablePropertiesForLayoutElement("NewSalesDocument", TileButton.ImageKeyProperty);
Exemple du masquage de la propriété Hauteur (Height) du bouton Valider (AcceptButton) de la configuration globale :
PropertiesManager.Instance.DisablePropertiesForLayoutElement("AcceptButton", FrameworkElement.HeightProperty);
Ajouter des nouvelles propriétés à modifier
Dans le cas où un contrôle existant ou un tout neuf contrôle a des propriétés personnalisées définies et nous voulons qu’elles soient gérables dans la gestion d’interface, il faut les enregistrer. Cela peut se faire de deux manières, selon que la propriété doit être visible uniquement pour un contrôle à un endroit spécifique ou globalement pour toutes les occurrences de ce contrôle.
Dans le premier cas (enregistrement visible uniquement pour un contrôle à un endroit spécifique), il faut utiliser la méthode AddPropertiesForLayoutElement de la classe PropertiesManager. Paramètres de la méthode :
- layoutId (string) – identifiant unique de contrôle (Layout Id),
- properties (params DependencyProperty[]) – propriétés de contrôle qui seront gérables
Dans le second cas (enregistrement visible globalement pour toutes les occurrences de contrôle), il faut utiliser la méthode RegisterControlProperties de la classe PropertiesManager. Paramètres de la méthode :
- controlType (Type) – type de contrôle,
- properties (params DependencyProperty[]) – propriétés qui seront visible pour le contrôle du type indiqué
- baseTypeProperties (Type) – type de contrôle de base à partir de laquelle seront téléchargées les propriétés enregistrées auparavant et utilisées à enregistrer les propriétés de ce contrôle
Gestion des attributs
L’application POS prend en charge les attributs à valeur unique synchronisés à partir du système ERP. Types d’attributs pris en charge : texte, nombre, répertoire, valeur logique, liste, date. Pour que la classe d’attribut donnée soit synchronisée vers un point de vente POS, elle doit être marquée dans le système ERP (Standard) à afficher et/ou à modifier dans la section Retail POS. Les attributs peuvent être affichés sous forme des colonnes dans la liste (contrôle datagrid) ou sous forme des contrôles (générés en fonction du type de classe d’attribut, par exemple pour la classe du type texte ça sera le TextBox, alors que pour le type répertoire ça sera le ComboBox).
Ajouter une nouvelle classe d’attribut à une vue existante dans POS
Dans l’application POS, chaque vue qui prend en charge les attributs est directement associé à un objet du système ERP. Par exemple, la vue Liste des clients affiche les attributs dans la liste sous forme des colonnes. Il est possible d’afficher les attributs avec leurs valeurs attribuées uniquement à l’objet Client dans le système ERP. Dans le cas de la vue du reçu, la liste (datagrid) affiche les classes d’attributs associées uniquement à l’objet Élément de reçu (REC), alors que les attributs affichés dans le coin inférieur droit sous forme des contrôles sont associés à l’objet Reçu (REC).
Liste des vues prenant en charge l’attribut avec les objets du système ERP associés
Vue POS | Élément de vue | Entité métier dans le système ERP |
Nouvelle vente
(DocumentView) |
Liste des positions | Élément du reçu (REC) |
Document | Reçu (REC) | |
Aperçu du reçu
(DocumentPreviewView) |
Liste des positions | Élément du reçu (REC) |
Document | Reçu (REC) | |
Attributs du reçu (vente rapide)
(DocumentAttributesView) |
Document | Reçu (REC) |
Détails de position dans le reçu (vente rapide)
(DocumentItemPropertiesView) |
Document | Élément du reçu (REC) |
Facture
(DocumentView) |
Liste des positions | Élément de la facture client (FC) |
Document | Facture client (FC) | |
Aperçu de la facture
(DocumentPreviewView) |
Liste des positions | Élément de la facture client (FC) |
Document | Facture client (FC) | |
Attributs de la facture (vente rapide)
(DocumentAttributesView) |
Document | Facture client (FC) |
Détails de position dans la facture (vente rapide)
(DocumentItemPropertiesView) |
Document | Élément de la facture client (FC) |
Correctif manuel du reçu
Correctif manuel de la quantité du reçu – échange (ManualExchangeView) |
Liste des positions | Élément du correctif manuel de la quantité du reçu (CQR) |
Document | Correctif manuel de la quantité du reçu (CQR) | |
Aperçu du correctif manuel de la quantité du reçu
(ManualCorrectionPreviewView) |
Liste des positions | Élément du correctif manuel de la quantité du reçu (CQR) |
Document | Correctif manuel de la quantité du reçu (CQR) | |
Correctif manuel de la quantité de la facture
Correctif manuel de la quantité de la facture – échange (ManualExchangeView) |
Liste des positions | Élément du correctif manuel de la quantité de la facture (CQFC) |
Document | Correctif manuel de la quantité de la facture (CQFC) | |
Aperçu du correctif manuel de la quantité de la facture
(ManualCorrectionPreviewView) |
Liste des positions | Élément du correctif manuel de la quantité de la facture (CQFC) |
Document | Correctif manuel de la quantité de la facture (CQFC) | |
Correctif du reçu
(ExchangeView) |
Liste des positions | Élément du correctif de la quantité du reçu |
Document | Correctif de la quantité du reçu | |
Aperçu du correctif du reçu
(CorrectionPreviewView) |
Liste des positions | Élément du correctif de la quantité du reçu |
Document | Correctif de la quantité du reçu | |
Correctif de la facture
(ExchangeView) |
Liste des positions | Élément du correctif de la quantité de la facture |
Document | Correctif de la quantité de la facture | |
Aperçu du correctif de la facture
(CorrectionPreviewView) |
Liste des positions | Élément du correctif de la quantité de la facture (CQFC) |
Document | Correctif de la quantité de la facture (CQFC) | |
Facture d’acompte
(AdvanceInvoiceView) |
Document | Facture d’acompte |
Aperçu de la facture d’acompte
(AdvanceInvoicePreviewView) |
Document | Facture d’acompte |
Correctif de la facture d’acompte
(AdvanceInvoiceCorrectionView) |
Document | Correctif de la facture d’acompte |
Aperçu du correctif de la facture d’acompte
(AdvanceInvoiceCorrectionPreviewView) |
Document | Correctif de la facture d’acompte |
Bordereau de détaxe
(TaxFreeView) |
Liste des positions | Élément du bordereau de détaxe (BD) |
Document | Bordereau de détaxe (BD) | |
Aperçu du bordereau de détaxe
(TaxFreePreviewView) |
Liste des positions | Élément du bordereau de détaxe (BD) |
Document | Bordereau de détaxe (BD) | |
Liste des ventes
(DocumentsListView) |
Liste des positions | Reçu (REC), Facture client (FC), Facture d’acompte, Correctif de la quantité du reçu (CQR), Correctif de la quantité de la facture (CQFC), Correctif manuel de la quantité du reçu (CQR), Correctif manuel de la quantité de la facture (CQFC), Correctif de la facture d’acompte, Bordereau de détaxe (BD) |
Clients
(CustomesListView) |
Liste des positions | Client |
Ajouter/Modifier le particulier
(CustomerView) |
Document | Client |
Ajouter/Modifier le professionnel
(BusinessCustomerView) |
Document | Client |
Détails du client
(CustomerDetailsView) |
Document | Client |
Détails du professionnel
(BusinessCustomerDetailsView) |
Document | Client |
Nouvelle commande
(SalesOrderView) |
Liste des positions | Élément de la commande client (COMC) |
Document | Commande client (COMC) | |
Aperçu de la commande client
(SalesOrderPreviewView) |
Liste des positions | Élément de la commande client (COMC) |
Document | Commande client (COMC) | |
Préparation de la commande
(SalesOrderPreparationView) |
Liste des positions | Élément de la commande client (COMC) |
Nouveau devis
(SalesQuoteView) |
Liste des positions | Élément de la commande client (DC) |
Document | Commande client (DC) | |
Aperçu du devis client
(SalesQuotePreviewView) |
Liste des positions | Élément de la commande client (DC) |
Document | Commande client (DC) | |
Commandes et devis client
(SalesOrdersListView) |
Liste des positions | Commande client (COMC), Devis client (DC) |
Réclamation
(ComplaintView) |
Liste des positions | Élément de la réclamation de vente (REVC) |
Document | Réclamation de vente (REVC) | |
Réclamations
(ComplaintsListView) |
Liste des positions | Réclamation de vente (REVC) |
Document de caisse (DC/RC)
(CashDocumentView) |
Document | Transaction caisse/banque |
Dépôt/Retrait Coffre-fort
(VaultInflowOutflowView) |
Document | Transaction caisse/banque |
Documents de caisse
(CashDocumentsListView) |
Liste des positions | Transaction caisse/banque |
Aperçu du document de sortie de stock ME-
(WarehouseDocumentPreviewView) |
Liste des positions | Élément du mouvement d’entrepôt (ME-) |
Document | Mouvement d’entrepôt (ME-) | |
Nouveau document de sortie du stock
(NewWarehouseDocumentView) |
Liste des positions | Élément du mouvement d’entrepôt (ME-) |
Document | Mouvement d’entrepôt (ME-) | |
Document de sortie du stock
(WarehouseDocumentView) |
Liste des positions | Élément du mouvement d’entrepôt (ME-) |
Document | Mouvement d’entrepôt (ME-) | |
Document de réception PRR
(ReceivingAndDeliveryReportView) |
Document | Protocole de réception (PRR) |
Documents d’entrepôt
(WarehouseDocumentsListView) |
Liste des positions | Mouvement d’entrepôt (ME-), Protocole de réception (PRR), Commande fournisseur (COMF), Bon de réception (REC) |
Réception d’un bordereau d’expédition
(DeliveryNoteView) |
Document | Réception d’un bordereau d’expédition |
Aperçu du bordereau d’expédition
(DeliveryNotePreviewView) |
Document | Réception d’un bordereau d’expédition |
Réception de la livraison ME-
(WarehouseDocumentsToReceiptListView) |
Liste des positions | Mouvement d’entrepôt (ME-), Protocole de réception (PRR), Commande fournisseur (COMF), Bon de réception (REC) |
Bon de réception
(PurchaseOrderReceptionView) |
Liste des positions | Élément du bon de réception (REC) |
Document | Bon de réception (REC) | |
Commande fournisseur
(PurchaseOrderView) |
Liste des positions | Élément de la commande fournisseur (COMF) |
Document | Commande fournisseur (COMF) | |
Correctifs des ressources
(StockCorrectionsListView) |
Liste des positions | Profit (PROF), Perte (PERT) |
Profit/Perte
(NewInternalReceiptOrReleaseView) |
Liste des positions | Elément du profit (PROF), élément de la perte (PERT) |
Document | Profit (PROF), Perte (PERT) | |
Aperçu du Profit/ de la Perte
(InternalReceiptOrReleasePreviewView) |
Liste des positions | Elément du profit (PROF), élément de la perte (PERT) |
Document | Profit (PROF), Perte (PERT) | |
Commande interne
(InternalOrdersListView) |
Liste des positions | Commande interne (COMI) |
Nouveau colis
(GeneratedWarehouseDocumentView) |
Liste des positions | Elément du mouvement d’entrepôt (ME-) |
Document | Mouvement d’entrepôt (ME-) | |
Transferts manuels
(ManualMovementsListView) |
Liste des positions | Elément du mouvement d’entrepôt (ME-) |
Transfert manuel
(NewManualMovementWarehouseDocumentView) |
Liste des positions | Elément du mouvement d’entrepôt (ME-) |
Document | Mouvement d’entrepôt (ME-) | |
Mouvements internes
(InternalMovementsListView) |
Liste des positions | Elément du mouvement d’entrepôt (ME-) |
Mouvement interne
(NewInternalWarehouseDocumentView) |
Liste des positions | Mouvement d’entrepôt (ME-) |
Inventaire
(InventoryCountView) |
Document | Inventaire |
Liste de comptage
(InventoryCountListView) |
Document | Liste de comptage |
Commande interne créée
(CreatedInternalOrdersListView) |
Liste des positions | Commande interne (COMI) |
Nouvelle commande interne
(NewInternalOrderView) |
Document | Commande interne (COMI) |
Aperçu de la commande interne
(CreatedInternalOrderPreviewView) |
Document | Commande interne (COMI) |
Liste des articles | Liste des positions | Article |
Pour ajouter à POS la classe d’attribut sélectionnée, il faut la marquer comme Retail POS (aperçu et/ou modification). L’option d’aperçu permettra à l’attribut de fonctionner en mode lecture seule dans l’application POS. En revanche, si l’option modification est sélectionnée, la valeur de l’attribut pourra être modifiée et après l’enregistrement cette information sera transférée au système ERP. Ensuite, il faut lier la classe d’attribut avec le type d’objet approprié qui est pris en charge par POS (voir le tableau ci-dessus). Après avoir ajouté et synchronisé les réglages, les nouveaux attributs apparaîtront dans l’application POS sur la vue appropriée et l’utilisateur POS pourra les gérer à partir du niveau de la configuration d’interface.
Par exemple, nous ajoutons une nouvelle classe d’attribut X qui est du type texte et nous la marquons comme modifiable dans la rubrique Retail POS. Ensuite, nous la lions avec l’objet Client dans le système ERP. Après la synchronisation des données, nous démarrons l’application POS et nous ouvrons la configuration de la vue Ajouter un client. Dans la configuration, nous cochons le conteneur approprié (CustomerItemsContainer) qui permet l’affichage des attributs. Ensuite, il faut sélectionner dans la liste disponible à droite le nouvel attribut X et le faire glisser dans l’endroit souhaité sur la vue.
Ajouter une nouvelle classe d’attribut à la nouvelle vue qui ne la prend pas en charge
La prise en charge des attributs peut être également ajoutée aux vues personnalisées créées dans le cadre de l’extension. Les attributs peuvent être affichés sous forme des colonnes générées dynamiquement dans la liste (contrôle DataGrid) ou sous forme des contrôles indépendants (le type de contrôle sera différent en fonction du type de classe d’attribut).
Attributs sous forme des colonnes dans la liste DataGrid
Afin d’implémenter dans les listes les attributs sous forme des colonnes générées dynamiquement, il faut dans un premier temps implémenter l’interface IAttributable pour l’entité de données. Cette interface fournit trois propriétés indispensables à la prise en charge correcte des attributs dans les listes. Les deux premières propriétés : Id et ObjectType doit être définies conformément à l’entité. L’Id est l’identifiant de l’entité et ObjectType est le type d’entité. La troisième propriété Attributes est un répertoire qui doit être rempli lors du téléchargement asynchrone des données pour la liste. Pour remplir ce répertoire, il faut utiliser la méthode FillAttributesForList qui est dans le service IAttributesService. Avant de pouvoir afficher les données du répertoire, la liste doit d’abord générer des colonnes supplémentaires. Pour que cela soit possible, lors du premier téléchargement des données (IsInitialization=true) il faut définir la propriété AttributeClasses dans la classe AsyncDataGridCollection. Pour définir cette propriété il faut utiliser la méthode GetAttributesClasses du service IAttributesService. Cette méthode adopte deux paramètres : le premier permet de définir quelles classes d’attributs doivent être affichées sur une liste donnée et le second filtre quelles classes seront visibles pour des groupes donnés. Dans le cas où le second paramètre est null, toutes les classes des groupes sélectionnés dans le premier paramètre sont téléchargées. L’implémentation doit être réalisée d’une façon qui permet la gestion du filtrage des classes d’attributs en mode design de vue. De ce fait, cette méthode doit être appelée dans le DesignViewModel d’une vue donnée avec le second paramètre définit sur null. Ceci permet de télécharger toutes les classes et de générer toutes les colonnes possibles (cachées par défaut). En revanche, dans le ViewModel de la vue, il faut transmettre au second paramètre la propriété VisibileAttributesClassesList qui contiendra une liste des classes d’attributs définie en mode design par l’utilisateur. Dans le cas de la méthode FillAttributesForList qui remplit le répertoire Attributes, il faut transmettre deux paramètres. Le premier c’est une liste des entités (une entité doit implémenter IAttribuable) et le second c’est une liste des identifiants des classes d’attributs dans laquelle il faut compléter chaque entité avec les valeurs de ces classes d’attributs. Aux fins d’optimisation et pour ne pas télécharger trop d’informations, le second paramètre est défini en transmettant la propriété VisibleAttributesClassesList.
Le tri des colonnes qui ont été générées pour les attributs n’est pas activé.
Les colonnes générées pour les attributs sont par défaut cachées. Afin de les afficher, il faut implémenter en mode design le téléchargement de tous les attributs possibles pour une liste donnée, pour que l’utilisateur puisse sélectionner cette colonne et définir sa visibilité, ainsi que ses autres propriétés.
Dans le cas où la liste est en mode lecture seule, les attributs sont affichés sous forme de texte. En revanche, en mode d’édition les attributs sont générés sous forme des contrôles appropriés, en fonction du type de données. Pour un type logique ça sera le CheckBox, pour une liste et pour un répertoire le ComboBox et pour les autres types le TextBox.
Un exemple complet d’implémentation peut être consulté dans le chapitre Vue d’un document commercial avec la gestion des attributs dans l’article Exemples.
Attributs comme contrôles indépendants
Une façon alternative d’affichage des attributs dans les vues créées est de les implémenter sous forme des contrôles dynamiquement générés qui dépend du type de classe d’attribut. Ces contrôles permettent également de modifier les valeurs des attributs. Leur implémentation est composée de trois étapes. La première étape consiste à télécharger les attributs et les afficher sous forme de contrôles visibles dans le conteneur défini. La seconde à implémenter la validation des valeurs dans les attributs. La troisième étape c’est l’enregistrement des modifications apportées aux valeurs des attributs. Un exemple complet d’implémentation peut être consulté dans le chapitre Vue d’un document commercial avec la gestion des attributs dans l’article Exemples.