Générer des codes QR et les imprimer sur les reçus pour l’Arabie Saoudite
Note
La fonctionnalité décrite dans cet article est destinée à prendre en charge les exigences de la phase 1 de l’implémentation de la facturation électronique au Royaume d’Arabie saoudite. Pour plus d’informations sur les fonctionnalités destinées à prendre en charge les exigences de la phase 2 de l’implémentation de la facturation électronique dans le Royaume d’Arabie saoudite, voir Générer et soumettre des factures électroniques simplifiées pour l’Arabie saoudite.
Cet article fournit un aperçu de la fonctionnalité d’impression de codes QR disponible pour l’Arabie saoudite en Microsoft Dynamics 365 Commerce.
Dans un magasin lié à une entité juridique dont l’adresse principale est en Arabie saoudite, les utilisateurs peuvent imprimer un code QR sur le ticket de caisse d’une transaction de vente au comptant sans livraison ou de commande client. Le code QR contient les informations suivantes :
Ordre | Champ | Source de données |
---|---|---|
1 | Nom de la société | Nom de l’entité juridique |
2 | Numéro d’identification intracommunautaire de l’entreprise | Le numéro d’identification fiscale de l’entité juridique |
3 | Date et heure de la transaction | La date et l’heure de la transaction du magasin de vente au détail |
4 | Montant total de la réception (taxe sur la valeur ajoutée [TVA]) | Montant total de la transaction du magasin de vente au détail |
5 | Montant total de la TVA incluse dans le reçu | Le montant total des taxes de la transaction du magasin de vente au détail |
Note
Lorsque des transactions de commande client sont créées, le montant total de la réception est calculé en additionnant les montants totaux de toutes les lignes de transaction qui utilisent le mode de livraison à emporter.
Le code QR est généré en appliquant la transformation base64 aux informations de transaction encodées au format TLV (Tag-Length-Value). La Zakat, l’Autorité fiscale et douanière (ZATCA) fournit des outils qui peuvent être utilisés pour valider le code QR. Pour plus d’informations sur les exigences de facturation électronique et les capacités de validation du code QR, voir le portail de facturation électronique de ZATCA.
Configurer des codes QR
Pour générer des codes QR et les imprimer sur les reçus pour l’Arabie saoudite, vous devez effectuer les tâches suivantes.
- Configurez les champs personnalisés afin qu’ils puissent être utilisés dans les formats de ticket de caisse pour les tickets de caisse vente.
- Configurer les formats de ticket de caisse.
- Spécifier des dimensions de code QR dans les paramètres Commerce
- Activez les extensions Commerce Runtime (CRT).
Configurez des champs personnalisés afin qu’ils puissent être utilisés dans les formats de ticket de caisse des tickets de caisse
Vous pouvez configurer la langue, le texte et les champs personnalisés utilisés dans les formats de ticket de caisse pointer de vente (PDV). Dans la page Texte en langue étrangère, ajoutez les enregistrements suivants pour les étiquettes des champs personnalisés des mises en page de ticket de caisse. Notez que les valeurs ID langue, ID texte et Texte qui sont affichées dans la table sont uniquement des exemples. Vous pouvez les modifier pour répondre à vos besoins. Toutefois, les valeurs ID texte que vous utilisez doivent être uniques, elles doivent être égales ou supérieures à 900001.
ID langue | ID texte | Texte |
---|---|---|
fr-FR | 900001 | Code QR (SA) |
Note
La société par défaut de l’utilisateur qui crée le paramétrage de ticket de caisse doit être la même entité juridique que celle dans laquelle le paramétrage du texte en langue étrangère est créé. Sinon, les mêmes textes en langue étrangère doivent être créés dans la société par défaut et l’entité juridique de l’utilisateur du magasin pour lequel le paramétrage est créé.
Dans la page Champs personnalisés, ajoutez les enregistrements suivants pour les champs personnalisés des mises en page de ticket de caisse. Notez que les valeurs ID texte de la légende doivent correspondre aux valeurs ID texte que vous avez spécifiées dans la page Texte en langue étrangère.
Name | Type | ID texte de la légende |
---|---|---|
INVOICEQRCODE_SA | Récépissé | 900001 |
Configurer les formats de tickets de caisse
Pour chaque format de ticket de caisse nécessaire, modifiez la valeur du champ Comportement d’impression sur Toujours imprimer.
Dans le concepteur de formats de ticket de caisse, ajoutez le champ personnalisé suivant à la section Pied de page du ticket de caisse. Notez que les noms de champs correspondent aux textes en langue étrangère que vous avez définis dans la section précédente.
- Code QR (SA) – Ce champ imprime le code QR sur le reçu.
Pour plus d’informations sur l’utilisation des formats de tickets de caisse, voir Configurer et concevoir les formats de tickets de caisse.
Spécifier des dimensions de code QR dans les paramètres Commerce
Dans l’onglet Paramètres de configuration de la page Paramètres Commerce, ajoutez les paramètres de configuration suivants :
- QrCodeWidth - La largeur de l’image du code QR, en pixels. Spécifiez une valeur appropriée pour le paramètre.
- QrCodeHeight - La hauteur de l’image du code QR, en pixels. Spécifiez une valeur appropriée pour le paramètre.
Note
Il est obligatoire de spécifier les valeurs de ces paramètres de configuration pour imprimer les codes QR dans les reçus. La prise en charge des valeurs par défaut des paramètres peut être ajoutée dans les futures mises à jour.
Activer les extensions CRT
Avertissement
Cette fonctionnalité de localisation ne peut pas être utilisée avec le nouveau modèle de packaging et d’extension indépendant et le kit de développement logiciel (SDK) Commerce. Vous devez utiliser la version précédente du Kit de développement logiciel (SDK) Retail sur une machine virtuelle de développeur (VM) dans Microsoft Dynamics Lifecycle Services (LCS). Pour plus d’informations sur les fonctionnalités de localisation pour l’Arabie saoudite disponibles dans le SDK Commerce, consultez Générer et soumettre des factures électroniques simplifiées pour l’Arabie saoudite
Environnement de développement
Suivez ces étapes pour configurer un environnement de développement afin de pouvoir tester et étendre la fonctionnalité de localisation.
Recherchez le fichier de configuration de l’extension pour CRT :
- Retail Server : ce fichier s’appelle commerceruntime.ext.config et se trouve dans le dossier bin\ext sous l’emplacement du site Retail Server Internet Information Services (IIS).
- Local CRT sur Modern POS : le fichier s’appelle CommerceRuntime.MPOSOffline.Ext.config et se trouve sous l’emplacement du courtier client local CRT .
Enregistrez la modification CRT dans le fichier de configuration de l’extension, comme illustré dans l’exemple suivant.
<add source="assembly" value="Microsoft.Dynamics.Commerce.Runtime.ReceiptsSaudiArabia" /> <add source="assembly" value="Microsoft.Dynamics.Commerce.Runtime.ElectronicReporting" />
Environnement de production
Suivez ces étapes pour créer des packages déployables qui contiennent des composants Commerce et pour appliquer ces packages dans un environnement de production.
Dans les fichiers de configuration de package commerceruntime.ext.config et CommerceRuntime.MPOSOffline.Ext.config, sous le dossier RetailSdk\Assets, ajoutez les lignes suivantes à la section composition.
<add source="assembly" value="Microsoft.Dynamics.Commerce.Runtime.ReceiptsSaudiArabia" /> <add source="assembly" value="Microsoft.Dynamics.Commerce.Runtime.ElectronicReporting" />
Ouvrez l’invite de commande MSBuild pour Visual Studio l’utilitaire et exécutez msbuild sous le dossier du kit de développement logiciel (SDK) Retail pour créer des packages déployables.
Appliquer les packages via Lifecycle Services (LCS) ou manuellement. Pour plus d’informations, voir Créer des packages déployables.
Imprimer des images de code QR sur des imprimantes OPOS
Lorsque vous utilisez une imprimante OPOS (Object Linking and Embedding for Retail POS), vous devrez peut-être implémenter des personnalisations supplémentaires pour prendre en charge les exigences spécifiques à l’imprimante pour l’image de code QR. Par exemple, vous devrez peut-être convertir l’image du code QR du format PNG au format BMP ;. Cette section présente un exemple de ce type de personnalisation.
Note
Cet exemple de personnalisation a été testé à l’aide de l’imprimante OPOS EPSON TM-T88V. Il peut être nécessaire de le modifier pour prendre en charge différents modèles ou marques d’imprimantes.
Suivez ces étapes pour créer une extension et l’ajouter à votre environnement.
Installez le kit de développement logiciel (SDK) Retail. Pour en savoir plus, consultez Kit de développement logiciel (SDK) Retail.
Dans le kit de développement logiciel (SDK) Retail, utilisez le code suivant, basé sur votre version de Commerce, pour créer un projet C# sous la solution CommerceRuntimeSamples.sln dans RetailSdk\SampleExtensions\CommerceRuntime.
- Commerce 10.0.25 et versions antérieures
- Commerce 10.0.26 et versions ultérieures
- Commerce 10.0.38 et versions ultérieures
<Project Sdk="Microsoft.NET.Sdk"> <Import Project="..\..\..\BuildTools\Microsoft.Dynamics.RetailSdk.Build.props" /> <Import Project="..\..\..\BuildTools\Common.props" /> <Import Project="..\..\..\BuildTools\Microsoft.Dynamics.RetailSdk.Build.settings" /> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <AssemblyName>$(AssemblyNamePrefix).Commerce.Runtime.QrCodeExtension</AssemblyName> <RootNamespace>Contoso.Commerce.Runtime.QrCodeExtension</RootNamespace> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> </PropertyGroup> <Import Project="..\..\..\BuildTools\Microsoft.Dynamics.RetailSdk.Build.targets" /> <ItemGroup> <PackageReference Include="Microsoft.Dynamics.Commerce.Runtime.Framework" Version="$(FrameworkRepoPackagesVersion)" /> <PackageReference Include="Microsoft.Dynamics.Commerce.Runtime.Services.Messages" Version="$(ChannelRepoPackagesVersion)" /> <PackageReference Include="System.Drawing.Common" Version="4.7.0" /> </ItemGroup> <ItemGroup> <Reference Include="Microsoft.Dynamics.Commerce.Runtime.ElectronicReporting"> <HintPath>..\..\..\..\..\nuget packages\microsoft.dynamics.commerce.runtime.electronicreporting.9.35.21321.4\lib\netstandard2.0\Microsoft.Dynamics.Commerce.Runtime.ElectronicReporting.dll</HintPath> </Reference> </ItemGroup> <ItemGroup> <Folder Include="Properties\" /> </ItemGroup> </Project>
Vous devez également modifier la valeur de l’élément HintPath pour référencer Microsoft.Dynamics.Commerce.Runtime.ElectronicReporting.DLL sous l’emplacement du site IIS Retail Server.
Utilisez le code suivant, basé sur votre version de Commerce, pour créer une classe d’extension.
- Commerce 10.0.25 et versions antérieures
- Commerce 10.0.26 et versions ultérieures
- Commerce 10.0.38 et versions ultérieures
/** * SAMPLE CODE NOTICE * * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. */ using System.Drawing; using System.Drawing.Imaging; using System.IO; namespace Contoso { namespace Commerce.Runtime.QrCodeExtension { using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Dynamics.Commerce.Runtime; using Microsoft.Dynamics.Commerce.Runtime.Messages; using Microsoft.Dynamics.Commerce.Runtime.Services.Messages; /// <summary> /// The extension for QR code printing. /// </summary> internal class QrCodeServiceExtension : IRequestHandlerAsync { /// <summary> /// Printer horizontal resolution for image. /// </summary> private const float PrinterXDpi = 60f; /// <summary> /// Printer vertical resolution for image. /// </summary> private const float PrinterYDpi = 90f; /// <summary> /// Printer pixel format for image. /// </summary> private const PixelFormat PrinterPixelFormat = PixelFormat.Format8bppIndexed; /// <summary> /// Gets the collection of supported request types by this service. /// </summary> public IEnumerable<Type> SupportedRequestTypes { get => new[] {typeof(EncodeQrCodeServiceRequest)}; } /// <summary> /// Processes the request. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> public async Task<Response> Execute(Request request) { ThrowIf.Null(request, nameof(request)); switch (request) { case EncodeQrCodeServiceRequest encodeQrCodeServiceRequest: { EncodeQrCodeServiceResponse nextResponse = await this.ExecuteNextAsync<EncodeQrCodeServiceResponse>(encodeQrCodeServiceRequest).ConfigureAwait(false); if (nextResponse != null) { var qrCodeBmp = string.IsNullOrWhiteSpace(nextResponse.QRcode) ? nextResponse.QRcode : ConvertToGenericCompatibilityImage(nextResponse.QRcode); return new EncodeQrCodeServiceResponse(qrCodeBmp); } return nextResponse; } } return new NotHandledResponse(); } /// <summary> /// Converts QR code image from any format to compatible with printer. /// </summary> /// <param name="base64data">Base64 image.</param> /// <returns>Image that Compatible with printer.</returns> private static string ConvertToGenericCompatibilityImage(string base64data) { string convertedQrCode = base64data; byte[] imageBytes = Convert.FromBase64String(convertedQrCode); using (MemoryStream msOriginal = new MemoryStream(imageBytes)) using (MemoryStream msConverted = new MemoryStream()) { var bitmapOriginal = new Bitmap(msOriginal); if (!IsFormatCompatible(bitmapOriginal) || !AreResolutionAndPixelFormatCompatible(bitmapOriginal)) { var bitmapConverted = bitmapOriginal; if (!AreResolutionAndPixelFormatCompatible(bitmapOriginal)) { var rectangle = new Rectangle(0, 0, bitmapOriginal.Width, bitmapOriginal.Height); bitmapConverted = bitmapOriginal.Clone(rectangle, PrinterPixelFormat); bitmapConverted.SetResolution(PrinterXDpi, PrinterYDpi); } bitmapConverted.Save(msConverted, ImageFormat.Bmp); } convertedQrCode = Convert.ToBase64String(msConverted.ToArray()); } return convertedQrCode; } /// <summary> /// Verifies if the resolution and pixel format of bitmap are compatible with printer requirements. /// </summary> /// <param name="source">Bitmap.</param> /// <returns>True if compatible; otherwise false.</returns> private static bool AreResolutionAndPixelFormatCompatible(Bitmap source) { return source.VerticalResolution == PrinterYDpi && source.HorizontalResolution == PrinterXDpi && source.PixelFormat == PrinterPixelFormat; } /// <summary> /// Verifies if the format of bitmap is compatible with printer requirements. /// </summary> /// <param name="source">Bitmap.</param> /// <returns>True if compatible; otherwise false.</returns> private static bool IsFormatCompatible(Bitmap source) { return source.RawFormat.Equals(ImageFormat.Bmp); } } } }
Dans les fichiers de configuration commerceruntime.ext.config et CommerceRuntime.MPOSOffline.Ext.config sous le dossier RetailSdk\Assets , ajoutez les lignes suivantes à la section de composition .
<add source="assembly" value="Contoso.Commerce.Runtime.QrCodeExtension" /> <add source="assembly" value="Microsoft.Dynamics.Commerce.Runtime.ReceiptsSaudiArabia" /> <add source="assembly" value="Microsoft.Dynamics.Commerce.Runtime.ElectronicReporting" />
Dans le fichier de configuration de personnalisation du package Customization.settings sous le dossier BuildTools , ajoutez les lignes suivantes pour inclure les CRT extensions dans les packages déployables.
<ISV_CommerceRuntime_CustomizableFile Include="$(SdkReferencesPath)\Contoso.Commerce.Runtime.QrCodeExtension.dll" />
Démarrez l’invite de commande MSBuild pour l’utilitaire Visual Studio et exécutez msbuild sous le dossier Kit de développement logiciel (SDK) Retail pour créer des packages déployables.
Appliquer les packages via Lifecycle Services (LCS) ou manuellement. Pour plus d’informations, voir Créer des packages déployables.