<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://extranet.vega-info.fr/doc-polaris/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Julienv</id>
	<title>Documentation Polaris - Contributions de l’utilisateur [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://extranet.vega-info.fr/doc-polaris/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Julienv"/>
	<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/Sp%C3%A9cial:Contributions/Julienv"/>
	<updated>2026-05-21T12:28:31Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF9246_%E2%80%94_Publipostage/Mailing_et_Gestion_des_SMS&amp;diff=29973</id>
		<title>NF9246 — Publipostage/Mailing et Gestion des SMS</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF9246_%E2%80%94_Publipostage/Mailing_et_Gestion_des_SMS&amp;diff=29973"/>
		<updated>2024-07-18T14:54:58Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]&lt;br /&gt;
{{DebutInfoCartographe}}{{#cartographie:9246}}{{Depuis|4.14.1.26350}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF9246|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&lt;br /&gt;
&lt;br /&gt;
{{FinChapeau}}&lt;br /&gt;
Le nouveau module de 'Publipostage / Mailing' permet d'envoyer des SMS et d'exporter des clients au format CSV comme dans l'ancien 'Mailing'.&lt;br /&gt;
==Listes de diffusion client==&lt;br /&gt;
{{depuis|8.04}}&lt;br /&gt;
Le '''RGPD''' nous oblige à créer des listes de diffusion pour tous les canaux de distribution : courrier, email, sms et appel téléphonique. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
===Suppression de l’activation du mailing par défaut===&lt;br /&gt;
*Les anciennes options &amp;lt;Code&amp;gt;Le client souhaite recevoir les mailings&amp;lt;/Code&amp;gt; et &amp;lt;Code&amp;gt;Le client souhaite recevoir ses tickets de caisse par e-mail&amp;lt;/Code&amp;gt; ont été remplacées par les listes de diffusion client situées dans l'onglet &amp;quot;informations complémentaires&amp;quot;.&lt;br /&gt;
{{Note|Conformément au RGPD, '''les nouveaux clients ne feront partie d'aucun mailing par défaut''', les vendeurs doivent demander l'autorisation aux clients et cocher les listes de diffusion adéquates.}}&lt;br /&gt;
===Liste de diffusion===&lt;br /&gt;
*&amp;lt;Code&amp;gt;Base de travail &amp;gt; Classifications &amp;gt; Listes de diffusion des clients&amp;lt;/Code&amp;gt;&lt;br /&gt;
*Les listes de diffusion ci-dessous constituent les listes de diffusion par défaut et ne sont pas modifiables :&lt;br /&gt;
[[Fichier:NF9246 Mailing 1.PNG|centré]]&lt;br /&gt;
Vous pouvez créer une nouvelle liste de diffusion pouvant servir par exemple pour les membres d'un club.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;Code&amp;gt;Créer&amp;lt;/Code&amp;gt;. Saisir :&lt;br /&gt;
*&amp;lt;Code&amp;gt;Libellé (*)&amp;lt;/Code&amp;gt; : renseigner le libellé et le canal de diffusion&lt;br /&gt;
*&amp;lt;Code&amp;gt;Canal de diffusion (*)&amp;lt;/Code&amp;gt; : sélectionner un canal de diffusion &amp;quot;Envoi postal&amp;quot; ou &amp;quot;Envoi par courriel&amp;quot; ou &amp;quot;Envoi par SMS/MMS&amp;quot; ou &amp;quot;Appel téléphonique&amp;quot;&lt;br /&gt;
&amp;lt;Code&amp;gt;Valider&amp;lt;/Code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Fiche client===&lt;br /&gt;
Les anciennes options &amp;lt;Code&amp;gt;Le client souhaite recevoir les mailings&amp;lt;/Code&amp;gt; et &amp;lt;Code&amp;gt;Le client souhaite recevoir ses tickets de caisse par e-mail&amp;lt;/Code&amp;gt; ont été remplacées par la liste de diffusion client située dans l'onglet &amp;quot;informations complémentaires&amp;quot; :&lt;br /&gt;
[[Fichier:NF9246 Mailing 2.PNG|centré]]&lt;br /&gt;
====Clients existants====&lt;br /&gt;
Lors du passage en 8.04, si l'option &amp;lt;Code&amp;gt;Le client souhaite recevoir les mailings&amp;lt;/Code&amp;gt; était :&lt;br /&gt;
*'''décochée''' : les options &amp;quot;Publicité par courrier&amp;quot;, &amp;quot;Publicité par courriel (e-mail)&amp;quot; et &amp;quot;Publicité par sms/mms&amp;quot; sont '''décochées'''.&lt;br /&gt;
*'''cochée''' : les options &amp;quot;Publicité par courrier&amp;quot;, &amp;quot;Publicité par courriel (e-mail)&amp;quot; et &amp;quot;Publicité par sms/mms&amp;quot; sont '''cochées'''.&lt;br /&gt;
La liste de diffusion &amp;lt;Code&amp;gt;Le client souhaite recevoir ses tickets de caisse par e-mail&amp;lt;/Code&amp;gt; prend l'ancienne valeur de l'ancienne option du même nom.&lt;br /&gt;
====Nouveaux clients====&lt;br /&gt;
{{Note|Lors de la création ou l'importation par référencier d'un client, conformément au RGPD : aucune liste de diffusion n'est cochée, le client doit donner son accord pour activer chaque type de liste de diffusion.}}&lt;br /&gt;
===Mailing client===&lt;br /&gt;
{{depuis|8.05}}&lt;br /&gt;
Dans le publipostage / mailing client, la liste '''Envoi prévu par''' comporte également les nouveaux canaux de diffusion des listes de diffusion :&lt;br /&gt;
*&amp;lt;Code&amp;gt;Export pour courriel (e-mail)&amp;lt;/Code&amp;gt;&lt;br /&gt;
*&amp;lt;Code&amp;gt;Export pour SMS/MMS&amp;lt;/Code&amp;gt;&lt;br /&gt;
*&amp;lt;Code&amp;gt;Export pour courrier postal&amp;lt;/Code&amp;gt;&lt;br /&gt;
*&amp;lt;Code&amp;gt;Export pour appel téléphonique&amp;lt;/Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Généralités==&lt;br /&gt;
Dans le cadre de l'envoi de mailings clients par SMS, ce module permet :&lt;br /&gt;
*L'achat de SMS&lt;br /&gt;
*L'envoi et le suivi d'envoi des SMS&lt;br /&gt;
*Le suivi de consommation des SMS&lt;br /&gt;
&lt;br /&gt;
Il est accessible depuis le menu :&lt;br /&gt;
*&amp;lt;Code&amp;gt;Clients &amp;gt; Publipostage/mailing &amp;gt; Onglet 'Rédaction du ou des publipostages'&amp;lt;/Code&amp;gt;&lt;br /&gt;
*&amp;lt;Code&amp;gt;Clients &amp;gt; Gestion des SMS&amp;lt;/Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Nouv 4.14_GestionSms_Liste_TravauxEnvoi.png|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'envoi des SMS est soumis au droit d'utilisateur [[Fichier:Nouv 4.14_GestionSms_DoitsUtilisateurs.png]] (&amp;lt;Code&amp;gt;Système &amp;gt; Gestion des utilisateurs &amp;gt; Modifier &amp;gt; Onglet &amp;quot;Droits&amp;quot; &amp;gt; Rubrique &amp;quot;Messages payants&amp;quot; &amp;lt;/Code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Publispostage / mailing==&lt;br /&gt;
*Clients / Publipostage/Mailing&lt;br /&gt;
*Créer&lt;br /&gt;
===Onglet &amp;quot;Création du publipostage/mailing===&lt;br /&gt;
[[Fichier:NF9246 Mailing 10.png|centré]]&lt;br /&gt;
*Enregistrer et suivant&lt;br /&gt;
===Onglet &amp;quot;Création des bons de remise liés au publipostage&amp;quot;===&lt;br /&gt;
Pour générer des bons bons, cocher &amp;lt;Code&amp;gt;Générer des bons de remise pour ce mailing&amp;lt;/Code&amp;gt; :&lt;br /&gt;
*&amp;lt;Code&amp;gt;Calcul du montant&amp;lt;/Code&amp;gt; :&lt;br /&gt;
**&amp;lt;Code&amp;gt;Montant fixe&amp;lt;/Code&amp;gt; : saisir &amp;lt;Code&amp;gt;Montant des bons&amp;lt;/Code&amp;gt;&lt;br /&gt;
**&amp;lt;Code&amp;gt;Pourcentage&amp;lt;/Code&amp;gt; : saisir &amp;lt;Code&amp;gt;même % pour tous les bons&amp;lt;/Code&amp;gt;&lt;br /&gt;
***Cocher &amp;lt;Code&amp;gt;Sur le plus cher&amp;lt;/Code&amp;gt; si le bon ne s'applique que sur l'article le plus cher du débit.&lt;br /&gt;
**&amp;lt;Code&amp;gt;Pourcentage entre 2 dates de vente&amp;lt;/Code&amp;gt; : saisir &amp;quot;date de début&amp;quot; et &amp;quot;date de fin&amp;quot;&lt;br /&gt;
*&amp;lt;Code&amp;gt;Date de validité&amp;lt;/Code&amp;gt; :&lt;br /&gt;
**Sans limite&lt;br /&gt;
**Date fixe &lt;br /&gt;
**Nombre de jours&lt;br /&gt;
*&amp;lt;Code&amp;gt;Seuil d'activation&amp;lt;/Code&amp;gt; : si le bon ne remise ne s'applique qu'à partir d'un certain montant.&lt;br /&gt;
==Acheter des SMS==&lt;br /&gt;
Pour envoyer des SMS, il faut disposer d'un crédit SMS, donc en avoir effectué l'achat préalablement.&amp;lt;br /&amp;gt;Pour cela, utiliser le bouton 'Acheter des SMS' disponible depuis Gestion des SMS mais aussi à la dernière étape de Publipostage/mailing et à la Confirmation de l'envoi.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Nouv 4.14_GestionSms_achatsms.png]]&lt;br /&gt;
&lt;br /&gt;
== Achat SMS ==&lt;br /&gt;
Cliquer sur le bouton 'Acheter des SMS'&amp;lt;br /&amp;gt;Vous serez automatiquement dirigé sur le site de Vega Informatique / Achat de fournitures.&amp;lt;br /&amp;gt;Etapes :&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Demande d'authentification ===&lt;br /&gt;
[[Fichier:Nouv 4.14_GestionSms_achatsms_ident.png|centré]]&lt;br /&gt;
&lt;br /&gt;
=== L'achat de SMS est directement proposé. ===&lt;br /&gt;
Faire le choix du package : Plusieurs conditionnements existent (Packs de 100 à 100 000 crédits SMS) à des prix dégressifs.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Fichier:Nouv 4.14_GestionSms_achatsms_achat.png|centré]]&lt;br /&gt;
&lt;br /&gt;
=== Paiement ===&lt;br /&gt;
Le crédit SMS est activé immédiatement après le règlement.&lt;br /&gt;
&lt;br /&gt;
==Crédit SMS==&lt;br /&gt;
Le crédit SMS est affiché en points.&lt;br /&gt;
{{Note|type=note|msg=En théorie 1 SMS Métropolitain correspond à 1 point, mais il peut coûter plus selon la longueur du message (1 SMS : 140 caractères maximum) et sa destination (France, Guadeloupe, Mayotte...), l'insertion de caractères spéciaux,  accentués et le rajout automatique de la mention STOP pour les messages commerciaux.}}&lt;br /&gt;
*L'envoi des SMS ne pourra se faire que si le crédit est suffisant pour l'envoi complet.&lt;br /&gt;
*La confirmation de l'envoi est demandée après avoir précisé le ''coût de l'envoi en SMS prémium et le nombre de clients''. &lt;br /&gt;
*'''Le programme vous demande de ressaisir le coût en points SMS prémiums pour confirmation''' :&lt;br /&gt;
[[Fichier:Nouv 6 04 MailingSMS 1.PNG|centré]]&lt;br /&gt;
&lt;br /&gt;
== Envoi et suivi d'envoi des SMS ==&lt;br /&gt;
&lt;br /&gt;
=== Envoi / Annulation ===&lt;br /&gt;
*Depuis &amp;lt;Code&amp;gt;Clients &amp;gt; Publipostage / Mailing &amp;gt; Onglet 'Rédaction du ou des publipostages'&amp;lt;/Code&amp;gt;&lt;br /&gt;
&amp;lt;Code&amp;gt;Envoyer&amp;lt;/Code&amp;gt; permet d'envoyer les SMS. Le texte du SMS est automatiquement sauvegardé.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;Code&amp;gt;Sauver texte&amp;lt;/Code&amp;gt; permet de sauvegarder le texte du SMS sans procéder à l'envoi&lt;br /&gt;
[[Fichier:NF9246_Texte SMS.png|centré]]&lt;br /&gt;
{{Note|Attention, veuillez vérifier que le clavier est en minuscules avant d'insérer les balises.}}&lt;br /&gt;
&lt;br /&gt;
*Depuis  &amp;lt;Code&amp;gt;Clients &amp;gt; Gestions des SMS &amp;gt; Onglet 'Liste des travaux d'envoi de SMS'&amp;lt;/Code&amp;gt; si le mailing a été préparé depuis 'Publipostage/mailing' mais non envoyé. L'annulation de l'envoi est également possible à ce niveau.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Nouv 4.14_GestionSms_BoutonsEnvoiAnnuler.png]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le programme '''affiche le nombre de point(s) SMS prémium(s) et le nombre de clients et vous demande de ressaisir le coût en points SMS premium pour confirmation''' :&lt;br /&gt;
* &amp;lt;Code&amp;gt;Valider&amp;lt;/Code&amp;gt; : pour envoyer les SMS --&amp;gt; Etat = &amp;quot;En cours&amp;quot;&lt;br /&gt;
* &amp;lt;Code&amp;gt;Fermer&amp;lt;/Code&amp;gt; : pour mettre l'envoi en attente. On pourra le lancer plus tard --&amp;gt; Etat = &amp;quot;Nouveau&amp;quot;&lt;br /&gt;
* &amp;lt;Code&amp;gt;Annuler&amp;lt;/Code&amp;gt; : le travail est définitivement annulé --&amp;gt; Etat = &amp;quot;Annulé&amp;quot;&lt;br /&gt;
[[Fichier:Nouv 6 04 MailingSMS 1.PNG|centré]]&lt;br /&gt;
&lt;br /&gt;
=== Contenu du SMS ===&lt;br /&gt;
*Un contrôle de la longueur du message est fait  pour éviter l'envoi de SMS 'vides'.&lt;br /&gt;
*Même si vous avez paramétré un nom d'expéditeur, '''n'oubliez pas de renseigner le nom de votre boutique dans le corps du SMS'''. En effet, l'expéditeur n'est pas systématiquement utilisé par tous les opérateurs et ne sera donc pas visible sur un certain nombre de téléphones portables, notamment certains opérateurs virtuels comme ''NRJ mobile''.&lt;br /&gt;
Si vous ne précisez pas le nom de votre point de vente, l'impact de votre campagne en sera réduit, un certain nombre de vos cibles ne sachant pas où se rendre !&lt;br /&gt;
===Restrictions des pays ===&lt;br /&gt;
{{Note|L'envoi des SMS depuis Polaris est réservé aux clients France (métropole) et Suisse'''}}&lt;br /&gt;
*Le pays d'envoi est France (métropole). '''Quelque soit le pays d'où sont envoyés les SMS, le pays d'envoi est celui du serveur d'envoi des SMS, donc France (métrople)'''.&lt;br /&gt;
*Les seuls  numéros de téléphone autorisés en envoi sont les numéros France (métropole) et Suisse. *L'indicatif international et les expressions régulières enregistrées au niveau du pays en permettent le contrôle.&lt;br /&gt;
'''Concernant les &amp;quot;DOM-TOM&amp;quot; :'''&lt;br /&gt;
*'''Il n'est pas possible d'envoyer vers les numéros avec indicatif +33639xxxxxx, +33690xxxxxx,+33691xxxxxx, +33692xxxxxx, +33693xxxxxx, +33694xxxxxx, +33696xxxxxx, et +33697xxxxxx,'''&lt;br /&gt;
*Tous les numéros sont traduits au format international avant d'arriver sur la passerelle SMS : Un numéro 0690... est automatiquement modifié en +33690... avant d'arriver sur la passerelle et sera donc exclu de l'envoi&lt;br /&gt;
*Cela concerne également les numéros DOM qui ont été portés en numéro métropolitain (numéro acheté dans les DOM, puis transféré chez un opérateur métropolitain et utilisé en France)&lt;br /&gt;
Veuillez consulter la page de [[NF14345 — Paramétrage de l'envoi via la fiche pays (indicatif international et contrôle portable)|Paramétrage de l'envoi via la fiche pays (indicatif international et contrôle portable)]].&lt;br /&gt;
&lt;br /&gt;
===Restrictions d'horaires d'envoi des SMS commerciaux===&lt;br /&gt;
Les opérateurs suivent tous un code de bonne conduite qui indique que '''l'envoi de SMS commerciaux est formellement interdit pendant les heures comprises entre 20h00 et 10h00 les jours calendaires, le dimanche toute la journée et les jours fériés'''.&lt;br /&gt;
&lt;br /&gt;
S'agissant d'un code de bonne conduite et non de la mise en application d'une disposition légale, cet horaire peut plus ou moins varier selon les opérateurs.&lt;br /&gt;
&lt;br /&gt;
Concrètement, tous les messages envoyés par notre passerelle dans cette plage d'horaire restreinte se traduit par une mise en attente et sont envoyés à la première heure autorisée le lendemain.&lt;br /&gt;
&lt;br /&gt;
Cas extrême : les messages envoyés le samedi 23h sont donc remis le lundi à 10h.&lt;br /&gt;
&lt;br /&gt;
===Liste des travaux d'envoi de SMS===&lt;br /&gt;
Liste pour le mois sélectionné, les mailings envoyés par SMS avec leur statut :[[Fichier:Nouv 4.14_GestionSms_Liste_TravauxEnvoi.png|centré]]&lt;br /&gt;
&lt;br /&gt;
==== Statuts possibles ====&lt;br /&gt;
* ''Nouveau'' : Envoi préparé et non envoyé&lt;br /&gt;
* ''Annulé'' : Envoi préparé, puis annulé &lt;br /&gt;
* ''Terminé'' : Envoi réellement effectué&lt;br /&gt;
* ''En cours'' : Envoi en cours&lt;br /&gt;
**NB : Une campagne SMS peut rester en cours d'envoi pendant 72h puisque les opérateurs essayent de renvoyer les SMS pendant ce laps de temps si les portables destinataires ne sont pas atteignables (téléphones éteints, à l'étranger sans roaming, ...).&lt;br /&gt;
&lt;br /&gt;
==== Bilan de l'envoi ====&lt;br /&gt;
* Prévu : Nombre de crédits Sms prévus&lt;br /&gt;
* Réel : Nombre de crédits Sms réellement consommés&lt;br /&gt;
* Total : Nombre total d'envois programmés&lt;br /&gt;
* Bloqué : Nombre d'envois bloqués (par STOP SMS)&lt;br /&gt;
* En erreur : Nombre d'envois en erreur (numéro existant mais plus joignable)&lt;br /&gt;
* Invalide : Nombre d'envois invalides (numéros de téléphone inconnu)&lt;br /&gt;
&lt;br /&gt;
=Suivi de consommation des SMS=&lt;br /&gt;
&amp;lt;Code&amp;gt;Clients &amp;gt; Gestion des SMS &amp;gt; Onglet 'Relevé d'utilisation' &amp;lt;/Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Le relevé de communication est consultable a tout moment. Préciser seulement le mois souhaité.&lt;br /&gt;
*L'envoi du mail est notifié aussitôt l'envoi terminé.&lt;br /&gt;
*Le relevé donne le détail de tous les envois effectués et informe des crédits consommés et échecs éventuels.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
[[Fichier:Nouv 4.14_GestionSms_Releve.png|centré]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Changer l'expéditeur des SMS=&lt;br /&gt;
L'option '''Changer l'expéditeur des SMS''' permet de '''saisir l'expéditeur figurant sur les SMS envoyés au client''' au lieu de numéros (36300, 36108 ...) comme actuellement.&lt;br /&gt;
{{Note|Attention, '''&amp;lt;big&amp;gt;le programme ne permet pas d'afficher l'expéditeur précédemment saisi, mais seulement de le renseigner puis de le mémoriser.&amp;lt;/big&amp;gt;'''. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Le nom de l'expéditeur des SMS est '''limité à 11 caractères ALPHANUMERIQUES non accentués'''.}}&lt;br /&gt;
===Droit utilisateur===&lt;br /&gt;
*Cette fonctionnalité est restreinte par le droit utilisateur '&amp;lt;nowiki/&amp;gt;'''Pouvoir envoyer des sms/messagemobile, si une passerelle est renseignée'&amp;lt;nowiki/&amp;gt;''' de la rubrique '&amp;lt;nowiki/&amp;gt;'''Messages payants''''.&lt;br /&gt;
===Saisie de l'expéditeur===&lt;br /&gt;
*&amp;lt;Code&amp;gt;Clients &amp;gt; Changer l'expéditeur des SMS&amp;lt;/Code&amp;gt;[[Fichier:Nouv_5_15_ExpSMS_1.PNG|centré]]&lt;br /&gt;
*Saisir le nom de l'expéditeur '''limité à 11 caractères alphanumériques maximum et non accentués'''. &lt;br /&gt;
**Il ne peut pas y avoir plus de 11 caractères et pas moins de 3.&lt;br /&gt;
**Les caractères peuvent être : A-Z a-z 0-9 (Ne sont pas autorisés les caractères spéciaux tels que les points, virgules, * $ ? ! ” # % &amp;amp; _ – @ ’ +)&lt;br /&gt;
**Les espaces sont autorisés et comptent comme un caractère, mais ce n’est pas recommandé car ce n’est pas le cas dans toutes les zones. &lt;br /&gt;
*Valider.&lt;br /&gt;
*Le nom de l'expéditeur saisi sera mémorisé pour tous les envois de SMS ultérieurs.&lt;br /&gt;
*Si vous rappelez Clients &amp;gt; Changer l'expéditeur des SMS, '''le programme n'affichera pas l'expéditeur précédemment saisi'''.&lt;br /&gt;
&lt;br /&gt;
'''Conseils pour l'envoi d'un mailing par SMS''' :&lt;br /&gt;
*Nous vous conseillons de créer un mailing de test avec uniquement un client de test comportant votre N° de portable et le contenu du SMS réel.&lt;br /&gt;
*Lancer l'envoi des SMS via le mailing de test, ce qui vous permettra de vérifier l'expéditeur du SMS reçu sur votre portable ainsi que le nombre de SMS décomptés.&lt;br /&gt;
*Copier le contenu du SMS du mailing de test vers le mailing réel.&lt;br /&gt;
*Puis envoyer les SMS depuis le mailing réel pour envoi aux clients.&lt;br /&gt;
*Même si vous avez paramétré un nom d'expéditeur, '''n'oubliez pas de renseigner le nom de votre boutique dans le corps du SMS'''. En effet, l'expéditeur n'est pas systématiquement utilisé par tous les opérateurs et ne sera donc pas visible sur un certain nombre de téléphones portables, notamment certains opérateurs virtuels comme ''NRJ mobile''.&lt;br /&gt;
&lt;br /&gt;
==Purge automatique des bons de remise de plus d'un an jamais retournés==&lt;br /&gt;
{{depuis|9.00}}&lt;br /&gt;
Le programme supprime automatiquement tous les bons de remise de plus d'un an jamais retournés.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=27775</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=27775"/>
		<updated>2023-01-10T10:51:45Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
p,td,a,h1,h2,h3,h4,h5,h6 {&lt;br /&gt;
	overflow-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.book { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* couleur des approbations et révision */&lt;br /&gt;
#mw-revision-info { color: white; background-color: indianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-nav { color: black; background-color: #dedede; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-info a { color: white; }&lt;br /&gt;
.approvedAndLatestMsg { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notApprovedRevision { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notLatestMsg { color: white; background-color: darkorange; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.noApprovedRevision a, .notLatestMsg a { color: white; text-decoration: underline; }&lt;br /&gt;
.noApprovedRevision a:hover, .notLatestMsg a:hover { text-decoration: none; }&lt;br /&gt;
&lt;br /&gt;
form.navbar-left {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dropdown-menu #n-help {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  top: 64px;&lt;br /&gt;
  right: 16px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation .btn-success {&lt;br /&gt;
  opacity: 0.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation a {&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
 .footer-icons, .footer-places, .footer-info, .p-tb, .approbation, .approbation * { display: none !important; } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
img {&lt;br /&gt;
  max-width:100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  page-break-before: auto; &lt;br /&gt;
  page-break-after: auto; &lt;br /&gt;
  page-break-inside: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
  page-break-inside: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1, h2, h3, h4, h5, h6, h7, h8, h9 {&lt;br /&gt;
  page-break-after: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#catlinks {&lt;br /&gt;
  display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-normal-catlinks{&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
  border: 0 !important;&lt;br /&gt;
  background: white !important;&lt;br /&gt;
  margin-top: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#tweeki-cat hr {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.depuis_version { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
.obsolete_version { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.fil-ariane .ariane-sep {&lt;br /&gt;
		margin-left: 0.2em;&lt;br /&gt;
		margin-right: 0.2em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab&lt;br /&gt;
	{		&lt;br /&gt;
		border-collapse: collapse;&lt;br /&gt;
		width: 100%;		&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab td {&lt;br /&gt;
		/* padding: 0.2ex 0.5em; */&lt;br /&gt;
		padding: 1ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-no {		&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: lightblue;&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lib {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: aliceblue;		&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-desc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-space {&lt;br /&gt;
		border-top: 2px solid black;		&lt;br /&gt;
		height: 3ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions {&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		padding-right: 1em;&lt;br /&gt;
		border-left: 1px solid black;		&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		white-space: nowrap;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions ul {&lt;br /&gt;
		list-style-type: none;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li {&lt;br /&gt;
		margin: 0 0.5em 0 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li:before {&lt;br /&gt;
		content: '→ ';&lt;br /&gt;
		color: #aaa;&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-depuis-lib {&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-lib {&lt;br /&gt;
		display: block;&lt;br /&gt;
		color: crimson;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		padding-top: 2ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-versions li:before {&lt;br /&gt;
		content: '× ';&lt;br /&gt;
		color: red;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		vertical-align: middle;&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		max-width: 3ex;&lt;br /&gt;
		width: 3ex;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl .txt {		&lt;br /&gt;
		-webkit-transform-origin: 50% 50%;&lt;br /&gt;
       -moz-transform-origin: 50% 50%;&lt;br /&gt;
        -ms-transform-origin: 50% 50%;&lt;br /&gt;
         -o-transform-origin: 50% 50%;&lt;br /&gt;
            transform-origin: 50% 50%;&lt;br /&gt;
		-webkit-transform: rotate(-90deg);&lt;br /&gt;
       -moz-transform: rotate(-90deg);&lt;br /&gt;
        -ms-transform: rotate(-90deg);&lt;br /&gt;
         -o-transform: rotate(-90deg);&lt;br /&gt;
            transform: rotate(-90deg);&lt;br /&gt;
		overflow-wrap: normal !important;&lt;br /&gt;
		text-overflow: ellipsis;		&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
                &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-cli {&lt;br /&gt;
		background: LightBlue;&lt;br /&gt;
		height: 8ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-qlt {&lt;br /&gt;
		background: palegreen;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-dev {		&lt;br /&gt;
		background: orange;&lt;br /&gt;
		height: 4x;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-col-little {&lt;br /&gt;
		width: 1px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-title {&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		text-align: left;	&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		background: #eee;&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-parametrable {&lt;br /&gt;
		padding-right: 2em;&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-type-func {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-doc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest ul {&lt;br /&gt;
		padding: 0;&lt;br /&gt;
		margin: 0 0 0 1em;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-liennf525 {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .dev-namespace {&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	.carto-tab .dev-file {&lt;br /&gt;
		color: darkgray;&lt;br /&gt;
		font-style: italic;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended {&lt;br /&gt;
		margin-top: 1ex;&lt;br /&gt;
		margin-bottom: 0.5ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended span {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-style: italic;		&lt;br /&gt;
		padding: 2px 1em;		&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction {&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
		color: black;&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status {&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-4 {&lt;br /&gt;
		background-color: YellowGreen;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-0 {&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-1 {&lt;br /&gt;
		background-color: Salmon;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-2 {&lt;br /&gt;
		background-color: Moccasin;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-3 {&lt;br /&gt;
		background-color: LightSteelBlue;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-desc {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link {&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin-left: 6em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link:before {&lt;br /&gt;
		content: '⤍ '; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-nom {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-page {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
.ticket-desc {&lt;br /&gt;
font-size: 90%;&lt;br /&gt;
padding: 0.2ex 0.5em 0.2ex 1em;&lt;br /&gt;
margin: 0.5ex 0.5em 1ex 0.5em;&lt;br /&gt;
color: #666;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.puce-non-conformite { color: white; background-color: RoyalBlue; padding: 0.2ex 0.5em; margin: 0 0.5em 1ex 0; border-radius: 4px; display: inline-block; font-size: 80%;}&lt;br /&gt;
&lt;br /&gt;
#api-body a {&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body a:hover {&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .vlr {&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args ul {&lt;br /&gt;
    list-style: square;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature {&lt;br /&gt;
    border: 1px dotted navajowhite;&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .return-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .security-elt {&lt;br /&gt;
    color: royalblue;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .optionel {&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args th {&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return th {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return td {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args thead th {&lt;br /&gt;
    color: #666;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args td {    &lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h2:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h3:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h4:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h5:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.&amp;quot; counter(cth5) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-headline::before {&lt;br /&gt;
    display: inline !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
	counter-reset: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1 {&lt;br /&gt;
	counter-increment: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2 {&lt;br /&gt;
	color: #0066CC;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	padding: 0 0 0.3ex 0;&lt;br /&gt;
	margin: 3ex 0 3ex 0;&lt;br /&gt;
	border-bottom: 1px solid #0066CC;&lt;br /&gt;
	display: block;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	page-break-before: always;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctitle h2 {&lt;br /&gt;
	color: #FF6633 !important;	&lt;br /&gt;
	border: 0 !important;&lt;br /&gt;
	counter-increment: none !important;&lt;br /&gt;
	page-break-before: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc h2:before {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
h3 {&lt;br /&gt;
	color: #004586;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin: 2ex 0 1ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h4 {&lt;br /&gt;
	color: #FF6633;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	margin: 3ex 0 2ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h5 {&lt;br /&gt;
  color: black;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-size: 120%;&lt;br /&gt;
  margin: 2ex 0 2ex 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body ul, .mw-body ol {&lt;br /&gt;
    padding-bottom: 2ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body li {&lt;br /&gt;
  margin-bottom: 0.5ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sidebar-right {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  right: 1em;&lt;br /&gt;
  top: 4ex;&lt;br /&gt;
  border: 0;&lt;br /&gt;
  bottom: 1ex;&lt;br /&gt;
  overflow: scroll;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  z-index: 99;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Notes_de_la_derni%C3%A8re_version&amp;diff=27769</id>
		<title>Notes de la dernière version</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Notes_de_la_derni%C3%A8re_version&amp;diff=27769"/>
		<updated>2023-01-05T12:08:33Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Destination de redirection modifiée de Notes de version de Polaris 9.01 en Notes de version de Polaris 11.04&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[Notes de version de Polaris 11.04]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF20383&amp;diff=27262</id>
		<title>NF20383</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF20383&amp;diff=27262"/>
		<updated>2022-10-07T12:14:01Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Destination de redirection modifiée de NF20383 — WEBAP ⇒ Compagnon en NF20383 — WEBAPP ⇒ Compagnon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF20383 — WEBAPP ⇒ Compagnon]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF20383_%E2%80%94_Application_%22Compagnon%22&amp;diff=27261</id>
		<title>NF20383 — Application &quot;Compagnon&quot;</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF20383_%E2%80%94_Application_%22Compagnon%22&amp;diff=27261"/>
		<updated>2022-10-07T12:13:25Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Julienv a déplacé la page NF20383 — WEBAP ⇒ Compagnon vers NF20383 — WEBAPP ⇒ Compagnon sans laisser de redirection&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:20383}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF20383|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Notes_de_la_derni%C3%A8re_version&amp;diff=26653</id>
		<title>Notes de la dernière version</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Notes_de_la_derni%C3%A8re_version&amp;diff=26653"/>
		<updated>2022-05-30T08:18:35Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Destination de redirection modifiée de Notes de version de Polaris 9.01 en Notes de version de Polaris 11.00&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[Notes de version de Polaris 11.00]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Accueil&amp;diff=26627</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Accueil&amp;diff=26627"/>
		<updated>2022-05-30T08:01:22Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;jumbotron&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot; id=&amp;quot;Tweeki&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Polaris&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2 style=&amp;quot;margin-top:0px&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot; id=&amp;quot;.3D_Mediawiki_.2B_Twitter_Bootstrap&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Manuel de l'utilisateur&amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Bienvenue sur le site de documentation de Polaris. Sur ces pages, vous trouverez toutes les ressources liées à Polaris et à son exploitation au quotidien.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row-fluid clearfix&amp;quot; style=&amp;quot;text-align:center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;fa fa-magic fa-2x&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Dernières nouveautés&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les nouveautés, les changements et les corrections de la version 11 certifié NF525 (Certificat B17/0054) .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;btn-group&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;./Notes_de_la_dernière_version&amp;quot; rel=&amp;quot;nofollow&amp;quot; class=&amp;quot;btn btn-default&amp;quot;&amp;gt;Découvrir&amp;amp;nbsp;»&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;fa fa-child fa-2x&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Documentation&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Retrouvez dans cette partie la documentation générale du logiciel&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;btn-group&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;./Documentation&amp;quot; rel=&amp;quot;nofollow&amp;quot; class=&amp;quot;btn btn-default&amp;quot;&amp;gt;Documentation générale&amp;amp;nbsp;»&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;btn-group&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;./Manuel_de_caisse&amp;quot; rel=&amp;quot;nofollow&amp;quot; class=&amp;quot;btn btn-default&amp;quot;&amp;gt;Manuel Caisse&amp;amp;nbsp;»&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;fa fa-database fa-2x&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Plan produit&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Couverture fonctionnelle, prochains développements, journaux de modifications des versions, c'est par ici...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;btn-group&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;./Plan_produit&amp;quot; rel=&amp;quot;nofollow&amp;quot; class=&amp;quot;btn btn-default&amp;quot;&amp;gt;Plan produit&amp;amp;nbsp;»&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#tweekihide:firstHeading|sidebar-right|sidebar-left}}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF14034_%E2%80%94_G%C3%A9n%C3%A9ration_des_cl%C3%B4tures_p%C3%A9riodiques_(quotidien,_mensuel_et_annuelle)&amp;diff=25332</id>
		<title>NF14034 — Génération des clôtures périodiques (quotidien, mensuel et annuelle)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF14034_%E2%80%94_G%C3%A9n%C3%A9ration_des_cl%C3%B4tures_p%C3%A9riodiques_(quotidien,_mensuel_et_annuelle)&amp;diff=25332"/>
		<updated>2021-05-07T13:15:23Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:14034}}{{Depuis|6.08.0.31191}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF14034|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&lt;br /&gt;
==Généralités==&lt;br /&gt;
La fonctionnalité &amp;lt;Code&amp;gt;Grands totaux&amp;lt;/Code&amp;gt; est destinée à l'administration fiscale en cas de contrôle.&lt;br /&gt;
Elle répond aux spécificités mises en place pour le respect de la marque NF525 concernant les points suivants :&lt;br /&gt;
*6.4.2.2 : La clôture périodique doit permettre de réaliser l’édition d’un état retraçant les principaux cumuls des opérations effectuées pour la période clôturée et contenant à minima : date de clôture, heure de clôture, numéro séquentiel de clôture, identification du NUR faisant l'objet de la clôture, reprise du cumul du grand total de la précédente clôture, grand total (en valeur absolue et en valeur réelle) de la période clôturée.&lt;br /&gt;
&lt;br /&gt;
==Analyse des grands totaux==&lt;br /&gt;
&lt;br /&gt;
{{Note|La fonctionnalité &amp;quot;Grands totaux&amp;quot; n'est accessible que pour l'utilisateur &amp;quot;admin&amp;quot; (en rouge).}}&lt;br /&gt;
*Se connecter avec l'utilisateur &amp;quot;Admin&amp;quot; (figurant en rouge dans &amp;lt;Code&amp;gt;Système &amp;gt; Gestion des utilisateurs&amp;lt;/Code&amp;gt;)&lt;br /&gt;
*Aller au menu &amp;lt;Code&amp;gt;Ventes &amp;gt; Grands totaux&amp;lt;/Code&amp;gt;&lt;br /&gt;
*Saisir le &amp;lt;Code&amp;gt;Poste (NUR)&amp;lt;/Code&amp;gt; et la &amp;lt;Code&amp;gt;Période d'archivage (Heure de clôture) &amp;lt;/Code&amp;gt; (par rapport à &amp;quot;Horodatage&amp;quot;, c'est à dire à la date et heure de clôture et non la date de vente).&lt;br /&gt;
*Cette fenêtre comporte 7 onglets :&lt;br /&gt;
**'''Grand total ticket'''&lt;br /&gt;
**'''Grand total journalier'''&lt;br /&gt;
**'''Grand total mensuel'''&lt;br /&gt;
**'''Grand total d'exercice'''&lt;br /&gt;
&lt;br /&gt;
* '''Depuis la version 10 :'''&lt;br /&gt;
&lt;br /&gt;
** '''Grand total facture journalier'''&lt;br /&gt;
** '''Grand total facture mensuel'''&lt;br /&gt;
**'''Grand total facture d'exercice'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:NF14034 GrandTotaux 3.PNG|cadre|centré]]&lt;br /&gt;
&lt;br /&gt;
Les informations suivantes y figurent :&lt;br /&gt;
* &amp;lt;Code&amp;gt;Code&amp;lt;/Code&amp;gt; : Numéro unique de document &lt;br /&gt;
** ({NUR:###0}{Compteur:000000000}) pour Grand total ticket&lt;br /&gt;
** date{yyyyMMdd}+NUR pour Grand total journalier&lt;br /&gt;
** date{yyyyMM}+NUR pour Grand total mensuel&lt;br /&gt;
** date de fin {yyyyMM}+NUR pour Grand total exercice&lt;br /&gt;
* &amp;lt;Code&amp;gt;Grand total&amp;lt;/Code&amp;gt; : Montant TTC pour le ticket, la journée, le mois ou l'exercice&lt;br /&gt;
* &amp;lt;Code&amp;gt;Grand total perpétuel absolue&amp;lt;/Code&amp;gt; : Cumul Grand total perpétuel  en valeur absolue pour le ticket, la journée, le mois ou l'exercice (ajout du montant TTC de la période en valeur absolue au précédent cumul)  &lt;br /&gt;
* &amp;lt;Code&amp;gt;Grand total perpétuel réel&amp;lt;/Code&amp;gt; : Cumul Grand Total perpétuel en valeur réelle pour le ticket, la journée, le mois ou l'exercice (ajout du montant TTC de la période en valeur réelle au précédent cumul)  &lt;br /&gt;
* &amp;lt;Code&amp;gt;Horodatage&amp;lt;/Code&amp;gt; :  {Date + heure:AAAAMMJJHHmmss}, date et heure de l'opération en UTC (toujours à la date du système de la machine utilisée au moment de la saisie ou de la clôture)&lt;br /&gt;
* &amp;lt;Code&amp;gt;Montant par taux&amp;lt;/Code&amp;gt; : Montants TTC ventilés par taux de TVA avec les taux applicables pour le ticket, la journée, le mois ou l'exercice&lt;br /&gt;
* &amp;lt;Code&amp;gt;Code du ticket&amp;lt;/Code&amp;gt; : Pour Grand total ticket uniquement, inclut le lien vers le N° du débit concerné&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Note|La mise en place du cumul perpétuel en valeur réelle entrainera la mise à zéro du cumul perpétuel en valeur absolue afin d'assurer la cohérence des cumuls.&lt;br /&gt;
&lt;br /&gt;
*'Grand total ticket'  est remis à zéro au passage de la version 8 lors de la création du 1er ticket en date saisie pour un nur donné&lt;br /&gt;
*'Grand total journalier' est remis à zéro quand tous les Grand total ticket sont passés en version 8&lt;br /&gt;
*'Grand total mensuel' est remis à zéro le 1er mois archivé&lt;br /&gt;
*'Grand total exercice' est remis à zéro la 1er année&lt;br /&gt;
&lt;br /&gt;
L'opération est tracée dans le JET en indiquant le dernier montant du cumul perpétuel en valeur absolue :&lt;br /&gt;
&amp;lt;Code&amp;gt;NF525 (opération n°270) : Evolution de paramètre de conformité aux règles. Reset du compteur 'Cumul grand total perpétuel en valeur absolue' des archives 'Grand total période journalière' suite au passage en version 8 sur le NUR1+L'ancienne valeur était de 1310.6900+0 &amp;lt;/Code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Exportation==&lt;br /&gt;
Le bouton &amp;lt;Code&amp;gt;Exportation&amp;lt;/Code&amp;gt; permet d'exporter au format csv l'ensemble des informations 'Analyse des grands totaux' pour la période et le NUR sélectionnés.&lt;br /&gt;
&lt;br /&gt;
Le type d'archive (Grandticket, Périodejournaliere, Periodemensuel ou Periodeexercice) est spécifié en début ligne.&lt;br /&gt;
&lt;br /&gt;
{{FinChapeau}}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF14034_%E2%80%94_G%C3%A9n%C3%A9ration_des_cl%C3%B4tures_p%C3%A9riodiques_(quotidien,_mensuel_et_annuelle)&amp;diff=25331</id>
		<title>NF14034 — Génération des clôtures périodiques (quotidien, mensuel et annuelle)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF14034_%E2%80%94_G%C3%A9n%C3%A9ration_des_cl%C3%B4tures_p%C3%A9riodiques_(quotidien,_mensuel_et_annuelle)&amp;diff=25331"/>
		<updated>2021-05-07T12:54:20Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:14034}}{{Depuis|6.08.0.31191}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF14034|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;Modif de test 1&amp;lt;br/&amp;gt;&lt;br /&gt;
==Généralités==&lt;br /&gt;
La fonctionnalité &amp;lt;Code&amp;gt;Grands totaux&amp;lt;/Code&amp;gt; est destinée à l'administration fiscale en cas de contrôle.&lt;br /&gt;
Elle répond aux spécificités mises en place pour le respect de la marque NF525 concernant les points suivants :&lt;br /&gt;
*6.4.2.2 : La clôture périodique doit permettre de réaliser l’édition d’un état retraçant les principaux cumuls des opérations effectuées pour la période clôturée et contenant à minima : date de clôture, heure de clôture, numéro séquentiel de clôture, identification du NUR faisant l'objet de la clôture, reprise du cumul du grand total de la précédente clôture, grand total (en valeur absolue et en valeur réelle) de la période clôturée.&lt;br /&gt;
&lt;br /&gt;
==Analyse des grands totaux==&lt;br /&gt;
&lt;br /&gt;
{{Note|La fonctionnalité &amp;quot;Grands totaux&amp;quot; n'est accessible que pour l'utilisateur &amp;quot;admin&amp;quot; (en rouge).}}&lt;br /&gt;
*Se connecter avec l'utilisateur &amp;quot;Admin&amp;quot; (figurant en rouge dans &amp;lt;Code&amp;gt;Système &amp;gt; Gestion des utilisateurs&amp;lt;/Code&amp;gt;)&lt;br /&gt;
*Aller au menu &amp;lt;Code&amp;gt;Ventes &amp;gt; Grands totaux&amp;lt;/Code&amp;gt;&lt;br /&gt;
*Saisir le &amp;lt;Code&amp;gt;Poste (NUR)&amp;lt;/Code&amp;gt; et la &amp;lt;Code&amp;gt;Période d'archivage (Heure de clôture) &amp;lt;/Code&amp;gt; (par rapport à &amp;quot;Horodatage&amp;quot;, c'est à dire à la date et heure de clôture et non la date de vente).&lt;br /&gt;
*Cette fenêtre comporte 7 onglets :&lt;br /&gt;
**'''Grand total ticket'''&lt;br /&gt;
**'''Grand total journalier'''&lt;br /&gt;
**'''Grand total mensuel'''&lt;br /&gt;
**'''Grand total d'exercice'''&lt;br /&gt;
&lt;br /&gt;
* '''Depuis la version 10 :'''&lt;br /&gt;
&lt;br /&gt;
** '''Grand total facture journalier'''&lt;br /&gt;
** '''Grand total facture mensuel'''&lt;br /&gt;
**'''Grand total facture d'exercice'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:NF14034 GrandTotaux 3.PNG|cadre|centré]]&lt;br /&gt;
&lt;br /&gt;
Les informations suivantes y figurent :&lt;br /&gt;
* &amp;lt;Code&amp;gt;Code&amp;lt;/Code&amp;gt; : Numéro unique de document &lt;br /&gt;
** ({NUR:###0}{Compteur:000000000}) pour Grand total ticket&lt;br /&gt;
** date{yyyyMMdd}+NUR pour Grand total journalier&lt;br /&gt;
** date{yyyyMM}+NUR pour Grand total mensuel&lt;br /&gt;
** date de fin {yyyyMM}+NUR pour Grand total exercice&lt;br /&gt;
* &amp;lt;Code&amp;gt;Grand total&amp;lt;/Code&amp;gt; : Montant TTC pour le ticket, la journée, le mois ou l'exercice&lt;br /&gt;
* &amp;lt;Code&amp;gt;Grand total perpétuel absolue&amp;lt;/Code&amp;gt; : Cumul Grand total perpétuel  en valeur absolue pour le ticket, la journée, le mois ou l'exercice (ajout du montant TTC de la période en valeur absolue au précédent cumul)  &lt;br /&gt;
* &amp;lt;Code&amp;gt;Grand total perpétuel réel&amp;lt;/Code&amp;gt; : Cumul Grand Total perpétuel en valeur réelle pour le ticket, la journée, le mois ou l'exercice (ajout du montant TTC de la période en valeur réelle au précédent cumul)  &lt;br /&gt;
* &amp;lt;Code&amp;gt;Horodatage&amp;lt;/Code&amp;gt; :  {Date + heure:AAAAMMJJHHmmss}, date et heure de l'opération en UTC (toujours à la date du système de la machine utilisée au moment de la saisie ou de la clôture)&lt;br /&gt;
* &amp;lt;Code&amp;gt;Montant par taux&amp;lt;/Code&amp;gt; : Montants TTC ventilés par taux de TVA avec les taux applicables pour le ticket, la journée, le mois ou l'exercice&lt;br /&gt;
* &amp;lt;Code&amp;gt;Code du ticket&amp;lt;/Code&amp;gt; : Pour Grand total ticket uniquement, inclut le lien vers le N° du débit concerné&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Note|La mise en place du cumul perpétuel en valeur réelle entrainera la mise à zéro du cumul perpétuel en valeur absolue afin d'assurer la cohérence des cumuls.&lt;br /&gt;
&lt;br /&gt;
*'Grand total ticket'  est remis à zéro au passage de la version 8 lors de la création du 1er ticket en date saisie pour un nur donné&lt;br /&gt;
*'Grand total journalier' est remis à zéro quand tous les Grand total ticket sont passés en version 8&lt;br /&gt;
*'Grand total mensuel' est remis à zéro le 1er mois archivé&lt;br /&gt;
*'Grand total exercice' est remis à zéro la 1er année&lt;br /&gt;
&lt;br /&gt;
L'opération est tracée dans le JET en indiquant le dernier montant du cumul perpétuel en valeur absolue :&lt;br /&gt;
&amp;lt;Code&amp;gt;NF525 (opération n°270) : Evolution de paramètre de conformité aux règles. Reset du compteur 'Cumul grand total perpétuel en valeur absolue' des archives 'Grand total période journalière' suite au passage en version 8 sur le NUR1+L'ancienne valeur était de 1310.6900+0 &amp;lt;/Code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Exportation==&lt;br /&gt;
Le bouton &amp;lt;Code&amp;gt;Exportation&amp;lt;/Code&amp;gt; permet d'exporter au format csv l'ensemble des informations 'Analyse des grands totaux' pour la période et le NUR sélectionnés.&lt;br /&gt;
&lt;br /&gt;
Le type d'archive (Grandticket, Périodejournaliere, Periodemensuel ou Periodeexercice) est spécifié en début ligne.&lt;br /&gt;
&lt;br /&gt;
{{FinChapeau}}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Page_de_test&amp;diff=24272</id>
		<title>Page de test</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Page_de_test&amp;diff=24272"/>
		<updated>2021-01-28T14:35:32Z</updated>

		<summary type="html">&lt;p&gt;Julienv : test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#cartographie:1}}&lt;br /&gt;
&lt;br /&gt;
Ceci est une page de test.&lt;br /&gt;
&lt;br /&gt;
Bientôt disponible !&lt;br /&gt;
&lt;br /&gt;
modif 1&lt;br /&gt;
&lt;br /&gt;
modif 2&lt;br /&gt;
&lt;br /&gt;
modif 3&lt;br /&gt;
&lt;br /&gt;
modif 4&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Page_de_test&amp;diff=24271</id>
		<title>Page de test</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Page_de_test&amp;diff=24271"/>
		<updated>2021-01-28T14:35:10Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#cartographie:1}}&lt;br /&gt;
&lt;br /&gt;
Ceci est une page de test.&lt;br /&gt;
&lt;br /&gt;
Bientôt disponible !&lt;br /&gt;
&lt;br /&gt;
modif 1&lt;br /&gt;
&lt;br /&gt;
modif 2&lt;br /&gt;
&lt;br /&gt;
modif 3&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Documentation&amp;diff=24265</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Documentation&amp;diff=24265"/>
		<updated>2021-01-20T12:45:29Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Généralités==&lt;br /&gt;
*[[Prérequis de Polaris]]&lt;br /&gt;
*[[Généralités]]&lt;br /&gt;
*[[Mise à jour]]&lt;br /&gt;
&lt;br /&gt;
== Menu Système ==&lt;br /&gt;
* [[Menu Fenêtres actives|Fenêtres actives]]&lt;br /&gt;
* [[Utilisation de la messagerie interne|Ma messagerie]]&lt;br /&gt;
* [[Menu mes tâches automatisées|Mes taches automatisées]]&lt;br /&gt;
* [[Changer son mot de passe|Changer mon mot de passe]]&lt;br /&gt;
* [[Paramétrages du logiciel|Paramétrages]]&lt;br /&gt;
* [[Schéma de la réplication]]&lt;br /&gt;
* [[Gestion des applications]]&lt;br /&gt;
* [[Gestion des groupes d'utilisateurs]]&lt;br /&gt;
* [[Gestion des utilisateurs]]&lt;br /&gt;
* [[Menu gestion des tâches automatisées|Gestion des tâches automatisées]]&lt;br /&gt;
* [[Menu Gestion des filtres|Gestion des filtres]]&lt;br /&gt;
* [[Gestion des listes système]]&lt;br /&gt;
* [[Journaux du système]]&lt;br /&gt;
* [[Journaux du système (nouvelle version)]]&lt;br /&gt;
* [[Menu se connecter|Se connecter]]&lt;br /&gt;
* [[Menu se déconnecter|Se déconnecter]]&lt;br /&gt;
* [[Menu quitter|Quitter]]&lt;br /&gt;
&lt;br /&gt;
== Menu Stock  ==&lt;br /&gt;
*'''Plans d’achats'''&lt;br /&gt;
:*[[Plans d’achats]] &lt;br /&gt;
:*[[Plans_d’achats#5._Budget_et_achats|Menu budget et achats]]&lt;br /&gt;
&lt;br /&gt;
*'''Commandes'''&lt;br /&gt;
&lt;br /&gt;
:*[[NF14242 — Commande fournisseur|Création / Modification d'une commande]]&lt;br /&gt;
&lt;br /&gt;
*'''Livraisons &amp;amp; ajustements'''&lt;br /&gt;
&lt;br /&gt;
:*'''Saisie de réceptions'''&lt;br /&gt;
&lt;br /&gt;
::*[[Livraison et ajustement]]&lt;br /&gt;
::*[[Réception directe]] &lt;br /&gt;
::*[[NF14905_—_Réception_sur_commande|Réception sur commande]]&lt;br /&gt;
::*[[Demande d’étiquette]] &lt;br /&gt;
::*[[Ajustement sur erreur]] &lt;br /&gt;
::*[[Changement de prix]] &lt;br /&gt;
::*[[Création de modèle avec tarification]] &lt;br /&gt;
::*[[Retour fournisseur]] &lt;br /&gt;
::*[[Reprise de stock]]&lt;br /&gt;
::*[[Edition des étiquettes|Edition des étiquettes]]&lt;br /&gt;
&lt;br /&gt;
:*[[Calcul des remises arrières]] &lt;br /&gt;
:*[[Menu édition des bons de réception|Édition des bons]] &lt;br /&gt;
&lt;br /&gt;
:*[[Menu édition des étiquettes de réception|Édition des étiquettes]] &lt;br /&gt;
&lt;br /&gt;
:*[[Saisie des réceptions par code barres|Saisie par code barres]]&lt;br /&gt;
&lt;br /&gt;
:*[[Saisie des retours fournisseur par code barres|Saisie des retours par code barres]] &lt;br /&gt;
:*[[Saisie des changements de prix par code barres]]&lt;br /&gt;
&lt;br /&gt;
:*[[Echéancier fournisseur|Echéanciers fournisseur]]&lt;br /&gt;
&lt;br /&gt;
*'''Transferts'''&lt;br /&gt;
&lt;br /&gt;
:*[[Saisie des transferts commande interne|Préparations de transfert ou commandes internes]] &lt;br /&gt;
:*[[Saisie des transferts|Transferts de marchandises (émissions)]] &lt;br /&gt;
:*[[Saisie des transferts réceptions|Réceptions ou contrôles de transferts]] &lt;br /&gt;
:*[[Transferts édition des bons|Édition des bons]] &lt;br /&gt;
:*[[Transferts édition étiquettes|Édition des étiquettes]] &lt;br /&gt;
:*[[Saisie des transferts par code barres|Saisie par code barres]]&lt;br /&gt;
&lt;br /&gt;
*'''Négoce'''&lt;br /&gt;
&lt;br /&gt;
:*[[Menu Vente en gros|Vente en gros]] &lt;br /&gt;
:*[[Menu Devis|Devis]] &lt;br /&gt;
:*[[Menu Commande client|Commande client]] &lt;br /&gt;
&lt;br /&gt;
*[[Correction des négatifs]] &lt;br /&gt;
*[[NF14915 — Inventaire|Inventaire]] &lt;br /&gt;
*[[Saisies par code barres]] &lt;br /&gt;
*'''Stocks d'alerte'''&lt;br /&gt;
&lt;br /&gt;
:*[[Définir un stock d'alerte|Saisie manuelle]] &lt;br /&gt;
:*[[Réapprovisionnement sur stock d'alerte|Réapprovisionnement]]&lt;br /&gt;
:*[[Stocks d'alerte : Saisie dynamique|Saisie dynamique]]&lt;br /&gt;
:*[[Stocks d'alerte : Journal des alertes|Journal des alertes]]&lt;br /&gt;
:*[[Stocks d'alerte : Priorités réapprovisionnement|Priorités réapprovisionnement]]&lt;br /&gt;
&lt;br /&gt;
== Analyses ==&lt;br /&gt;
* [[Fiche stock]]&lt;br /&gt;
* [[Gestionnaire d'analyses]]&lt;br /&gt;
* [[Statistiques par graphiques]]&lt;br /&gt;
* [[Edition photos]]&lt;br /&gt;
* [[Historiques généraux]]&lt;br /&gt;
* [[Module d'interrogation de la base de données|Interrogation de la base de données]]&lt;br /&gt;
* [[Travaux sur listes ou filtres de modèles]]&lt;br /&gt;
* [[Travaux sur listes ou filtres de clients]]&lt;br /&gt;
&lt;br /&gt;
== Menu Clients ==&lt;br /&gt;
* [[Fiche clients]]&lt;br /&gt;
* [[Balance clients]]&lt;br /&gt;
* '''Fidélisation'''&lt;br /&gt;
:* [[NF16895_—_Fidélisation_clients_:_type_des_cartes_de_fidélité|Type de cartes de fidélité]]&lt;br /&gt;
:* [[Menu chèques cadeaux en automatique|Chèques cadeaux en automatique]]&lt;br /&gt;
:* [[Liste des cartes de fidélité|Liste des cartes]]&lt;br /&gt;
* [[Publipostage / Mailing]]&lt;br /&gt;
* [[Gestion des SMS]]&lt;br /&gt;
* [[Changer l'expéditeur des SMS]]&lt;br /&gt;
&lt;br /&gt;
== Menu Ventes ==&lt;br /&gt;
* [[Menu Ventes, Ventes|Vendre]]&lt;br /&gt;
* [[Menu Ventes, Liste des ventes|Liste des ventes]]&lt;br /&gt;
* [[Menu analyse du C.A.|Analyse du C.A.]]&lt;br /&gt;
* [[Menu liste des bons de ventes|Bons]]&lt;br /&gt;
* [[Plans de soldes|Soldes]]&lt;br /&gt;
* [[Facturation|Facturation]]&lt;br /&gt;
* [[Lots, ventes quantitatives et promotions par ensemble]]&lt;br /&gt;
* '''Remises en banque'''&lt;br /&gt;
:* [[NF17333_—_Ventes_⇒_Remise_en_banque_(chèque_et_carte)|Remise en banque]]&lt;br /&gt;
:* [[Liste des remises en banque]]&lt;br /&gt;
* '''Cartes pre-payées'''&lt;br /&gt;
:* [[Paramétrage des cartes pré-payées]]&lt;br /&gt;
:* [[Liste des cartes pré-payées]]&lt;br /&gt;
* [[Liste des réservations|Réservations/Devis/Commandes client]]&lt;br /&gt;
* [[Tickets de service]]&lt;br /&gt;
* '''Plan de gueltes'''&lt;br /&gt;
:* [[Plan de gueltes|Plan de gueltes]]&lt;br /&gt;
* [[Gestion des commandes internet]]&lt;br /&gt;
* [[Gestion des commentaires internet]]&lt;br /&gt;
* [[Gestion des colis clients]]&lt;br /&gt;
* '''Saisie des objectifs'''&lt;br /&gt;
:* [[Objectifs magasin|Objectifs magasin]]&lt;br /&gt;
:* [[Objectifs vendeur|Objectifs vendeur]]&lt;br /&gt;
&lt;br /&gt;
== Base de travail ==&lt;br /&gt;
* '''Robots de modification de masse'''&lt;br /&gt;
:* [[Modification modèles]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériels'''&lt;br /&gt;
:* [[Claviers tactiles]]&lt;br /&gt;
&lt;br /&gt;
* '''Classifications'''&lt;br /&gt;
:* '''Catégories'''&lt;br /&gt;
::* [[Catégories|Catégories n°1]]&lt;br /&gt;
::* [[Catégories|Catégories n°2]]&lt;br /&gt;
::* [[Catégories|Catégories n°3]]&lt;br /&gt;
::* [[Catégories|Catégories n°4]]&lt;br /&gt;
:* '''Niveaux'''&lt;br /&gt;
::* [[Niveaux de déclinaison|Niveau n°1]]&lt;br /&gt;
::* [[Niveaux de déclinaison|Niveau n°2]]&lt;br /&gt;
::* [[Niveaux de déclinaison|Niveau n°3]]&lt;br /&gt;
::* [[Niveaux de déclinaison|Niveau n°4]]&lt;br /&gt;
&lt;br /&gt;
:* [[Collections]]&lt;br /&gt;
:* [[Contact des marques]]&lt;br /&gt;
:* [[Grilles de tailles]]&lt;br /&gt;
:* [[Groupes de tailles]]&lt;br /&gt;
:* [[Marques]]&lt;br /&gt;
:* [[Saisons]]&lt;br /&gt;
:* [[Sous familles]]&lt;br /&gt;
:* [[Thèmes]]&lt;br /&gt;
&lt;br /&gt;
* '''Entités'''&lt;br /&gt;
:* [[Sociétés]]&lt;br /&gt;
:* [[Magasins]]&lt;br /&gt;
:* [[Groupes de magasins]]&lt;br /&gt;
:* [[Fournisseurs]]&lt;br /&gt;
:* [[Contacts des fournisseurs]]&lt;br /&gt;
:* [[Vendeurs]]&lt;br /&gt;
:* [[Banques]]&lt;br /&gt;
:* [[Comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
* '''Comptabilité'''&lt;br /&gt;
:* [[Comptes de comptabilité]]&lt;br /&gt;
:* [[Journaux de comptabilité]]&lt;br /&gt;
&lt;br /&gt;
* '''Taxes et monnaies'''&lt;br /&gt;
:* [[Monnaies et parités]]&lt;br /&gt;
:* [[Tarifications]]&lt;br /&gt;
:* [[Taxes]]&lt;br /&gt;
:* [[Modes de règlements]]&lt;br /&gt;
&lt;br /&gt;
* '''Zones'''&lt;br /&gt;
:* [[Pays]]&lt;br /&gt;
:* [[Codes postaux]]&lt;br /&gt;
:* [[Secteurs commerciaux]]&lt;br /&gt;
&lt;br /&gt;
* '''Aide à la saisie'''&lt;br /&gt;
:* [[Gestions des quantités]]&lt;br /&gt;
:* [[Grille de « matière »]]&lt;br /&gt;
:* [[Grille de « couleur »]]&lt;br /&gt;
:* [[Grille de « divers »]]&lt;br /&gt;
:* [[Grille de « divers bis »]]&lt;br /&gt;
&lt;br /&gt;
* [[Etiquettes]]&lt;br /&gt;
&lt;br /&gt;
* '''Sites internet'''&lt;br /&gt;
:* [[Gestion des canevas]]&lt;br /&gt;
:* [[Gestion des sites internet]]&lt;br /&gt;
:* [[Gestion des transporteurs]]&lt;br /&gt;
:* [[Publication en masse des produits]]&lt;br /&gt;
&lt;br /&gt;
* '''Configuration des analyses'''&lt;br /&gt;
:* '''Eléments d’édition'''&lt;br /&gt;
::* [[Briques élémentaires]]&lt;br /&gt;
::* [[Briques de calculs d'édition|Calculs d’éditions]]&lt;br /&gt;
:* [[Exporter des éléments d'analyses|Exporter des éléments]]&lt;br /&gt;
:* [[Importer des éléments d'analyses|Importer des éléments]]&lt;br /&gt;
&lt;br /&gt;
* '''Référencier et importation'''&lt;br /&gt;
:* '''Gestion des mappages de référence et importation'''&lt;br /&gt;
::* [[Mappage référencier des catégories|Mappage « catégorie 1, 2, 3, 4 »]]&lt;br /&gt;
::* [[Mappage référencier de la collection|Mappage « collection »]]&lt;br /&gt;
::* [[Mappage référencier du magasin|Mappage « magasin »]]&lt;br /&gt;
::* [[Mappage référencier de la marque|Mappage « marque »]]&lt;br /&gt;
::* [[Mappage référencier de la sous-famille|Mappage  « sous famille »]]&lt;br /&gt;
::* [[Mappage référencier de la saison|Mappage « saison »]]&lt;br /&gt;
:* [[Paramétrage des référenciers et importation]]&lt;br /&gt;
:* [[[[NF13128 — Importation de référencier|Importation des référenciers et importation]]]]&lt;br /&gt;
&lt;br /&gt;
== Menu Utilitaires ==&lt;br /&gt;
&lt;br /&gt;
* [[Mise a jour du systeme de gestion de base de donnees|Mise à jour du système de gestion de base de données]]&lt;br /&gt;
* [[Impression d'écran|Impression écran]]&lt;br /&gt;
* [[Menu support technique|Support technique]]&lt;br /&gt;
* [[Menu information service|Infos service]]&lt;br /&gt;
* '''Base de données'''&lt;br /&gt;
:* [[Sauvegarde de la base]]&lt;br /&gt;
:* [[Mode isolation|Mode test/isolation]]&lt;br /&gt;
:* [[Resynchronisation totale &amp;amp; générale]]&lt;br /&gt;
:* [[Resynchronisation du service local]]&lt;br /&gt;
:* [[Restauration de la base]]&lt;br /&gt;
:* [[Menu schéma de la base|Schéma de la base]]&lt;br /&gt;
* [[Exporter mon thème graphique]]&lt;br /&gt;
* [[Importer mon thème graphique]]&lt;br /&gt;
* [[Diffuser un message instantané]]&lt;br /&gt;
* [[Annuaire généralisé|Annuaire]]&lt;br /&gt;
* [[Mini photos]]&lt;br /&gt;
* [[Corbeille]]&lt;br /&gt;
* [[Menu pocket PC|Pocket pc / communication]]&lt;br /&gt;
* [[Menu portable d'inventaire|Portable d’inventaire]]&lt;br /&gt;
* [[Menu préparations d'impression|Préparations d'impression]]&lt;br /&gt;
&lt;br /&gt;
== Menu ? ==&lt;br /&gt;
* [[Assistance à distance]]&lt;br /&gt;
* [[&amp;amp;Agrave; propos]]&lt;br /&gt;
* [[Menu informations sur la licence|Informations sur la licence]]&lt;br /&gt;
* [[Vega-info.fr]]&lt;br /&gt;
* [[Les nouveautés de Polaris]]&lt;br /&gt;
* [[Aide vidéo]]&lt;br /&gt;
&lt;br /&gt;
==Divers==&lt;br /&gt;
:* [[Génération des cartes de fidélité clients par un imprimeur|Génération des cartes de fidélité clients par un imprimeur]]&lt;br /&gt;
&lt;br /&gt;
== Spécifiques clients ==&lt;br /&gt;
&lt;br /&gt;
* [[MarketPlace Garant|MarketPlace Garant]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF14242&amp;diff=22485</id>
		<title>NF14242</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF14242&amp;diff=22485"/>
		<updated>2020-03-23T08:55:18Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page redirigée vers NF14242 — Commande fournisseur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF14242 — Commande fournisseur]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=22063</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=22063"/>
		<updated>2020-01-23T14:59:42Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
Une documentation approfondie décrivant le système de connexion aux API est embarqué sur votre système de réplication.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez y accéder avec un navigateur : http://votrelicence.vega-net.net/api.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=22062</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=22062"/>
		<updated>2020-01-23T14:59:34Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Contenu remplacé par « Catégorie:CG58 → A classer{{DebutInfoCartographe}}{{#cartographie:16618}} &amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : PP58_—_A_classer#NF1661... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Une documentation approfondie décrivant le système de connexion aux API est embarqué sur votre système de réplication.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez y accéder avec un navigateur : http://votrelicence.vega-net.net/api.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16530_%E2%80%94_Clients_%E2%87%92_Carte_de_fid%C3%A9lit%C3%A9_%C3%A0_points_progressive_(soumise_%C3%A0_un_sp%C3%A9cifique_de_licence)&amp;diff=22028</id>
		<title>NF16530 — Clients ⇒ Carte de fidélité à points progressive (soumise à un spécifique de licence)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16530_%E2%80%94_Clients_%E2%87%92_Carte_de_fid%C3%A9lit%C3%A9_%C3%A0_points_progressive_(soumise_%C3%A0_un_sp%C3%A9cifique_de_licence)&amp;diff=22028"/>
		<updated>2020-01-13T16:53:15Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16530}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16530|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
La [[NF16895_—_Fidélisation_clients_:_type_des_cartes_de_fidélité|carte de fidélité]] '''à points progressive''' permet de définir des paliers en affectant des bonus tout en continuant à '''cumuler les points jusqu'au dernier palier qui les remet à zéro'''.&lt;br /&gt;
La rubrique &amp;lt;Code&amp;gt;Compteur de bonus déjà affectés&amp;lt;/Code&amp;gt; est incrémenté à chaque attribution de bonus des paliers intermédiaires et remise à zéro au dernier palier.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Type de carte de fidélité progressive==&lt;br /&gt;
&amp;lt;Code&amp;gt;Créer&amp;lt;/Code&amp;gt;&lt;br /&gt;
*&amp;lt;Code&amp;gt;Module de carte&amp;lt;/Code&amp;gt; : sélectionner &amp;lt;Code&amp;gt;Carte progressive&amp;lt;/Code&amp;gt;&lt;br /&gt;
*&amp;lt;Code&amp;gt;Type de carte&amp;lt;/Code&amp;gt; : la carte progressive est une carte à points.&lt;br /&gt;
Les onglets &amp;quot;Commun&amp;quot;, &amp;quot;magasins&amp;quot;, 'Filtre&amp;quot;, &amp;quot;Arrondi&amp;quot; sont identiques à la carte de fidélité classique.&lt;br /&gt;
===Onglet &amp;quot;Carte à points&amp;quot;===&lt;br /&gt;
'''Onglet &amp;quot;Calcul des avantages des cartes à points&amp;quot; :''' [[Fichier:NF16895 CFClient 1.PNG|néant]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Onglet &amp;quot;Avantages des cartes à points&amp;quot; :'''&lt;br /&gt;
*Cocher le type d'avantage &amp;lt;Code&amp;gt;Pourcentage&amp;lt;/Code&amp;gt;, &amp;lt;Code&amp;gt;Cadeaux&amp;lt;/Code&amp;gt; ou &amp;lt;Code&amp;gt;Montant&amp;lt;/Code&amp;gt;&lt;br /&gt;
**Vous pouvez affecter un type d'avantage différent par palier.&lt;br /&gt;
*&amp;lt;Code&amp;gt;Paliers&amp;lt;/Code&amp;gt; : se positionner sur l'onglet avantage concerné (&amp;quot;pourcentage&amp;quot;, &amp;quot;montant&amp;quot; ou &amp;quot;cadeaux&amp;quot;), renseigner le nombre de points et le bonus (% par exemple) pour chaque palier. Les points seront cumulés jusqu'au dernier palier qui les remettra à 0.&lt;br /&gt;
*&amp;lt;Code&amp;gt;Créer et éditer un chèque cadeau&amp;lt;/Code&amp;gt; &lt;br /&gt;
**Coché :  génère un bon de remise&lt;br /&gt;
**Décoché : génère une remise fidélité&lt;br /&gt;
Soit un exemple de carte de fidélité progressive :&lt;br /&gt;
[[Fichier:NF16895 CFClient 2.PNG|centré]]&lt;br /&gt;
[[Fichier:NF16895 CFClient 3.PNG|centré]]&lt;br /&gt;
&lt;br /&gt;
==Fiche client ==&lt;br /&gt;
'''Onglet &amp;quot;Carte&amp;quot;'''&lt;br /&gt;
*&amp;lt;Code&amp;gt;Compteur de bonus déjà affecté&amp;lt;/Code&amp;gt; : compte les bonus déjà affectés des paliers intermédiaires sans remise à zéro des points. Il est remis à 0 au dernier palier qui remet à zéro les points.&lt;br /&gt;
*&amp;lt;Code&amp;gt;Modifier&amp;lt;/Code&amp;gt; : vous pouvez modifier si les droits le permettent :&lt;br /&gt;
**&amp;lt;Code&amp;gt;Points&amp;lt;/Code&amp;gt;&lt;br /&gt;
**&amp;lt;Code&amp;gt;Cpt bonus&amp;lt;/Code&amp;gt; : compteur de bonus affectés&lt;br /&gt;
**En cas de modification, veuillez vérifier la cohérence entre le nombre de points et le compteur de bonus.&lt;br /&gt;
'''Onglet &amp;quot;Historique de fidélisation&amp;quot; :'''&lt;br /&gt;
*&amp;lt;Code&amp;gt;Compteur de bonus de carte&amp;lt;/Code&amp;gt; : suit l'évolution du compteur de bonus : 1, +1, -1&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Gestion des membres client :'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Si  l'option de la fiche client &amp;lt;Code&amp;gt;Utiliser le même compte pour les membres&amp;lt;/Code&amp;gt; est :&lt;br /&gt;
*'''Cochée''' : la carte de fidélité est '''commune''' au client principal et aux membres. Les points, compteurs de bonus sont identiques.&lt;br /&gt;
*'''Décochée''' : les cartes de fidélité du client principal et des membres sont  '''indépendantes'''. Les points, compteurs de bonus sont séparés  et comptabilisés par carte.&lt;br /&gt;
&lt;br /&gt;
==Caisse==&lt;br /&gt;
Prenons l'exemple de vente pour un client avec la carte de fidélité progressive ci-dessus avec des débits cumulant les points.&lt;br /&gt;
===Création d'un débit===&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Nouveau débit avec incrément des points sans attribution du bonus :'''&lt;br /&gt;
*1ier débit de 30 € : 100 points, compteur de bonus=0, pas de génération de bon de remise&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Débit d'incrément des points avec génération du bonus sans remise à zéro des points''' :&lt;br /&gt;
*2ième débit de 30 € : 200 points, '''compteur de bonus=1''', '''génération d'un bon de remise de 10 %''' du palier N°1&lt;br /&gt;
&amp;lt;br /&amp;gt;'''Paliers intermédiaires''' :&lt;br /&gt;
*3ième débit de 30 € : 300 points, compteur de bonus=1, pas de génération d'un bon de remise&lt;br /&gt;
*4ième débit de 30 € : 400 points, '''compteur de bonus=2''', '''génération d'un bon de remise de 20 %''' du palier N°2&lt;br /&gt;
*5ième débit de 30 € : 500 points, compteur de bonus=2, pas de génération d'un bon de remise&lt;br /&gt;
'''Débit du dernier palier avec génération du bonus et remise à zéro des points''' :&lt;br /&gt;
*6ième débit de 30 € : '''0 points (remis à 0), compteur de bonus=0 (remis à 0)''', génération d'un bon de remise de 30 % du palier N°3&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Annuler le débit===&lt;br /&gt;
L' annulation d'un débit ayant généré un bonus, qui a incrémente les points et le compteur de bonus :&lt;br /&gt;
*décrémente les points : s'il s'agit du dernier palier du débit N°6 de notre exemple, points=0 --&amp;gt; 500&lt;br /&gt;
*Décrémente le compteur de bonus : s'il s'agit du dernier palier de notre exemple, compteur de bonus passe de 0 à 2&lt;br /&gt;
*Met en quarantaine le bon de remise généré.&lt;br /&gt;
La sortie du mode école annule tous les débits de la même manière que la fonctionnalité &amp;quot;Annuler le débit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Retour ticket===&lt;br /&gt;
Le retour d'un débit ayant généré un bonus, qui a incrémente les points et le compteur de bonus :&lt;br /&gt;
*décrémente les points : s'il s'agit du dernier palier de notre exemple, points=0 --&amp;gt; 500&lt;br /&gt;
*NE décrémente PAS le compteur de bonus &lt;br /&gt;
*Conserve le bon de remise généré.&lt;br /&gt;
===Annuler et ressaisir un débit===&lt;br /&gt;
Concernant la fidélisation, plusieurs cas peuvent se produire :&lt;br /&gt;
*Aucune modification concernant la fidélisation &lt;br /&gt;
*''Fidélisation gérée dans l'ancien débit, pas dans le nouveau'' : identique à l'annulation du débit&lt;br /&gt;
*''Fidélisation pas gérée dans l'ancien débit, gérée dans le nouveau'' : identique à la création d'un débit&lt;br /&gt;
*''Changement de client'' :&lt;br /&gt;
**ancien client : identique à une annulation de débit&lt;br /&gt;
**nouveau client : identique à un nouveau débit&lt;br /&gt;
&lt;br /&gt;
==Modification massive des clients==&lt;br /&gt;
*&amp;lt;Code&amp;gt;Analyses &amp;gt; Travaux sur listes ou filtres de clients &amp;lt;/Code&amp;gt;&lt;br /&gt;
*Filtrer les clients&lt;br /&gt;
*&amp;lt;Code&amp;gt;Modification massive des clients&amp;lt;/Code&amp;gt;&lt;br /&gt;
*&amp;lt;Code&amp;gt;Carte : nombre de points&amp;lt;/Code&amp;gt; : permet de modifier le nombre de points&lt;br /&gt;
*&amp;lt;Code&amp;gt;Carte : compteur de bonus&amp;lt;/Code&amp;gt; : permet de modifier le compteur de bonus&lt;br /&gt;
En cas de modification, veuillez vérifier la cohérence entre le nombre de points et le compteur de bonus.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16530_%E2%80%94_Clients_%E2%87%92_Carte_de_fid%C3%A9lit%C3%A9_%C3%A0_points_progressive_(soumise_%C3%A0_un_sp%C3%A9cifique_de_licence)&amp;diff=22027</id>
		<title>NF16530 — Clients ⇒ Carte de fidélité à points progressive (soumise à un spécifique de licence)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16530_%E2%80%94_Clients_%E2%87%92_Carte_de_fid%C3%A9lit%C3%A9_%C3%A0_points_progressive_(soumise_%C3%A0_un_sp%C3%A9cifique_de_licence)&amp;diff=22027"/>
		<updated>2020-01-13T16:44:48Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Julienv a déplacé la page NF16530 vers NF16530 — Abandon de fidélisa et création carte fidélité / Possible ou non pour les paramétrages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF16530 — Abandon de fidélisa et création carte fidélité / Possible ou non pour les paramétrages]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=22011</id>
		<title>NF13075 — Interface de programmation applicative par Webservice (API)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=22011"/>
		<updated>2020-01-10T10:40:23Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG77 → Autres outils]]{{DebutInfoCartographe}}{{#cartographie:13075}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP77_—_Autres_outils#NF13075|Autres outils]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&lt;br /&gt;
L'API par Webservice vous permet de piloter ou d'interroger votre solution de gestion depuis un programme externe : c'est par son intermédiaire que le prestataire tiers choisi va mettre en place l'interconnexion à votre backoffice. Cette documentation lui est donc principalement destinée.&lt;br /&gt;
&lt;br /&gt;
En effet, une ''interface de programmation applicative'' (désignée par le terme API pour ''Application Programming Interface'') est un ensemble normalisé de classes, de méthodes ou de fonctions qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels. &lt;br /&gt;
&lt;br /&gt;
Dans le cas de Polaris, elle est offerte par un service web, accessible sur chaque service de réplication.&lt;br /&gt;
{{FinChapeau}}&lt;br /&gt;
== Choix techniques ==&lt;br /&gt;
=== Pour commencer ===&lt;br /&gt;
&lt;br /&gt;
Notre API est bâtie sur l'exploitation d'un webservice, donc sur un échange HTTP pour lequel nous respectons le standard 1.1.&lt;br /&gt;
Elle est compatible notamment avec les échanges sécurisés (SSL).&lt;br /&gt;
&lt;br /&gt;
Pour échanger avec notre webservice, il faut donc le faire à travers un client HTTP traditionnel en manipulant des URI.&lt;br /&gt;
&lt;br /&gt;
L'API est ouverte et accessible sur l'URL suivante : https://''xx.xx.xx.xx'':''3443'''''/core/api/'''.&lt;br /&gt;
&lt;br /&gt;
=== SSL et certificat auto-signé ===&lt;br /&gt;
&lt;br /&gt;
La plupart des marchands utilisant Polaris se servent d'un certificat auto-signé, souvent périmé.&lt;br /&gt;
&lt;br /&gt;
La vérification automatique de la négociation SSL échouera donc très souvent. C'est pourquoi, lors de l'utilisation des API, vous devez gérer la connexion et la validation manuelle de ces certificats, en proposant, par exemple, de fixer l'empreinte du certificat lors de la première connexion avec les identifiants et n'accepter de vous connecter qu'à ce certificat quand le jeu de mot de passe correspond est utilisé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Méthodes d'accès à l'API ===&lt;br /&gt;
&lt;br /&gt;
Toutes les fonctions exposées par l'API sont assimilées à des ressources HTTP traditionnelle, le nom de la fonction est donc le nom de la ressource ;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez déclencher la fonction en appelant la ressource soit :&lt;br /&gt;
* en méthode HTTP '''GET''', les paramètres sont transmis en ''queryString'' ; &lt;br /&gt;
* en méthode HTTP '''POST''', chaque paramètre est transmis soit dans la ''queryString'', soit dans le corps de la requête, au format ''application/x-www-form-urlencoded''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notons qu'il ne s'agit ni d'un webservice de type SOAP, ni d'un service de type REST, par conséquent, les méthodes HTTP PUT, DELETE, et HEAD ne sont pas supportées.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la requête suivante :&lt;br /&gt;
 GET /core/api/ACL.Login?user=test&amp;amp;password=testmdp&lt;br /&gt;
exécute la fonction ACL.Login, avec pour paramètres :&lt;br /&gt;
* '''user''' avec la valeur ''test'',&lt;br /&gt;
* '''password''' avec la valeur ''testmdp''.&lt;br /&gt;
{{Important|Les valeurs étant passées dans la queryString, il faut nécessairement qu'elles soient encodées au format URL, notamment si elle contiennent le séparateur de champs (&amp;amp;) : ainsi, la valeur «''test &amp;amp; autre''» devient «''test%20%26%20autre''»}}&lt;br /&gt;
&lt;br /&gt;
=== Gestion des réponses === &lt;br /&gt;
&lt;br /&gt;
A moins que le contraire ne soit clairement explicité dans leur documentation, comme par exemple l'API qui fourni les photos des produits, par défaut toutes les fonctions peuvent fournir leur réponses au format '''JSON''' ou '''XML''', au choix lors de l'interrogation.&lt;br /&gt;
C'est également valable pour les erreurs standardisées.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
  &amp;lt;ProcessInfo&amp;gt;&lt;br /&gt;
    &amp;lt;Id&amp;gt;15&amp;lt;/Id&amp;gt;&lt;br /&gt;
    &amp;lt;Name&amp;gt;ips&amp;lt;/Name&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerType&amp;gt;0&amp;lt;/OwnerType&amp;gt;&lt;br /&gt;
    &amp;lt;Owner/&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerName/&amp;gt;&lt;br /&gt;
    &amp;lt;Tasks&amp;gt;&lt;br /&gt;
      &amp;lt;ProcessInfoTask&amp;gt;&lt;br /&gt;
        &amp;lt;Date&amp;gt;2017-09-29T13:44:58.3608012Z&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;TaskName&amp;gt;Attente&amp;lt;/TaskName&amp;gt;&lt;br /&gt;
      &amp;lt;/ProcessInfoTask&amp;gt;&lt;br /&gt;
    &amp;lt;/Tasks&amp;gt;&lt;br /&gt;
  &amp;lt;/ProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=json&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;Id&amp;quot;:15,&lt;br /&gt;
   &amp;quot;Name&amp;quot;:&amp;quot;ips&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerType&amp;quot;:0,&lt;br /&gt;
   &amp;quot;Owner&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerName&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;RemoteEndPoint&amp;quot;:null,&lt;br /&gt;
   &amp;quot;Tasks&amp;quot;:[&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;Date&amp;quot;:&amp;quot;\/Date(1506692818379)\/&amp;quot;,&lt;br /&gt;
      &amp;quot;TaskName&amp;quot;:&amp;quot;Attente&amp;quot;,&lt;br /&gt;
      &amp;quot;Step&amp;quot;:null&lt;br /&gt;
     }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également préciser que vous souhaitez une réponse au format JSON en le précisant dans l'entête &amp;quot;Accept&amp;quot; de la requête HTTP plutôt que dans la ''queryString'' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Accept: application/json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des erreurs ===&lt;br /&gt;
&lt;br /&gt;
Il existe deux types d'erreurs, les standardisées, et les erreurs de transport.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas les erreurs sont propagées par le système de code d'état de la requête (les erreurs sont propagées par le système de code d'erreur traditionnel du protocole HTTP) :&lt;br /&gt;
* le code d'erreur '''200''' signifie que la fonction s'est éxécutée correctement,&lt;br /&gt;
* le code '''301''' et '''302''' désignent que la fonction a été déplacée,&lt;br /&gt;
* le code '''404''' désigne une fonction qui n'existe pas ou plus,&lt;br /&gt;
* les codes '''401''' et '''403''' désignent un manque de droits pour l'éxécution, &lt;br /&gt;
* et enfin le code '''500''' désigne une erreur standardisée, décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Tous les autres codes d'erreurs HTTP sont dépendants soit d'une erreur dans la formulation de la requête HTTP (code 4xx), soit d'une erreur ponctuelle non liée à la fonction (5xx).&lt;br /&gt;
&lt;br /&gt;
Lors d'une erreur 500, vous pouvez récupérer l'erreur standardisée qui retrace l'exception sur notre système et le problème via le corps de la réponse. Comme vu précédemment, en fonction de la requête (''Accept / QueryString &amp;amp;output=json''), cette erreur est décrite en XML ou en JSON.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/ACL.TraitmentCancel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;PHCAPIError&amp;gt;&lt;br /&gt;
  &amp;lt;Error&amp;gt;0&amp;lt;/Error&amp;gt;&lt;br /&gt;
  &amp;lt;StackTrace&amp;gt;&lt;br /&gt;
   à WebServiceCore.API.HttpComponentAPIManager.&amp;lt;&amp;gt;c__DisplayClass28_3.&amp;lt;__BuildResources&amp;gt;b__0(HttpResponse lnk) dans C:\Work\Polaris\dev\sources\WebServiceCore\WebServiceCore\API\HttpComponentAPIManager.cs:ligne 958&lt;br /&gt;
  &amp;lt;/StackTrace&amp;gt;&lt;br /&gt;
  &amp;lt;Message&amp;gt;paramètre 'traitmentName' manquant&amp;lt;/Message&amp;gt;&lt;br /&gt;
&amp;lt;/PHCAPIError&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion de l'identification et des droits d'accès ===&lt;br /&gt;
&lt;br /&gt;
L'identification est propagée par l'ouverture et la transmission d'un cookie qui contient un jeton de session.&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir utiliser correctement l'API, vous devez :&lt;br /&gt;
# appeler la fonction ''ACL.SSL'' pour vous voir redirigé sur un port sécurisé si ce n'est pas le cas ; à partir de ce point, toute la communication est protégée ;&lt;br /&gt;
# '''toujours propager les cookies de session reçus''' avec le client HTTP que vous utilisez pour forger et envoyer vos requêtes,&lt;br /&gt;
# ouvrir une session sur le système en utilisant la fonction de connexion ''ACL.Login'' au début de l'échange,&lt;br /&gt;
# fermer votre session en utilisant la fonction de connexion ''ACL.Logout'' à la fin de votre échange.&lt;br /&gt;
&lt;br /&gt;
Le jeton de session fourni est valable au moins 20 minutes entre chaque appel de fonctions.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
    /*&lt;br /&gt;
        Exemple de connexion à Polaris API&lt;br /&gt;
        Cet exemple montre comment se connecter aux webservice /core/api avec CURL&lt;br /&gt;
 &lt;br /&gt;
        Pour cet exemple, nous allons :&lt;br /&gt;
         * nous connecter au service&lt;br /&gt;
         * propager les cookies&lt;br /&gt;
         * lister les deux premières pages des produits du système&lt;br /&gt;
 &lt;br /&gt;
        ---&lt;br /&gt;
 &lt;br /&gt;
        Connection to Polaris API v1 example&lt;br /&gt;
        This example show how to connect with the Polaris /core/api webservice with CURL&lt;br /&gt;
 &lt;br /&gt;
        For this example, we will :&lt;br /&gt;
         * connect to the service&lt;br /&gt;
         * propagate cookies&lt;br /&gt;
         * list first 2 pages of products on the system&lt;br /&gt;
 &lt;br /&gt;
        (c) VEGA Informatique&lt;br /&gt;
    */    &lt;br /&gt;
 &lt;br /&gt;
    // La configuration de l'exemple est après l'implémentation de la classe&lt;br /&gt;
    //&lt;br /&gt;
    // Note : pour renforcer la sécurité, vous pouvez n'accepter qu'un certificat bien précis, peu importe qu'il soit valide ou non&lt;br /&gt;
    // cf. https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html&lt;br /&gt;
    // ---&lt;br /&gt;
    //&lt;br /&gt;
    // See example configuration below, after class implementation&lt;br /&gt;
    //&lt;br /&gt;
    // Note : to increase security, you can modify this example and do certificate pinning to refuse all valid certificate YOU don't trust&lt;br /&gt;
    // cf. https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html&lt;br /&gt;
    &lt;br /&gt;
    // ------------------------------------- CONFIGURATION ---------------------------------------&lt;br /&gt;
    class VegaExample {&lt;br /&gt;
        // URL et port du service, + identifiants&lt;br /&gt;
        // URL and port of service + user/pass&lt;br /&gt;
        private $polarisUrl;&lt;br /&gt;
        private $polarisUser;&lt;br /&gt;
        private $polarisPass;&lt;br /&gt;
    &lt;br /&gt;
        // Magasin de certificats autorisés&lt;br /&gt;
        // Self-signed store&lt;br /&gt;
        private $certSelfSignedStore = null;&lt;br /&gt;
        private $acceptCertificate = false;&lt;br /&gt;
        &lt;br /&gt;
        private $curlHandle = null;&lt;br /&gt;
 &lt;br /&gt;
        /*&lt;br /&gt;
            Déclare un nouvel exemple&lt;br /&gt;
                url : url du service, sans chemin&lt;br /&gt;
                user/pass&lt;br /&gt;
                selfSignedCert : vrai pour gérer les certificats auto-signés&lt;br /&gt;
                acceptCertificate : accepte le certificat présenté et sauvegarde de ce dernier dans le magasin de certificats&lt;br /&gt;
 &lt;br /&gt;
            New example&lt;br /&gt;
                url : URL of service, no path&lt;br /&gt;
                user/pass&lt;br /&gt;
                selfSignedCert : turn on to handle self-signed certificate managing&lt;br /&gt;
                acceptCertificate : accept all new certificate (Keep at false, except to register self-signed certificate)&lt;br /&gt;
        */&lt;br /&gt;
        function __construct($url, $user, $pass, $selfSignedCert = true, $acceptCertificate = false)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;polarisUrl = $url;&lt;br /&gt;
            $this-&amp;gt;polarisUser = $user;&lt;br /&gt;
            $this-&amp;gt;polarisPass = $pass;   &lt;br /&gt;
            $this-&amp;gt;certSelfSignedStore = $selfSignedCert ? getcwd() . &amp;quot;/server.ca&amp;quot; : null; &lt;br /&gt;
            $this-&amp;gt;acceptCertificate = $acceptCertificate;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /*&lt;br /&gt;
            Identification&lt;br /&gt;
            Authentication&lt;br /&gt;
        */&lt;br /&gt;
        function auth()&lt;br /&gt;
        {            &lt;br /&gt;
            $ch = curl_init();&lt;br /&gt;
 &lt;br /&gt;
            // common options&lt;br /&gt;
            curl_setopt_array($ch, [&lt;br /&gt;
                                CURLOPT_CUSTOMREQUEST =&amp;gt; &amp;quot;GET&amp;quot;,&lt;br /&gt;
                                CURLOPT_HEADER =&amp;gt; 0,&lt;br /&gt;
                                CURLOPT_USERAGENT =&amp;gt; &amp;quot;Example/1.0&amp;quot;,            &lt;br /&gt;
                                CURLOPT_FRESH_CONNECT =&amp;gt; 0, &lt;br /&gt;
                                CURLOPT_FORBID_REUSE =&amp;gt; 0,&lt;br /&gt;
                                CURLOPT_RETURNTRANSFER =&amp;gt; 1, &lt;br /&gt;
                                CURLOPT_CERTINFO =&amp;gt; 0,&lt;br /&gt;
                                CURLOPT_FOLLOWLOCATION =&amp;gt; 1,&lt;br /&gt;
                                //CURLOPT_TCP_NODELAY = 1,&lt;br /&gt;
                                //CURLOPT_SSL_VERIFYSTATUS =&amp;gt; 1,&lt;br /&gt;
                                CURLOPT_SSL_VERIFYPEER =&amp;gt; 1,&lt;br /&gt;
                                CURLOPT_HTTP_VERSION =&amp;gt; CURL_HTTP_VERSION_1_1                                &lt;br /&gt;
                            ]);&lt;br /&gt;
            &lt;br /&gt;
            /*&lt;br /&gt;
                STEP 1 : &lt;br /&gt;
                    Redirection SSL si nécessaire&lt;br /&gt;
                    Get redirected to SSL if necessary&lt;br /&gt;
                --------&lt;br /&gt;
            */&lt;br /&gt;
            if (substr($this-&amp;gt;polarisUrl, 0, 5) === &amp;quot;http:&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                curl_setopt($ch, CURLOPT_URL, $this-&amp;gt;polarisUrl . &amp;quot;/core/api/ACL.SSL?onlyGetAddress=true&amp;quot;);&lt;br /&gt;
                &lt;br /&gt;
                // Execute&lt;br /&gt;
                if( ! $result = curl_exec($ch))&lt;br /&gt;
                    trigger_error(curl_error($ch));&lt;br /&gt;
                if (curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200)&lt;br /&gt;
                    throw new \Exception(&amp;quot;Error while getting SSL redirection URL !&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                // A ce stade, $result contient une URL vers la version sécurisée du service, nous pouvons remplacer notre URL par celle-ci&lt;br /&gt;
                // On this step, $result contains the fully secured URL. &lt;br /&gt;
                // we can replace our own URL &lt;br /&gt;
                // Ex. : http://pl-vega-0001.vega-net.net:3600/core/api/ACL.SSL -&amp;gt; https://pl-vega-0001.vega-net.net:4043/core/api/ACL.SSL        &lt;br /&gt;
                $this-&amp;gt;polarisUrl = substr($result, 0, strlen($result) - strlen(&amp;quot;/core/api/ACL.SSL&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
                // Ok, le prochain appel sera donc fait quoiqu'il arrive en SSL&lt;br /&gt;
                // Ok, next call will be done on SSL ...&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            /*&lt;br /&gt;
                STEP 2 : &lt;br /&gt;
                    Si nous utilisons les certificats auto-signé, peut-être avons nous à le télécharger&lt;br /&gt;
                    If using self-signed cert, check if we need to download it ...&lt;br /&gt;
                --------&lt;br /&gt;
            */&lt;br /&gt;
            if ($this-&amp;gt;certSelfSignedStore)&lt;br /&gt;
            {&lt;br /&gt;
                if (!file_exists($this-&amp;gt;certSelfSignedStore))&lt;br /&gt;
                {&lt;br /&gt;
                    // Obtenir le certificat&lt;br /&gt;
                    // Get certificate&lt;br /&gt;
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);&lt;br /&gt;
                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);&lt;br /&gt;
                    curl_setopt($ch, CURLOPT_CERTINFO, 1);&lt;br /&gt;
                    &lt;br /&gt;
                    // on appel n'importe quelle API qui ne nécessite pas d'identification&lt;br /&gt;
                    // so calling any endpoint, let's try ACL.WhoAmI&lt;br /&gt;
                    curl_setopt($ch, CURLOPT_URL, $this-&amp;gt;polarisUrl . &amp;quot;/core/api/ACL.WhoAmI&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                    $result = curl_exec($ch);            &lt;br /&gt;
                    if (curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200)&lt;br /&gt;
                        throw new \Exception(&amp;quot;Error while certificate downloading !&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                    $certs = curl_getinfo($ch, CURLINFO_CERTINFO);&lt;br /&gt;
                    if (!$certs)&lt;br /&gt;
                        throw new \Exception(&amp;quot;No certificate found&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                    if ($this-&amp;gt;acceptCertificate)&lt;br /&gt;
                    {&lt;br /&gt;
                        // On sauve le certificat dans le magasin&lt;br /&gt;
                        // Saving certificate in CA file&lt;br /&gt;
                        $certData = &amp;quot;&amp;quot;;&lt;br /&gt;
                        foreach ($certs as $certificate)&lt;br /&gt;
                            $certData .= $certificate[&amp;quot;Cert&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
                        if (!file_put_contents($this-&amp;gt;certSelfSignedStore, $certData))&lt;br /&gt;
                            throw new \Exception(sprintf(&amp;quot;can't create %s&amp;quot;, $this-&amp;gt;certSelfSignedStore));&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        // On affiche seulement son empreinte&lt;br /&gt;
                        // only display cert finger print&lt;br /&gt;
                        $msg = &amp;quot;Unknown self-signed certificat chain with fingerprints : \n&amp;quot;;&lt;br /&gt;
                        foreach ($certs as $certificate)&lt;br /&gt;
                            $msg .= openssl_x509_fingerprint($certificate[&amp;quot;Cert&amp;quot;], &amp;quot;sha256&amp;quot;) .&amp;quot;\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                        $msg .= &amp;quot;\n&amp;quot;;&lt;br /&gt;
                        $msg .= &amp;quot;To trust it, rerun once with 'acceptCertificate' to true&amp;quot;;&lt;br /&gt;
                        throw new \Exception($msg);&lt;br /&gt;
                    }&lt;br /&gt;
 &lt;br /&gt;
                    curl_setopt($ch, CURLOPT_CERTINFO, 0);&lt;br /&gt;
                }&lt;br /&gt;
 &lt;br /&gt;
                // Initialisation du magasin / Setup&lt;br /&gt;
                curl_setopt($ch, CURLOPT_CAINFO, $this-&amp;gt;certSelfSignedStore);&lt;br /&gt;
                // Nous faisons confiance à ce certificat&lt;br /&gt;
                // We are trusting this certificate, so &lt;br /&gt;
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);&lt;br /&gt;
                // Il peut avoir été émis avec un nom différent, peu importe&lt;br /&gt;
                // It can be emitted for a different name, no matter&lt;br /&gt;
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);&lt;br /&gt;
                // Il peut être révoqué, peu importe&lt;br /&gt;
                // It can be revoked, no matter&lt;br /&gt;
                curl_setopt($ch, CURLOPT_SSL_VERIFYSTATUS, 0);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                // Initialisation SSL : ici, nous n'acceptons que les certificats valides&lt;br /&gt;
                // Setup : we are not trusting self-certificate, so it must check all security steps&lt;br /&gt;
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);&lt;br /&gt;
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);&lt;br /&gt;
                curl_setopt($ch, CURLOPT_SSL_VERIFYSTATUS, 1);&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            /*&lt;br /&gt;
                STEP 3 : &lt;br /&gt;
                    Connexion&lt;br /&gt;
                    Login&lt;br /&gt;
                --------&lt;br /&gt;
            */&lt;br /&gt;
            // Prise en charge des cookies / Manage cookies&lt;br /&gt;
            curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd(). &amp;quot;/session.cookie&amp;quot;);&lt;br /&gt;
            curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd(). &amp;quot;/session.cookie&amp;quot;);&lt;br /&gt;
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;GET&amp;quot;);&lt;br /&gt;
            curl_setopt($ch, CURLOPT_URL, $this-&amp;gt;polarisUrl . sprintf(&amp;quot;/core/api/ACL.Login?user=%s&amp;amp;password=%s&amp;quot;, &lt;br /&gt;
                                        urlencode($this-&amp;gt;polarisUser), &lt;br /&gt;
                                        urlencode($this-&amp;gt;polarisPass)));&lt;br /&gt;
 &lt;br /&gt;
            if( ! $result = @curl_exec($ch))&lt;br /&gt;
                trigger_error(curl_error($ch));&lt;br /&gt;
            &lt;br /&gt;
            if (curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200)&lt;br /&gt;
                throw new \Exception(&amp;quot;Error on login !&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            $this-&amp;gt;curlHandle = $ch;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /*&lt;br /&gt;
            Déconnexion et libération de ressources sur le serveur&lt;br /&gt;
            Logout and free resource on server&lt;br /&gt;
        */&lt;br /&gt;
        function logout()&lt;br /&gt;
        {&lt;br /&gt;
            $ch = $this-&amp;gt;curlHandle;&lt;br /&gt;
            if (!$ch)&lt;br /&gt;
                return; // déjà déconnecté / already logued out !&lt;br /&gt;
            &lt;br /&gt;
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;GET&amp;quot;);&lt;br /&gt;
            curl_setopt($ch, CURLOPT_URL, $this-&amp;gt;polarisUrl . &amp;quot;/core/api/ACL.Logout&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            $result = curl_exec($ch);&lt;br /&gt;
            curl_close($ch);&lt;br /&gt;
 &lt;br /&gt;
            $this-&amp;gt;curlHandle = null;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /*&lt;br /&gt;
            Obtenir la liste des produits&lt;br /&gt;
            Get product list&lt;br /&gt;
        */&lt;br /&gt;
        function getProductList($page = 1, $pageSize = 100)&lt;br /&gt;
        {&lt;br /&gt;
            $ch = $this-&amp;gt;curlHandle;&lt;br /&gt;
            if (!$ch)&lt;br /&gt;
                throw new \Exception(&amp;quot;not connected!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;GET&amp;quot;);&lt;br /&gt;
            curl_setopt($ch, CURLOPT_URL, $this-&amp;gt;polarisUrl . sprintf(&amp;quot;/core/api/Catalog.SearchProducts?output=json&amp;amp;pageSize=%d&amp;amp;pageNo=%d&amp;quot;, $pageSize, $page));&lt;br /&gt;
            if( ! $result = curl_exec($ch))&lt;br /&gt;
                trigger_error(curl_error($ch));&lt;br /&gt;
            if (curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200)&lt;br /&gt;
                throw new \Exception(&amp;quot;Error on getting products !&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            $data = json_decode($result);&lt;br /&gt;
            return $data-&amp;gt;Items;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /*        &lt;br /&gt;
            Qui suis-je ?&lt;br /&gt;
            Who am I ?&lt;br /&gt;
        */&lt;br /&gt;
        function getWhoAmI()&lt;br /&gt;
        {&lt;br /&gt;
            $ch = $this-&amp;gt;curlHandle;            &lt;br /&gt;
            if (!$ch)&lt;br /&gt;
                throw new \Exception(&amp;quot;not connected!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;GET&amp;quot;);&lt;br /&gt;
            curl_setopt($ch, CURLOPT_URL, $this-&amp;gt;polarisUrl . &amp;quot;/core/api/ACL.WhoAmI&amp;quot;);&lt;br /&gt;
            if( ! $result = curl_exec($ch))&lt;br /&gt;
                trigger_error(curl_error($ch));&lt;br /&gt;
            if (curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200)&lt;br /&gt;
                throw new \Exception(&amp;quot;Error on getting identity !&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            return $result;            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
        EXAMPLE&lt;br /&gt;
    */&lt;br /&gt;
 &lt;br /&gt;
    // La première fois, passez à vrai pour accepter le certificat autosigné, ensuite, remettez à faux&lt;br /&gt;
    // Only the first time, turn on accept the unknown self-signed certificate&lt;br /&gt;
    // Then, turn off to not accept others one&lt;br /&gt;
    $acceptCertificate = false;&lt;br /&gt;
 &lt;br /&gt;
    $example = new VegaExample(&amp;quot;https://82.64.49.122:13443&amp;quot;, &lt;br /&gt;
                                &amp;quot;webapi&amp;quot;, &lt;br /&gt;
                                &amp;quot;***&amp;quot;, &lt;br /&gt;
                                true, &lt;br /&gt;
                                $acceptCertificate,&lt;br /&gt;
                            );&lt;br /&gt;
    $example-&amp;gt;auth();&lt;br /&gt;
    &lt;br /&gt;
    // Qui suis-je ?&lt;br /&gt;
    // Display who am i ...&lt;br /&gt;
    var_dump($example-&amp;gt;getWhoAmI());&lt;br /&gt;
    &lt;br /&gt;
    // Tirons les 200 premiers produits&lt;br /&gt;
    // Pull first 200 products ...&lt;br /&gt;
    $idx = 1;&lt;br /&gt;
    echo &amp;quot;+-------+---------------------------+-----------+\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;|   idx |              product code | min price |\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;+-------+---------------------------+-----------+\n&amp;quot;;&lt;br /&gt;
    for ($page = 1; $page &amp;lt;= 2; $page++)&lt;br /&gt;
    {        &lt;br /&gt;
        foreach ($example-&amp;gt;getProductList($page, 100) as $product)&lt;br /&gt;
            echo sprintf(&amp;quot;| %5d | %25s | %8.2f€ |&amp;quot;, $idx++, strtoupper($product-&amp;gt;Code), $product-&amp;gt;PriceTTC).&amp;quot;\n&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
    echo &amp;quot;+-------+---------------------------+-----------+\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    $example-&amp;gt;logout();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Liste des fonctions accessibles == &lt;br /&gt;
&lt;br /&gt;
La liste des fonctions accessibles est disponible ici : [[:Catégorie:Webservice API|pages relatives au Webservice]].&lt;br /&gt;
{{DebutInfoCartographeCustom|1}}&lt;br /&gt;
{{FinInfoCartographeCustom|1}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Webservice API|*]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21632</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21632"/>
		<updated>2019-12-05T10:59:10Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
==== Déroulé de la phase de vérification du certificat ====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;br /&gt;
&lt;br /&gt;
== Utilisation pratique ==&lt;br /&gt;
&lt;br /&gt;
=== Validation du certificat ===&lt;br /&gt;
&lt;br /&gt;
Que le certificat du service soit auto-signé ou bien respecte la validation, '''vous devez le valider avec notre procédure''' pour éviter tout risque de vol de certificat (voir ci-dessus).&lt;br /&gt;
&lt;br /&gt;
'''Avant d'envoyer vos identifiants comme stipulé ci-dessous''', vous devez vérifier que l'empreinte du certificat présenté par le service correspond à celle qu'il signe avec la clé partagée. Une fois validé, vous ne devez valider que le dit certificat, pour le reste de la session (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Pour se faire, appelez l'URL ''https://[service]:[port]/api/Core/App/SharedKeyProof?guid=[uid]''&lt;br /&gt;
La méthode renverra l'empreinte du certificat signée avec la clé partagée fournie, au format HMAC-SHA256.&lt;br /&gt;
&lt;br /&gt;
Effectuez l'opération de signature avec l'empreinte du certificat présenté par la liaison TLS. S'il s'agit de la même, c'est que le certificat présenté est correct. Vous pouvez dès à présent mettre le ''spinning'' en place sur ce certificat.&lt;br /&gt;
&lt;br /&gt;
=== Identification ===&lt;br /&gt;
Lors de l'association d'un système tiers à Polaris, un UID, un secret et une clé partagée sont émises.&lt;br /&gt;
Chaque requête HTTP doit être identifiée par l'émission de l'UID et du secret dans un ''header HTTP'' nommé '''X-API-Key'''.&lt;br /&gt;
&lt;br /&gt;
Concatenez l'uid et le secret, séparés par le caractère '''/''' (uid/secret) dans l'entête HTTP '''X-API-Key'''.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21601</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21601"/>
		<updated>2019-12-02T16:41:58Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
==== Déroulé de la phase de vérification du certificat ====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;br /&gt;
&lt;br /&gt;
== Utilisation pratique ==&lt;br /&gt;
&lt;br /&gt;
=== Validation du certificat ===&lt;br /&gt;
&lt;br /&gt;
Que le certificat du service soit auto-signé ou bien respecte la validation, '''vous devez le valider avec notre procédure''' pour éviter tout risque de vol de certificat (voir ci-dessus).&lt;br /&gt;
&lt;br /&gt;
'''Avant d'envoyer vos identifiants comme stipulé ci-dessous''', vous devez vérifier que l'empreinte du certificat présenté par le service correspond à celle qu'il signe avec la clé partagée. Une fois validé, vous ne devez valider que le dit certificat, pour le reste de la session (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Pour se faire, appelez l'URL ''https://[service]:[port]/api/Core/App/SharedKeyProof?guid=[uid]''&lt;br /&gt;
La méthode renverra l'empreinte du certificat signée avec la clé partagée fournie, au format HMAC-SHA256.&lt;br /&gt;
&lt;br /&gt;
Effectuez l'opération de signature avec l'empreinte du certificat présenté par la liaison TLS. S'il s'agit de la même, c'est que le certificat présenté est correct. Vous pouvez dès à présent mettre le ''spinning'' en place sur ce certificat.&lt;br /&gt;
&lt;br /&gt;
=== Identification ===&lt;br /&gt;
Lors de l'association d'un système tiers à Polaris, un UID, un secret et une clé partagée sont émises.&lt;br /&gt;
Chaque requête HTTP doit être identifiée par l'émission de l'UID et du secret dans un ''header HTTP''.&lt;br /&gt;
&lt;br /&gt;
Concatenez l'uid et le secret, séparé par le caractère '''/''' (uid/secret) dans l'entête HTTP '''X-API-Key'''.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21600</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21600"/>
		<updated>2019-12-02T16:41:43Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api/''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
==== Déroulé de la phase de vérification du certificat ====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;br /&gt;
&lt;br /&gt;
== Utilisation pratique ==&lt;br /&gt;
&lt;br /&gt;
=== Validation du certificat ===&lt;br /&gt;
&lt;br /&gt;
Que le certificat du service soit auto-signé ou bien respecte la validation, '''vous devez le valider avec notre procédure''' pour éviter tout risque de vol de certificat (voir ci-dessus).&lt;br /&gt;
&lt;br /&gt;
'''Avant d'envoyer vos identifiants comme stipulé ci-dessous''', vous devez vérifier que l'empreinte du certificat présenté par le service correspond à celle qu'il signe avec la clé partagée. Une fois validé, vous ne devez valider que le dit certificat, pour le reste de la session (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Pour se faire, appelez l'URL ''https://[service]:[port]/api/Core/App/SharedKeyProof?guid=[uid]''&lt;br /&gt;
La méthode renverra l'empreinte du certificat signée avec la clé partagée fournie, au format HMAC-SHA256.&lt;br /&gt;
&lt;br /&gt;
Effectuez l'opération de signature avec l'empreinte du certificat présenté par la liaison TLS. S'il s'agit de la même, c'est que le certificat présenté est correct. Vous pouvez dès à présent mettre le ''spinning'' en place sur ce certificat.&lt;br /&gt;
&lt;br /&gt;
=== Identification ===&lt;br /&gt;
Lors de l'association d'un système tiers à Polaris, un UID, un secret et une clé partagée sont émises.&lt;br /&gt;
Chaque requête HTTP doit être identifiée par l'émission de l'UID et du secret dans un ''header HTTP''.&lt;br /&gt;
&lt;br /&gt;
Concatenez l'uid et le secret, séparé par le caractère '''/''' (uid/secret) dans l'entête HTTP '''X-API-Key'''.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21599</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21599"/>
		<updated>2019-12-02T16:31:51Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api/''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
==== Déroulé de la phase de vérification du certificat ====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;br /&gt;
&lt;br /&gt;
== Utilisation pratique ==&lt;br /&gt;
&lt;br /&gt;
=== Validation du certificat ===&lt;br /&gt;
&lt;br /&gt;
Que le certificat du service soit auto-signé ou bien respecte la validation, '''vous devez le valider avec notre procédure''' pour éviter tout risque de vol de certificat (voir ci-dessus).&lt;br /&gt;
&lt;br /&gt;
'''Avant d'envoyer vos identifiants comme stipulé ci-dessous''', vous devez vérifier que l'empreinte du certificat présenté par le service correspond à celle qu'il signe avec la clé partagée. Une fois validé, vous ne devez valider que le dit certificat, pour le reste de la session (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Identification ===&lt;br /&gt;
Lors de l'association d'un système tiers à Polaris, un UID, un secret et une clé partagée sont émises.&lt;br /&gt;
Chaque requête HTTP doit être identifiée par l'émission de l'UID et du secret dans un ''header HTTP''.&lt;br /&gt;
&lt;br /&gt;
Concatenez l'uid et le secret, séparé par le caractère '''/''' (uid/secret) dans l'entête HTTP '''X-API-Key'''.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21598</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21598"/>
		<updated>2019-12-02T15:51:13Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api/''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
==== Déroulé de la phase de vérification du certificat ====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;br /&gt;
&lt;br /&gt;
== Utilisation pratique ==&lt;br /&gt;
&lt;br /&gt;
=== Validation du certificat ===&lt;br /&gt;
&lt;br /&gt;
Que le certificat du service soit auto-signé ou bien respecte la validation, '''vous devez le valider avec notre procédure''' pour éviter tout risque de vol de certificat (voir ci-dessus).&lt;br /&gt;
&lt;br /&gt;
'''Avant d'envoyer vos identifiants comme stipulé ci-dessous''', vous devez vérifier que l'empreinte du certificat présenté par le service correspond à celle qu'il signe avec la clé partagée. Une fois validé, vous ne devez valider que le dit certificat, pour le reste de la session ('''certificate pinning''').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Identification ===&lt;br /&gt;
Lors de l'association d'un système tiers à Polaris, un UID, un secret et une clé partagée sont émises.&lt;br /&gt;
Chaque requête HTTP doit être identifiée par l'émission de l'UID et du secret dans un ''header HTTP''.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21597</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21597"/>
		<updated>2019-12-02T15:19:53Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api/''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
==== Déroulé de la phase de vérification du certificat ====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;br /&gt;
&lt;br /&gt;
== Utilisation pratique ==&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21596</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21596"/>
		<updated>2019-12-02T15:10:17Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api/''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
==== Déroulé de la phase de vérification du certificat ====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Détail de l'implémentation====&lt;br /&gt;
&amp;lt;&amp;lt; todo &amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Fichier:Attaque_par_MITM.png&amp;diff=21595</id>
		<title>Fichier:Attaque par MITM.png</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Fichier:Attaque_par_MITM.png&amp;diff=21595"/>
		<updated>2019-12-02T15:08:30Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21594</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21594"/>
		<updated>2019-12-02T15:07:55Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api/''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
===='''Déroulé de la phase de vérification du certificat'''====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Détail de l'implémentation====&lt;br /&gt;
&amp;lt;&amp;lt; todo &amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21593</id>
		<title>NF16618 — API ⇒ sécurisation du système de connexion pour se protéger des attaques de type ⇒ XSS CSRF</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF16618_%E2%80%94_API_%E2%87%92_s%C3%A9curisation_du_syst%C3%A8me_de_connexion_pour_se_prot%C3%A9ger_des_attaques_de_type_%E2%87%92_XSS_CSRF&amp;diff=21593"/>
		<updated>2019-12-02T15:06:16Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:16618}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF16618|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
Pour protéger les API des problèmes standard de sécurité, nous avons choisi de mettre en place un système à '''secret échangé sur liaison TLS avec validation optionnelle du certificat par clé partagée AES256'''.&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, quatre informations sont impliquées dans l'identification d'un client pour nos API : &lt;br /&gt;
&lt;br /&gt;
*un '''identifiant unique''' (appelé dans le reste de la documentation UID ou GUID)&lt;br /&gt;
*un '''secret''' (aka. l'équivalent d'un mot de passe très fort) ;&lt;br /&gt;
*une '''clé AES partagée''' ;&lt;br /&gt;
*'''l'empreinte du certificat du service''' ;&lt;br /&gt;
&lt;br /&gt;
Ce document décrit le choix du système d'identification des API ainsi que les modalités d'installation, d'implémentation, et d'utilisation.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter le travail des intégrateurs, il existe :&lt;br /&gt;
&lt;br /&gt;
*une '''documentation à jour''' pour la version du Polaris auquel vous vous connectez, disponible sur ''https://[service:client]:[port]/api/''&lt;br /&gt;
*le documentation est au format OpenApi permettant de générer les clients plus facilement.&lt;br /&gt;
&lt;br /&gt;
==Système à clé d'API (ou secret)==&lt;br /&gt;
Beaucoup de systèmes utilisent un système de secret ou de clé d'API.&lt;br /&gt;
&lt;br /&gt;
Le système est simple et efficace : à chaque requête, le client utilise son identifiant et son secret pour prouver son identité au service qui accepte le travail s'il trouve une correspondance dans sa base d'utilisateurs.&lt;br /&gt;
&lt;br /&gt;
La preuve de l'identité se fait donc à chaque requête, par la communication d'un ''secret''.&lt;br /&gt;
&lt;br /&gt;
Mais ce système a une faiblesse : il est nécessaire pour le client d'identifier à coup sûr le service auquel il se connecte afin de ne pas envoyer ses informations de connexion à n'importe qui.&lt;br /&gt;
&lt;br /&gt;
Explication : si un tiers venait à usurper l'identité du service, le client lui renverrait son secret sans se méfier (''phishing''). Le tiers pourra par la suite et à loisir utiliser cet accès sans que son véritable propriétaire en ait connaissance.&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce cas de figure, il est nécessaire d'établir la connexion sur une liaison TLS, protégée par un '''certificat X509 possédé par le service et reconnu expressément par le client'''.&lt;br /&gt;
&lt;br /&gt;
'''Le fait que le certificat soit valide ne suffit pas,''' car de nombreuses autorités de confiance reconnues présentent des lacunes importantes dans le processus de validation du domaine (DCV) et peuvent délivrer par erreur à des adversaires des certificats (''MITM attacks that use valid CA-issued certificates''). &lt;br /&gt;
&lt;br /&gt;
Muni de son certificat qui valide TLS, l'adversaire peut réaliser une attaque très simple par détournement de trafic pour récupérer la clé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Fichier:Attaque par MITM.png|centré|sans_cadre|622x622px|Attaque par MITM]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter ce cas dit de ''misissuance'' (i.e. une autorité de certification peu soigneuse tierce délivre par erreur à un adversaire un certificat valide pour le service) '''au moins une des trois techniques suivantes doit être impérativement mise en place'''.&lt;br /&gt;
&lt;br /&gt;
===Par restriction de certificat===&lt;br /&gt;
L'idée générale est de mémoriser la clé partagée et l'empreinte du certificat du service à l'installation du client. &lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera que le certificat est valide, mais également que son empreinte correspond bien à celle mémorisée. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
C'est la méthode la plus simple et la plus efficace, mais également la plus contraignante car il est nécessaire de reconfirmer la clé partagée à chaque changement de certificat (tous les 3 mois pour Let's Encrypt, tous les ans pour Comodo). Tout certificat à clés suffisamment dimensionnées peut alors convenir.&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
===Par restriction d'autorité de certification===&lt;br /&gt;
L'idée générale ici est de mémoriser quelles sont les autorités de certification autorisées par le service à l'installation du client.&lt;br /&gt;
&lt;br /&gt;
A la connexion, on vérifiera :&lt;br /&gt;
&lt;br /&gt;
*que le certificat présenté par le service est valide&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*qu'il n'a pas été révoqué par l'autorité qui l'a émit&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;;&lt;br /&gt;
*mais également qu'une des autorités mémorisées est bien présente dans la chaîne de validation du certificat. Si c'est le cas, alors on peut envoyer la clé partagée en toute sécurité.&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne car le service n'accepte de travailler qu'avec les autorités de confiance : &lt;br /&gt;
&lt;br /&gt;
*qui pratiquent le Multipath DCV (cf. https://blog.cloudflare.com/secure-certificate-issuance/) rendant difficile le ''hijacking'' lors du DCV ;&lt;br /&gt;
*qui utilisent le mécanisme de CT Logs (cf. http://www.certificate-transparency.org/what-is-ct) permettant un contrôle après coup ;&lt;br /&gt;
&lt;br /&gt;
'''Tout intégrateur est libre de la mettre en place à sa convenance mais nous n'assurons pas de support sur l'implémentation de la restriction.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; cette opération est nativement prise en charge par votre OS et tous les clients HTTP''&lt;br /&gt;
&lt;br /&gt;
''le contrôle de révocation CRL ou OCSP est souvent pris en charge de manière optionnelle, il convient de vérifier et d'activer la bonne option correspondant à votre bibliothèque.''&lt;br /&gt;
&lt;br /&gt;
===Vérifier le certificat par défi à l'aide d'une clé partagée===&lt;br /&gt;
'''C'est le niveau de sécurité optimal et c'est celui que nous avons choisi.'''&lt;br /&gt;
&lt;br /&gt;
L'idée ici est de vérifier que le tiers nous présente bien un certificat qui correspond à celui que le service est censé utiliser et une fois vérifié, n'accepter les liaisons TLS que sur ce certificat (''certificate pinning'').&lt;br /&gt;
&lt;br /&gt;
Rappelons nous que nous sommes dans le cadre d'une liaison TLS, ainsi, si interception il y a lieu, c'est forcement que l'adversaire est en possession d'un certificat valide du même nom que le service auquel nous nous connectons.&lt;br /&gt;
&lt;br /&gt;
Puisque nous partageons normalement une clé secrète avec le serveur, nous allons nous en servir pour que ce dernier signe le certificat qu'il est censé utiliser. Ainsi, si un adversaire s'est placé entre les deux (attaque MiTM), il disposera d'un certificat valide, certes, mais pas de la clé partagée, il sera incapable de signer correctement son certificat et s'il laisse passer le trafic venant du service réel (hijack), le client constatera que le service a signé un autre certificat que celui sur lequel est établi sa liaison TLS.&lt;br /&gt;
&lt;br /&gt;
'''Cette vérification est optionnelle et n'a besoin d'être effectuée que dans le cas où le certificat présenté par le serveur serait inconnu (à chaque fois qu'il change).'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[SCHEMA à revoir : obsolète]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Fichier:ApiAuthDKID(1).png|centré|sans_cadre|761x761px|Description de la méthode de certificat par défi]]&lt;br /&gt;
&lt;br /&gt;
===='''Déroulé de la phase de vérification du certificat'''====&lt;br /&gt;
&lt;br /&gt;
#le client envoi une demande avec son identifiant (UID) ;&lt;br /&gt;
#le service reçoit la demande, recherche la clé partagée correspondant à UID et l'utilise pour signer l'empreinte de son certificat avec le protocole HMAC-SHA256 ; puis renvoi cette signature ;&lt;br /&gt;
#le client effectue la même opération avec l'empreinte du certificat auquel il est connecté. Si les signatures sont égales, alors il s'agit bien du certificat autorisé et la communication peut continuer normalement ; autrement, la liaison doit être terminée et l'incident signalé.&lt;br /&gt;
#par la suite, seul le certificat qui a été autorisé devrait être accepté, les autres devraient être systématique rejeté (''certificate pinning''). &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Détail de l'implémentation====&lt;br /&gt;
&amp;lt;&amp;lt; todo &amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Considérations de sécurité===&lt;br /&gt;
&lt;br /&gt;
====Pour le service====&lt;br /&gt;
''Note : les considérations de chiffrage de la clé ne sont pas implémentées pour le moment.''&lt;br /&gt;
&lt;br /&gt;
Comme les clés partagées sont stockées en base de données, celles-ci sont chiffrées avec une clé stockée sur un autre support de sorte qu'en cas de lecture indiscrète et non autorisée de la base de données, un adversaire ne puissent pas s'en emparer.&lt;br /&gt;
&lt;br /&gt;
Pour des raisons évidentes de sécurité, la clé de déchiffrement n'est pas sauvegardée ni stockée au même endroit que les sauvegardes.&lt;br /&gt;
&lt;br /&gt;
Le ''secret'' est stocké sous forme d'empreinte SHA256 (non déchiffrable).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toute la sécurité nécessaire doit être prise lors de la communication initiale de la clé partagée et du ''secret''. '''Si cet échange doit se faire par mail, alors il est plus que conseillé d'utiliser un envoi chiffré comme PGP.'''&lt;br /&gt;
====Pour le client====&lt;br /&gt;
Le client doit protéger la clé partagée et son ''secret'' par tout moyen possible. Si la clé et le secret sont stockés en base de données, ceux-ci devraient être chiffrés par une clé accessible sur un autre support que par le processus chargé de les utiliser de sorte qu'elle ne soit pas accessible à un adversaire arrivant à effectuer une lecture inappropriée de la base de données.&lt;br /&gt;
&lt;br /&gt;
====Échange des informations de connexion====&lt;br /&gt;
Afin de permettre aux tiers de se connecter en toute sécurité sur le système sans envoyer les informations de connexion par mail, un processus de jumelage a été mis en place :&lt;br /&gt;
&lt;br /&gt;
*l'administrateur ouvre un accès et déclenche une procédure d'association depuis Polaris ;&lt;br /&gt;
*un lien et un code PIN lui est fourni qu'il peut partager avec le fournisseur par mail ou téléphone ;&lt;br /&gt;
*le lien n'est valable qu'une seule fois et permet d'obtenir les informations de connexion sur une liaison sécurisée en échange du code PIN.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=20156</id>
		<title>NF13075 — Interface de programmation applicative par Webservice (API)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=20156"/>
		<updated>2019-05-22T07:33:54Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG77 → Autres outils]]{{DebutInfoCartographe}}{{#cartographie:13075}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP77_—_Autres_outils#NF13075|Autres outils]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&lt;br /&gt;
L'API par Webservice vous permet de piloter ou d'interroger votre solution de gestion depuis un programme externe : c'est par son intermédiaire que le prestataire tiers choisi va mettre en place l'interconnexion à votre backoffice. Cette documentation lui est donc principalement destinée.&lt;br /&gt;
&lt;br /&gt;
En effet, une ''interface de programmation applicative'' (désignée par le terme API pour ''Application Programming Interface'') est un ensemble normalisé de classes, de méthodes ou de fonctions qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels. &lt;br /&gt;
&lt;br /&gt;
Dans le cas de Polaris, elle est offerte par un service web, accessible sur chaque service de réplication.&lt;br /&gt;
{{FinChapeau}}&lt;br /&gt;
== Choix techniques ==&lt;br /&gt;
=== Pour commencer ===&lt;br /&gt;
&lt;br /&gt;
Notre API est bâtie sur l'exploitation d'un webservice, donc sur un échange HTTP pour lequel nous respectons le standard 1.1.&lt;br /&gt;
Elle est compatible notamment avec les échanges sécurisés (SSL).&lt;br /&gt;
&lt;br /&gt;
Pour échanger avec notre webservice, il faut donc le faire à travers un client HTTP traditionnel en manipulant des URI.&lt;br /&gt;
&lt;br /&gt;
L'API est ouverte et accessible sur l'URL suivante : https://''xx.xx.xx.xx'':''3443'''''/core/api/'''.&lt;br /&gt;
&lt;br /&gt;
=== SSL et certificat auto-signé ===&lt;br /&gt;
&lt;br /&gt;
La plupart des marchands utilisant Polaris se servent d'un certificat auto-signé, souvent périmé.&lt;br /&gt;
&lt;br /&gt;
La vérification automatique de la négociation SSL échouera donc très souvent. C'est pourquoi, lors de l'utilisation des API, vous devez gérer la connexion et la validation manuelle de ces certificats, en proposant, par exemple, de fixer l'empreinte du certificat lors de la première connexion avec les identifiants et n'accepter de vous connecter qu'à ce certificat quand le jeu de mot de passe correspond est utilisé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Méthodes d'accès à l'API ===&lt;br /&gt;
&lt;br /&gt;
Toutes les fonctions exposées par l'API sont assimilées à des ressources HTTP traditionnelle, le nom de la fonction est donc le nom de la ressource ;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez déclencher la fonction en appelant la ressource soit :&lt;br /&gt;
* en méthode HTTP '''GET''', les paramètres sont transmis en ''queryString'' ; &lt;br /&gt;
* en méthode HTTP '''POST''', chaque paramètre est transmis soit dans la ''queryString'', soit dans le corps de la requête, au format ''application/x-www-form-urlencoded''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notons qu'il ne s'agit ni d'un webservice de type SOAP, ni d'un service de type REST, par conséquent, les méthodes HTTP PUT, DELETE, et HEAD ne sont pas supportées.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la requête suivante :&lt;br /&gt;
 GET /core/api/ACL.Login?user=test&amp;amp;password=testmdp&lt;br /&gt;
exécute la fonction ACL.Login, avec pour paramètres :&lt;br /&gt;
* '''user''' avec la valeur ''test'',&lt;br /&gt;
* '''password''' avec la valeur ''testmdp''.&lt;br /&gt;
{{Important|Les valeurs étant passées dans la queryString, il faut nécessairement qu'elles soient encodées au format URL, notamment si elle contiennent le séparateur de champs (&amp;amp;) : ainsi, la valeur «''test &amp;amp; autre''» devient «''test%20%26%20autre''»}}&lt;br /&gt;
&lt;br /&gt;
=== Gestion des réponses === &lt;br /&gt;
&lt;br /&gt;
A moins que le contraire ne soit clairement explicité dans leur documentation, comme par exemple l'API qui fourni les photos des produits, par défaut toutes les fonctions peuvent fournir leur réponses au format '''JSON''' ou '''XML''', au choix lors de l'interrogation.&lt;br /&gt;
C'est également valable pour les erreurs standardisées.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
  &amp;lt;ProcessInfo&amp;gt;&lt;br /&gt;
    &amp;lt;Id&amp;gt;15&amp;lt;/Id&amp;gt;&lt;br /&gt;
    &amp;lt;Name&amp;gt;ips&amp;lt;/Name&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerType&amp;gt;0&amp;lt;/OwnerType&amp;gt;&lt;br /&gt;
    &amp;lt;Owner/&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerName/&amp;gt;&lt;br /&gt;
    &amp;lt;Tasks&amp;gt;&lt;br /&gt;
      &amp;lt;ProcessInfoTask&amp;gt;&lt;br /&gt;
        &amp;lt;Date&amp;gt;2017-09-29T13:44:58.3608012Z&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;TaskName&amp;gt;Attente&amp;lt;/TaskName&amp;gt;&lt;br /&gt;
      &amp;lt;/ProcessInfoTask&amp;gt;&lt;br /&gt;
    &amp;lt;/Tasks&amp;gt;&lt;br /&gt;
  &amp;lt;/ProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=json&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;Id&amp;quot;:15,&lt;br /&gt;
   &amp;quot;Name&amp;quot;:&amp;quot;ips&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerType&amp;quot;:0,&lt;br /&gt;
   &amp;quot;Owner&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerName&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;RemoteEndPoint&amp;quot;:null,&lt;br /&gt;
   &amp;quot;Tasks&amp;quot;:[&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;Date&amp;quot;:&amp;quot;\/Date(1506692818379)\/&amp;quot;,&lt;br /&gt;
      &amp;quot;TaskName&amp;quot;:&amp;quot;Attente&amp;quot;,&lt;br /&gt;
      &amp;quot;Step&amp;quot;:null&lt;br /&gt;
     }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également préciser que vous souhaitez une réponse au format JSON en le précisant dans l'entête &amp;quot;Accept&amp;quot; de la requête HTTP plutôt que dans la ''queryString'' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Accept: application/json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des erreurs ===&lt;br /&gt;
&lt;br /&gt;
Il existe deux types d'erreurs, les standardisées, et les erreurs de transport.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas les erreurs sont propagées par le système de code d'état de la requête (les erreurs sont propagées par le système de code d'erreur traditionnel du protocole HTTP) :&lt;br /&gt;
* le code d'erreur '''200''' signifie que la fonction s'est éxécutée correctement,&lt;br /&gt;
* le code '''301''' et '''302''' désignent que la fonction a été déplacée,&lt;br /&gt;
* le code '''404''' désigne une fonction qui n'existe pas ou plus,&lt;br /&gt;
* les codes '''401''' et '''403''' désignent un manque de droits pour l'éxécution, &lt;br /&gt;
* et enfin le code '''500''' désigne une erreur standardisée, décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Tous les autres codes d'erreurs HTTP sont dépendants soit d'une erreur dans la formulation de la requête HTTP (code 4xx), soit d'une erreur ponctuelle non liée à la fonction (5xx).&lt;br /&gt;
&lt;br /&gt;
Lors d'une erreur 500, vous pouvez récupérer l'erreur standardisée qui retrace l'exception sur notre système et le problème via le corps de la réponse. Comme vu précédemment, en fonction de la requête (''Accept / QueryString &amp;amp;output=json''), cette erreur est décrite en XML ou en JSON.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/ACL.TraitmentCancel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;PHCAPIError&amp;gt;&lt;br /&gt;
  &amp;lt;Error&amp;gt;0&amp;lt;/Error&amp;gt;&lt;br /&gt;
  &amp;lt;StackTrace&amp;gt;&lt;br /&gt;
   à WebServiceCore.API.HttpComponentAPIManager.&amp;lt;&amp;gt;c__DisplayClass28_3.&amp;lt;__BuildResources&amp;gt;b__0(HttpResponse lnk) dans C:\Work\Polaris\dev\sources\WebServiceCore\WebServiceCore\API\HttpComponentAPIManager.cs:ligne 958&lt;br /&gt;
  &amp;lt;/StackTrace&amp;gt;&lt;br /&gt;
  &amp;lt;Message&amp;gt;paramètre 'traitmentName' manquant&amp;lt;/Message&amp;gt;&lt;br /&gt;
&amp;lt;/PHCAPIError&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion de l'identification et des droits d'accès ===&lt;br /&gt;
&lt;br /&gt;
L'identification est propagée par l'ouverture et la transmission d'un cookie qui contient un jeton de session.&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir utiliser correctement l'API, vous devez :&lt;br /&gt;
# appeler la fonction ''ACL.SSL'' pour vous voir redirigé sur un port sécurisé si ce n'est pas le cas ; à partir de ce point, toute la communication est protégée ;&lt;br /&gt;
# '''toujours propager les cookies de session reçus''' avec le client HTTP que vous utilisez pour forger et envoyer vos requêtes,&lt;br /&gt;
# ouvrir une session sur le système en utilisant la fonction de connexion ''ACL.Login'' au début de l'échange,&lt;br /&gt;
# fermer votre session en utilisant la fonction de connexion ''ACL.Logout'' à la fin de votre échange.&lt;br /&gt;
&lt;br /&gt;
Le jeton de session fourni est valable au moins 20 minutes entre chaque appel de fonctions.&lt;br /&gt;
&lt;br /&gt;
== Liste des fonctions accessibles == &lt;br /&gt;
&lt;br /&gt;
La liste des fonctions accessibles est disponible ici : [[:Catégorie:Webservice API|pages relatives au Webservice]].&lt;br /&gt;
{{DebutInfoCartographeCustom|1}}&lt;br /&gt;
{{FinInfoCartographeCustom|1}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Webservice API|*]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=20155</id>
		<title>NF13075 — Interface de programmation applicative par Webservice (API)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=20155"/>
		<updated>2019-05-22T07:33:23Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG77 → Autres outils]]{{DebutInfoCartographe}}{{#cartographie:13075}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP77_—_Autres_outils#NF13075|Autres outils]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&lt;br /&gt;
L'API par Webservice vous permet de piloter ou d'interroger votre solution de gestion depuis un programme externe : c'est par son intermédiaire que le prestataire tiers choisi va mettre en place l'interconnexion à votre backoffice. Cette documentation lui est donc principalement destinée.&lt;br /&gt;
&lt;br /&gt;
En effet, une ''interface de programmation applicative'' (désignée par le terme API pour ''Application Programming Interface'') est un ensemble normalisé de classes, de méthodes ou de fonctions qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels. &lt;br /&gt;
&lt;br /&gt;
Dans le cas de Polaris, elle est offerte par un service web, accessible sur chaque service de réplication.&lt;br /&gt;
{{FinChapeau}}&lt;br /&gt;
== Choix techniques ==&lt;br /&gt;
=== Pour commencer ===&lt;br /&gt;
&lt;br /&gt;
Notre API est bâtie sur l'exploitation d'un webservice, donc sur un échange HTTP pour lequel nous respectons le standard 1.1.&lt;br /&gt;
Elle est compatible notamment avec les échanges sécurisés (SSL).&lt;br /&gt;
&lt;br /&gt;
Pour échanger avec notre webservice, il faut donc le faire à travers un client HTTP traditionnel en manipulant des URI.&lt;br /&gt;
&lt;br /&gt;
L'API est ouverte et accessible sur l'URL suivante : https://''xx.xx.xx.xx'':''3443'''''/core/api/'''.&lt;br /&gt;
&lt;br /&gt;
=== SSL et certificat auto-signé ===&lt;br /&gt;
&lt;br /&gt;
La plupart des marchands utilisant Polaris se servent d'un certificat auto-signé, souvent périmé.&lt;br /&gt;
&lt;br /&gt;
La vérification automatique de la négociation SSL échouera donc très souvent. C'est pourquoi, lors de l'utilisation des API, vous devez gérer la connexion et la validation manuelle de ces certificats, en proposant, par exemple, de fixer l'empreinte du certificat lors de la première connexion avec les identifiants et n'accepter de vous connecter qu'à ce certificat quand le jeu de mot de passe correspond est utilisé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Méthodes d'accès à l'API ===&lt;br /&gt;
&lt;br /&gt;
Toutes les fonctions exposées par l'API sont assimilées à des ressources HTTP traditionnelle, le nom de la fonction est donc le nom de la ressource ;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez déclencher la fonction en appelant la ressource soit :&lt;br /&gt;
* en méthode HTTP '''GET''', les paramètres sont transmis en ''queryString'' ; &lt;br /&gt;
* en méthode HTTP '''POST''', chaque paramètre est transmis soit dans la ''queryString'', soit dans le corps de la requête, au format ''application/x-www-form-urlencoded''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notons qu'il ne s'agit ni d'un webservice de type SOAP, ni d'un service de type REST, par conséquent, les méthodes HTTP PUT, DELETE, et HEAD ne sont pas supportées.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la requête suivante :&lt;br /&gt;
 GET /core/api/ACL.Login?user=test&amp;amp;password=testmdp&lt;br /&gt;
exécute la fonction ACL.Login, avec pour paramètres :&lt;br /&gt;
* '''user''' avec la valeur ''test'',&lt;br /&gt;
* '''password''' avec la valeur ''testmdp''.&lt;br /&gt;
{{Important|Les valeurs étant passées dans la queryString, il faut nécessairement qu'elles soient encodées au format URL, notamment si elle contiennent le séparateur de champs (&amp;amp;) : ainsi, la valeur «''test &amp;amp; autre''» devient «''test%20%26%20autre''»}}&lt;br /&gt;
&lt;br /&gt;
=== Gestion des réponses === &lt;br /&gt;
&lt;br /&gt;
A moins que le contraire ne soit clairement explicité dans leur documentation, comme par exemple l'API qui fourni les photos des produits, par défaut toutes les fonctions peuvent fournir leur réponses au format '''JSON''' ou '''XML''', au choix lors de l'interrogation.&lt;br /&gt;
C'est également valable pour les erreurs standardisées.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
  &amp;lt;ProcessInfo&amp;gt;&lt;br /&gt;
    &amp;lt;Id&amp;gt;15&amp;lt;/Id&amp;gt;&lt;br /&gt;
    &amp;lt;Name&amp;gt;ips&amp;lt;/Name&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerType&amp;gt;0&amp;lt;/OwnerType&amp;gt;&lt;br /&gt;
    &amp;lt;Owner/&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerName/&amp;gt;&lt;br /&gt;
    &amp;lt;Tasks&amp;gt;&lt;br /&gt;
      &amp;lt;ProcessInfoTask&amp;gt;&lt;br /&gt;
        &amp;lt;Date&amp;gt;2017-09-29T13:44:58.3608012Z&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;TaskName&amp;gt;Attente&amp;lt;/TaskName&amp;gt;&lt;br /&gt;
      &amp;lt;/ProcessInfoTask&amp;gt;&lt;br /&gt;
    &amp;lt;/Tasks&amp;gt;&lt;br /&gt;
  &amp;lt;/ProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=json&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;Id&amp;quot;:15,&lt;br /&gt;
   &amp;quot;Name&amp;quot;:&amp;quot;ips&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerType&amp;quot;:0,&lt;br /&gt;
   &amp;quot;Owner&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerName&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;RemoteEndPoint&amp;quot;:null,&lt;br /&gt;
   &amp;quot;Tasks&amp;quot;:[&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;Date&amp;quot;:&amp;quot;\/Date(1506692818379)\/&amp;quot;,&lt;br /&gt;
      &amp;quot;TaskName&amp;quot;:&amp;quot;Attente&amp;quot;,&lt;br /&gt;
      &amp;quot;Step&amp;quot;:null&lt;br /&gt;
     }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également préciser que vous souhaitez une réponse au format JSON en le précisant dans l'entête &amp;quot;Accept&amp;quot; de la requête HTTP plutôt que dans la ''queryString'' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Accept: application/json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des erreurs ===&lt;br /&gt;
&lt;br /&gt;
Il existe deux types d'erreurs, les standardisées, et les erreurs de transport.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas les erreurs sont propagées par le système de code d'état de la requête (les erreurs sont propagées par le système de code d'erreur traditionnel du protocole HTTP) :&lt;br /&gt;
* le code d'erreur '''200''' signifie que la fonction s'est éxécutée correctement,&lt;br /&gt;
* le code '''301''' et '''302''' désignent que la fonction a été déplacée,&lt;br /&gt;
* le code '''404''' désigne une fonction qui n'existe pas ou plus,&lt;br /&gt;
* les codes '''401''' et '''403''' désignent un manque de droits pour l'éxécution, &lt;br /&gt;
* et enfin le code '''500''' désigne une erreur standardisée, décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Tous les autres codes d'erreurs HTTP sont dépendants soit d'une erreur dans la formulation de la requête HTTP (code 4xx), soit d'une erreur ponctuelle non liée à la fonction (5xx).&lt;br /&gt;
&lt;br /&gt;
Lors d'une erreur 500, vous pouvez récupérer l'erreur standardisée qui retrace l'exception sur notre système et le problème via le corps de la réponse. Comme vu précédemment, en fonction de la requête ('''Accept / QueryString &amp;amp;output=json'''), cette erreur est décrite en XML ou en JSON.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/ACL.TraitmentCancel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;PHCAPIError&amp;gt;&lt;br /&gt;
  &amp;lt;Error&amp;gt;0&amp;lt;/Error&amp;gt;&lt;br /&gt;
  &amp;lt;StackTrace&amp;gt;&lt;br /&gt;
   à WebServiceCore.API.HttpComponentAPIManager.&amp;lt;&amp;gt;c__DisplayClass28_3.&amp;lt;__BuildResources&amp;gt;b__0(HttpResponse lnk) dans C:\Work\Polaris\dev\sources\WebServiceCore\WebServiceCore\API\HttpComponentAPIManager.cs:ligne 958&lt;br /&gt;
  &amp;lt;/StackTrace&amp;gt;&lt;br /&gt;
  &amp;lt;Message&amp;gt;paramètre 'traitmentName' manquant&amp;lt;/Message&amp;gt;&lt;br /&gt;
&amp;lt;/PHCAPIError&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion de l'identification et des droits d'accès ===&lt;br /&gt;
&lt;br /&gt;
L'identification est propagée par l'ouverture et la transmission d'un cookie qui contient un jeton de session.&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir utiliser correctement l'API, vous devez :&lt;br /&gt;
# appeler la fonction ''ACL.SSL'' pour vous voir redirigé sur un port sécurisé si ce n'est pas le cas ; à partir de ce point, toute la communication est protégée ;&lt;br /&gt;
# '''toujours propager les cookies de session reçus''' avec le client HTTP que vous utilisez pour forger et envoyer vos requêtes,&lt;br /&gt;
# ouvrir une session sur le système en utilisant la fonction de connexion ''ACL.Login'' au début de l'échange,&lt;br /&gt;
# fermer votre session en utilisant la fonction de connexion ''ACL.Logout'' à la fin de votre échange.&lt;br /&gt;
&lt;br /&gt;
Le jeton de session fourni est valable au moins 20 minutes entre chaque appel de fonctions.&lt;br /&gt;
&lt;br /&gt;
== Liste des fonctions accessibles == &lt;br /&gt;
&lt;br /&gt;
La liste des fonctions accessibles est disponible ici : [[:Catégorie:Webservice API|pages relatives au Webservice]].&lt;br /&gt;
{{DebutInfoCartographeCustom|1}}&lt;br /&gt;
{{FinInfoCartographeCustom|1}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Webservice API|*]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF15267&amp;diff=18179</id>
		<title>NF15267</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF15267&amp;diff=18179"/>
		<updated>2019-01-04T14:42:55Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page redirigée vers NF15267 — Objectifs magasins en fonction du jour&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF15267 — Objectifs magasins en fonction du jour]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF15267_%E2%80%94_Nouvelle_aide_%C3%A0_la_saisie_%22En_fonction_des_jours%22_pour_r%C3%A9partir_l%27objectif_en_fonction_d%27un_%25_pour_chaque_jour_de_la_semaine&amp;diff=18178</id>
		<title>NF15267 — Nouvelle aide à la saisie &quot;En fonction des jours&quot; pour répartir l'objectif en fonction d'un % pour chaque jour de la semaine</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF15267_%E2%80%94_Nouvelle_aide_%C3%A0_la_saisie_%22En_fonction_des_jours%22_pour_r%C3%A9partir_l%27objectif_en_fonction_d%27un_%25_pour_chaque_jour_de_la_semaine&amp;diff=18178"/>
		<updated>2019-01-04T14:42:42Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Julienv a déplacé la page NF15267 — Objectif aide à la saisie ⇒ ajouter une repartition de l'objectif en % sur jour de la semaine vers NF15267 — Objectifs magasins en fonction du jour sans laisser de redirection&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:15267}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF15267|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=17890</id>
		<title>NF13075 — Interface de programmation applicative par Webservice (API)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=17890"/>
		<updated>2018-11-22T17:15:09Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG77 → Autres outils]]{{DebutInfoCartographe}}{{#cartographie:13075}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP77_—_Autres_outils#NF13075|Autres outils]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&lt;br /&gt;
L'API par Webservice vous permet de piloter ou d'interroger votre solution de gestion depuis un programme externe : c'est par son intermédiaire que le prestataire tiers choisi va mettre en place l'interconnexion à votre backoffice. Cette documentation lui est donc principalement destinée.&lt;br /&gt;
&lt;br /&gt;
En effet, une ''interface de programmation applicative'' (désignée par le terme API pour ''Application Programming Interface'') est un ensemble normalisé de classes, de méthodes ou de fonctions qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels. &lt;br /&gt;
&lt;br /&gt;
Dans le cas de Polaris, elle est offerte par un service web, accessible sur chaque service de réplication.&lt;br /&gt;
{{FinChapeau}}&lt;br /&gt;
== Choix techniques ==&lt;br /&gt;
=== Pour commencer ===&lt;br /&gt;
&lt;br /&gt;
Notre API est bâtie sur l'exploitation d'un webservice, donc sur un échange HTTP pour lequel nous respectons le standard 1.1.&lt;br /&gt;
Elle est compatible notamment avec les échanges sécurisés (SSL).&lt;br /&gt;
&lt;br /&gt;
Pour échanger avec notre webservice, il faut donc le faire à travers un client HTTP traditionnel en manipulant des URI.&lt;br /&gt;
&lt;br /&gt;
L'API est ouverte et accessible sur l'URL suivante : https://''xx.xx.xx.xx'':''3443'''''/core/api/'''.&lt;br /&gt;
&lt;br /&gt;
=== SSL et certificat auto-signé ===&lt;br /&gt;
&lt;br /&gt;
La plupart des marchands utilisant Polaris se servent d'un certificat auto-signé, souvent périmé.&lt;br /&gt;
&lt;br /&gt;
La vérification automatique de la négociation SSL échouera donc très souvent. C'est pourquoi, lors de l'utilisation des API, vous devez gérer la connexion et la validation manuelle de ces certificats, en proposant, par exemple, de fixer l'empreinte du certificat lors de la première connexion avec les identifiants et n'accepter de vous connecter qu'à ce certificat quand le jeu de mot de passe correspond est utilisé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Méthodes d'accès à l'API ===&lt;br /&gt;
&lt;br /&gt;
Toutes les fonctions exposées par l'API sont assimilées à des ressources HTTP traditionnelle, le nom de la fonction est donc le nom de la ressource ;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez déclencher la fonction en appelant la ressource soit :&lt;br /&gt;
* en méthode HTTP '''GET''', les paramètres sont transmis en ''queryString'' ; &lt;br /&gt;
* en méthode HTTP '''POST''', chaque paramètre est transmis soit dans la ''queryString'', soit dans le corps de la requête, au format ''application/x-www-form-urlencoded''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notons qu'il ne s'agit ni d'un webservice de type SOAP, ni d'un service de type REST, par conséquent, les méthodes HTTP PUT, DELETE, et HEAD ne sont pas supportées.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la requête suivante :&lt;br /&gt;
 GET /core/api/ACL.Login?user=test&amp;amp;password=testmdp&lt;br /&gt;
exécute la fonction ACL.Login, avec pour paramètres :&lt;br /&gt;
* '''user''' avec la valeur ''test'',&lt;br /&gt;
* '''password''' avec la valeur ''testmdp''.&lt;br /&gt;
{{Important|Les valeurs étant passées dans la queryString, il faut nécessairement qu'elles soient encodées au format URL, notamment si elle contiennent le séparateur de champs (&amp;amp;) : ainsi, la valeur «''test &amp;amp; autre''» devient «''test%20%26%20autre''»}}&lt;br /&gt;
&lt;br /&gt;
=== Gestion des réponses === &lt;br /&gt;
&lt;br /&gt;
A moins que le contraire ne soit clairement explicité dans leur documentation, comme par exemple l'API qui fourni les photos des produits, par défaut toutes les fonctions peuvent fournir leur réponses au format '''JSON''' ou '''XML''', au choix lors de l'interrogation.&lt;br /&gt;
C'est également valable pour les erreurs standardisées.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
  &amp;lt;ProcessInfo&amp;gt;&lt;br /&gt;
    &amp;lt;Id&amp;gt;15&amp;lt;/Id&amp;gt;&lt;br /&gt;
    &amp;lt;Name&amp;gt;ips&amp;lt;/Name&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerType&amp;gt;0&amp;lt;/OwnerType&amp;gt;&lt;br /&gt;
    &amp;lt;Owner/&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerName/&amp;gt;&lt;br /&gt;
    &amp;lt;Tasks&amp;gt;&lt;br /&gt;
      &amp;lt;ProcessInfoTask&amp;gt;&lt;br /&gt;
        &amp;lt;Date&amp;gt;2017-09-29T13:44:58.3608012Z&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;TaskName&amp;gt;Attente&amp;lt;/TaskName&amp;gt;&lt;br /&gt;
      &amp;lt;/ProcessInfoTask&amp;gt;&lt;br /&gt;
    &amp;lt;/Tasks&amp;gt;&lt;br /&gt;
  &amp;lt;/ProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=json&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;Id&amp;quot;:15,&lt;br /&gt;
   &amp;quot;Name&amp;quot;:&amp;quot;ips&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerType&amp;quot;:0,&lt;br /&gt;
   &amp;quot;Owner&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerName&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;RemoteEndPoint&amp;quot;:null,&lt;br /&gt;
   &amp;quot;Tasks&amp;quot;:[&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;Date&amp;quot;:&amp;quot;\/Date(1506692818379)\/&amp;quot;,&lt;br /&gt;
      &amp;quot;TaskName&amp;quot;:&amp;quot;Attente&amp;quot;,&lt;br /&gt;
      &amp;quot;Step&amp;quot;:null&lt;br /&gt;
     }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également préciser que vous souhaitez une réponse au format JSON en le précisant dans l'entête &amp;quot;Accept&amp;quot; de la requête HTTP plutôt que dans la ''queryString'' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Accept: application/json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des erreurs ===&lt;br /&gt;
&lt;br /&gt;
Il existe deux types d'erreurs, les standardisées, et les erreurs de transport.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas les erreurs sont propagées par le système de code d'état de la requête (les erreurs sont propagées par le système de code d'erreur traditionnel du HTTP) :&lt;br /&gt;
* le code d'erreur '''200''' signifie que la fonction s'est éxécutée correctement,&lt;br /&gt;
* le code '''301''' et '''302''' désignent que la fonction a été déplacée,&lt;br /&gt;
* le code '''404''' désigne une fonction qui n'existe pas ou plus,&lt;br /&gt;
* les codes '''401''' et '''403''' désignent un manque de droits pour l'éxécution, &lt;br /&gt;
* et enfin le code '''500''' désigne une erreur standardisée, décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Tous les autres codes d'erreurs HTTP sont dépendantes soit d'une erreur dans la formulation de la requête HTTP (code 4xx), soit d'une erreur ponctuelle non liée à la fonction (5xx).&lt;br /&gt;
&lt;br /&gt;
Lors d'une erreur 500, vous pouvez récupérer une erreur standardisée qui retrace l'exception et le problème :&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/ACL.TraitmentCancel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;PHCAPIError&amp;gt;&lt;br /&gt;
  &amp;lt;Error&amp;gt;0&amp;lt;/Error&amp;gt;&lt;br /&gt;
  &amp;lt;StackTrace&amp;gt;&lt;br /&gt;
   à WebServiceCore.API.HttpComponentAPIManager.&amp;lt;&amp;gt;c__DisplayClass28_3.&amp;lt;__BuildResources&amp;gt;b__0(HttpResponse lnk) dans C:\Work\Polaris\dev\sources\WebServiceCore\WebServiceCore\API\HttpComponentAPIManager.cs:ligne 958&lt;br /&gt;
  &amp;lt;/StackTrace&amp;gt;&lt;br /&gt;
  &amp;lt;Message&amp;gt;paramètre 'traitmentName' manquant&amp;lt;/Message&amp;gt;&lt;br /&gt;
&amp;lt;/PHCAPIError&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion de l'identification et des droits d'accès ===&lt;br /&gt;
&lt;br /&gt;
L'identification est propagée par l'ouverture et la transmission d'un cookie qui contient un jeton de session.&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir utiliser correctement l'API, vous devez :&lt;br /&gt;
# appeler la fonction ''ACL.SSL'' pour vous voir redirigé sur un port sécurisé si ce n'est pas le cas ; à partir de ce point, toute la communication est protégée ;&lt;br /&gt;
# '''toujours propager les cookies de session reçus''' avec le client HTTP que vous utilisez pour forger et envoyer vos requêtes,&lt;br /&gt;
# ouvrir une session sur le système en utilisant la fonction de connexion ''ACL.Login'' au début de l'échange,&lt;br /&gt;
# fermer votre session en utilisant la fonction de connexion ''ACL.Logout'' à la fin de votre échange.&lt;br /&gt;
&lt;br /&gt;
Le jeton de session fourni est valable au moins 20 minutes entre chaque appel de fonctions.&lt;br /&gt;
&lt;br /&gt;
== Liste des fonctions accessibles == &lt;br /&gt;
&lt;br /&gt;
La liste des fonctions accessibles est disponible ici : [[:Catégorie:Webservice API|pages relatives au Webservice]].&lt;br /&gt;
{{DebutInfoCartographeCustom|1}}&lt;br /&gt;
{{FinInfoCartographeCustom|1}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Webservice API|*]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF14404&amp;diff=17777</id>
		<title>NF14404</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF14404&amp;diff=17777"/>
		<updated>2018-11-02T15:16:26Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page redirigée vers NF14404 — API SiliconSalad&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF14404 — API SiliconSalad]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=16540</id>
		<title>NF13075 — Interface de programmation applicative par Webservice (API)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=16540"/>
		<updated>2018-07-31T14:18:09Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG77 → Autres outils]]{{DebutInfoCartographe}}{{#cartographie:13075}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP77_—_Autres_outils#NF13075|Autres outils]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&lt;br /&gt;
L'API par Webservice vous permet de piloter ou d'interroger votre solution de gestion depuis un programme externe : c'est par son intermédiaire que le prestataire tiers choisi va mettre en place l'interconnexion à votre backoffice. Cette documentation lui est donc principalement destinée.&lt;br /&gt;
&lt;br /&gt;
En effet, une ''interface de programmation applicative'' (désignée par le terme API pour ''Application Programming Interface'') est un ensemble normalisé de classes, de méthodes ou de fonctions qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels. &lt;br /&gt;
&lt;br /&gt;
Dans le cas de Polaris, elle est offerte par un service web, accessible sur chaque service de réplication.&lt;br /&gt;
{{FinChapeau}}&lt;br /&gt;
== Choix techniques ==&lt;br /&gt;
=== Pour commencer ===&lt;br /&gt;
&lt;br /&gt;
Notre API est bâtie sur l'exploitation d'un webservice, donc sur un échange HTTP pour lequel nous respectons le standard 1.1.&lt;br /&gt;
Elle est compatible notamment avec les échanges sécurisés (SSL).&lt;br /&gt;
&lt;br /&gt;
Pour échanger avec notre webservice, il faut donc le faire à travers un client HTTP traditionnel en manipulant des URI.&lt;br /&gt;
&lt;br /&gt;
L'API est ouverte et accessible sur l'URL suivante : https://''xx.xx.xx.xx'':''3443'''''/core/api/'''.&lt;br /&gt;
&lt;br /&gt;
=== Méthodes d'accès à l'API ===&lt;br /&gt;
&lt;br /&gt;
Toutes les fonctions exposées par l'API sont assimilées à des ressources HTTP traditionnelle, le nom de la fonction est donc le nom de la ressource ;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez déclencher la fonction en appelant la ressource soit :&lt;br /&gt;
* en méthode HTTP '''GET''', les paramètres sont transmis en ''queryString'' ; &lt;br /&gt;
* en méthode HTTP '''POST''', chaque paramètre est transmis soit dans la ''queryString'', soit dans le corps de la requête, au format ''application/x-www-form-urlencoded''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notons qu'il ne s'agit ni d'un webservice de type SOAP, ni d'un service de type REST, par conséquent, les méthodes HTTP PUT, DELETE, et HEAD ne sont pas supportées.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la requête suivante :&lt;br /&gt;
 GET /core/api/ACL.Login?user=test&amp;amp;password=testmdp&lt;br /&gt;
exécute la fonction ACL.Login, avec pour paramètres :&lt;br /&gt;
* '''user''' avec la valeur ''test'',&lt;br /&gt;
* '''password''' avec la valeur ''testmdp''.&lt;br /&gt;
{{Important|Les valeurs étant passées dans la queryString, il faut nécessairement qu'elles soient encodées au format URL, notamment si elle contiennent le séparateur de champs (&amp;amp;) : ainsi, la valeur «''test &amp;amp; autre''» devient «''test%20%26%20autre''»}}&lt;br /&gt;
&lt;br /&gt;
=== Gestion des réponses === &lt;br /&gt;
&lt;br /&gt;
A moins que le contraire ne soit clairement explicité dans leur documentation, comme par exemple l'API qui fourni les photos des produits, par défaut toutes les fonctions peuvent fournir leur réponses au format '''JSON''' ou '''XML''', au choix lors de l'interrogation.&lt;br /&gt;
C'est également valable pour les erreurs standardisées.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
  &amp;lt;ProcessInfo&amp;gt;&lt;br /&gt;
    &amp;lt;Id&amp;gt;15&amp;lt;/Id&amp;gt;&lt;br /&gt;
    &amp;lt;Name&amp;gt;ips&amp;lt;/Name&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerType&amp;gt;0&amp;lt;/OwnerType&amp;gt;&lt;br /&gt;
    &amp;lt;Owner/&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerName/&amp;gt;&lt;br /&gt;
    &amp;lt;Tasks&amp;gt;&lt;br /&gt;
      &amp;lt;ProcessInfoTask&amp;gt;&lt;br /&gt;
        &amp;lt;Date&amp;gt;2017-09-29T13:44:58.3608012Z&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;TaskName&amp;gt;Attente&amp;lt;/TaskName&amp;gt;&lt;br /&gt;
      &amp;lt;/ProcessInfoTask&amp;gt;&lt;br /&gt;
    &amp;lt;/Tasks&amp;gt;&lt;br /&gt;
  &amp;lt;/ProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=json&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;Id&amp;quot;:15,&lt;br /&gt;
   &amp;quot;Name&amp;quot;:&amp;quot;ips&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerType&amp;quot;:0,&lt;br /&gt;
   &amp;quot;Owner&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerName&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;RemoteEndPoint&amp;quot;:null,&lt;br /&gt;
   &amp;quot;Tasks&amp;quot;:[&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;Date&amp;quot;:&amp;quot;\/Date(1506692818379)\/&amp;quot;,&lt;br /&gt;
      &amp;quot;TaskName&amp;quot;:&amp;quot;Attente&amp;quot;,&lt;br /&gt;
      &amp;quot;Step&amp;quot;:null&lt;br /&gt;
     }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également préciser que vous souhaitez une réponse au format JSON en le précisant dans l'entête &amp;quot;Accept&amp;quot; de la requête HTTP plutôt que dans la ''queryString'' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Accept: application/json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des erreurs ===&lt;br /&gt;
&lt;br /&gt;
Il existe deux types d'erreurs, les standardisées, et les erreurs de transport.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas les erreurs sont propagées par le système de code d'état de la requête (les erreurs sont propagées par le système de code d'erreur traditionnel du HTTP) :&lt;br /&gt;
* le code d'erreur '''200''' signifie que la fonction s'est éxécutée correctement,&lt;br /&gt;
* le code '''301''' et '''302''' désignent que la fonction a été déplacée,&lt;br /&gt;
* le code '''404''' désigne une fonction qui n'existe pas ou plus,&lt;br /&gt;
* les codes '''401''' et '''403''' désignent un manque de droits pour l'éxécution, &lt;br /&gt;
* et enfin le code '''500''' désigne une erreur standardisée, décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Tous les autres codes d'erreurs HTTP sont dépendantes soit d'une erreur dans la formulation de la requête HTTP (code 4xx), soit d'une erreur ponctuelle non liée à la fonction (5xx).&lt;br /&gt;
&lt;br /&gt;
Lors d'une erreur 500, vous pouvez récupérer une erreur standardisée qui retrace l'exception et le problème :&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/ACL.TraitmentCancel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;PHCAPIError&amp;gt;&lt;br /&gt;
  &amp;lt;Error&amp;gt;0&amp;lt;/Error&amp;gt;&lt;br /&gt;
  &amp;lt;StackTrace&amp;gt;&lt;br /&gt;
   à WebServiceCore.API.HttpComponentAPIManager.&amp;lt;&amp;gt;c__DisplayClass28_3.&amp;lt;__BuildResources&amp;gt;b__0(HttpResponse lnk) dans C:\Work\Polaris\dev\sources\WebServiceCore\WebServiceCore\API\HttpComponentAPIManager.cs:ligne 958&lt;br /&gt;
  &amp;lt;/StackTrace&amp;gt;&lt;br /&gt;
  &amp;lt;Message&amp;gt;paramètre 'traitmentName' manquant&amp;lt;/Message&amp;gt;&lt;br /&gt;
&amp;lt;/PHCAPIError&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion de l'identification et des droits d'accès ===&lt;br /&gt;
&lt;br /&gt;
L'identification est propagée par l'ouverture et la transmission d'un cookie qui contient un jeton de session.&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir utiliser correctement l'API, vous devez :&lt;br /&gt;
# appeler la fonction ''ACL.SSL'' pour vous voir redirigé sur un port sécurisé si ce n'est pas le cas ; à partir de ce point, toute la communication est protégée ;&lt;br /&gt;
# '''toujours propager les cookies de session reçus''' avec le client HTTP que vous utilisez pour forger et envoyer vos requêtes,&lt;br /&gt;
# ouvrir une session sur le système en utilisant la fonction de connexion ''ACL.Login'' au début de l'échange,&lt;br /&gt;
# fermer votre session en utilisant la fonction de connexion ''ACL.Logout'' à la fin de votre échange.&lt;br /&gt;
&lt;br /&gt;
Le jeton de session fourni est valable au moins 20 minutes entre chaque appel de fonctions.&lt;br /&gt;
&lt;br /&gt;
== Liste des fonctions accessibles == &lt;br /&gt;
&lt;br /&gt;
La liste des fonctions accessibles est disponible ici : [[:Catégorie:Webservice API|pages relatives au Webservice]].&lt;br /&gt;
{{DebutInfoCartographeCustom|1}}&lt;br /&gt;
{{FinInfoCartographeCustom|1}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Webservice API|*]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=16539</id>
		<title>NF13075 — Interface de programmation applicative par Webservice (API)</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF13075_%E2%80%94_Interface_de_programmation_applicative_par_Webservice_(API)&amp;diff=16539"/>
		<updated>2018-07-31T14:13:40Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG77 → Autres outils]]{{DebutInfoCartographe}}{{#cartographie:13075}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP77_—_Autres_outils#NF13075|Autres outils]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&lt;br /&gt;
L'API par Webservice vous permet de piloter ou d'interroger votre solution de gestion depuis un programme externe : c'est par son intermédiaire que le prestataire tiers choisi va mettre en place l'interconnexion à votre backoffice. Cette documentation lui est donc principalement destinée.&lt;br /&gt;
&lt;br /&gt;
En effet, une ''interface de programmation applicative'' (désignée par le terme API pour ''Application Programming Interface'') est un ensemble normalisé de classes, de méthodes ou de fonctions qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels. &lt;br /&gt;
&lt;br /&gt;
Dans le cas de Polaris, elle est offerte par un service web, accessible sur chaque service de réplication.&lt;br /&gt;
{{FinChapeau}}&lt;br /&gt;
== Choix techniques ==&lt;br /&gt;
=== Pour commencer ===&lt;br /&gt;
&lt;br /&gt;
Notre API est bâtie sur l'exploitation d'un webservice, donc sur un échange HTTP pour lequel nous respectons le standard 1.1.&lt;br /&gt;
Elle est compatible notamment avec les échanges sécurisés (SSL).&lt;br /&gt;
&lt;br /&gt;
Pour échanger avec notre webservice, il faut donc le faire à travers un client HTTP traditionnel en manipulant des URI.&lt;br /&gt;
&lt;br /&gt;
L'API est ouverte et accessible sur l'URL suivante : https://''xx.xx.xx.xx'':''3443'''''/core/api/'''.&lt;br /&gt;
&lt;br /&gt;
=== Méthodes d'accès à l'API ===&lt;br /&gt;
&lt;br /&gt;
Toutes les fonctions exposées par l'API sont assimilées à des ressources HTTP traditionnelle, le nom de la fonction est donc le nom de la ressource ;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez déclencher la fonction en appelant la ressource soit :&lt;br /&gt;
* en méthode HTTP '''GET''', les paramètres sont transmis en ''queryString'' ; &lt;br /&gt;
* en méthode HTTP '''POST''', chaque paramètre est transmis soit dans la ''queryString'', soit dans le corps de la requête, au format ''application/x-www-form-urlencoded''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notons qu'il ne s'agit ni d'un webservice de type SOAP, ni d'un service de type REST, par conséquent, les méthodes HTTP PUT, DELETE, et HEAD ne sont pas supportées.&lt;br /&gt;
&lt;br /&gt;
Par exemple, la requête suivante :&lt;br /&gt;
 GET /core/api/ACL.Login?user=test&amp;amp;password=testmdp&lt;br /&gt;
exécute la fonction ACL.Login, avec pour paramètres :&lt;br /&gt;
* '''user''' avec la valeur ''test'',&lt;br /&gt;
* '''password''' avec la valeur ''testmdp''.&lt;br /&gt;
{{Important|Les valeurs étant passées dans la queryString, il faut nécessairement qu'elles soient encodées au format URL, notamment si elle contiennent le séparateur de champs (&amp;amp;) : ainsi, la valeur «''test &amp;amp; autre''» devient «''test%20%26%20autre''»}}&lt;br /&gt;
&lt;br /&gt;
=== Gestion des réponses === &lt;br /&gt;
&lt;br /&gt;
A moins que le contraire ne soit clairement explicité dans leur documentation, comme par exemple l'API qui fourni les photos des produits, par défaut toutes les fonctions peuvent fournir leur réponses au format '''JSON''' ou '''XML''', au choix lors de l'interrogation.&lt;br /&gt;
C'est également valable pour les erreurs standardisées.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
  &amp;lt;ProcessInfo&amp;gt;&lt;br /&gt;
    &amp;lt;Id&amp;gt;15&amp;lt;/Id&amp;gt;&lt;br /&gt;
    &amp;lt;Name&amp;gt;ips&amp;lt;/Name&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerType&amp;gt;0&amp;lt;/OwnerType&amp;gt;&lt;br /&gt;
    &amp;lt;Owner/&amp;gt;&lt;br /&gt;
    &amp;lt;OwnerName/&amp;gt;&lt;br /&gt;
    &amp;lt;Tasks&amp;gt;&lt;br /&gt;
      &amp;lt;ProcessInfoTask&amp;gt;&lt;br /&gt;
        &amp;lt;Date&amp;gt;2017-09-29T13:44:58.3608012Z&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;TaskName&amp;gt;Attente&amp;lt;/TaskName&amp;gt;&lt;br /&gt;
      &amp;lt;/ProcessInfoTask&amp;gt;&lt;br /&gt;
    &amp;lt;/Tasks&amp;gt;&lt;br /&gt;
  &amp;lt;/ProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/ArrayOfProcessInfo&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/Health.ProcessList?output=json&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;Id&amp;quot;:15,&lt;br /&gt;
   &amp;quot;Name&amp;quot;:&amp;quot;ips&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerType&amp;quot;:0,&lt;br /&gt;
   &amp;quot;Owner&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;OwnerName&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;RemoteEndPoint&amp;quot;:null,&lt;br /&gt;
   &amp;quot;Tasks&amp;quot;:[&lt;br /&gt;
     {&lt;br /&gt;
      &amp;quot;Date&amp;quot;:&amp;quot;\/Date(1506692818379)\/&amp;quot;,&lt;br /&gt;
      &amp;quot;TaskName&amp;quot;:&amp;quot;Attente&amp;quot;,&lt;br /&gt;
      &amp;quot;Step&amp;quot;:null&lt;br /&gt;
     }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également préciser que vous souhaitez une réponse au format JSON en le précisant dans l'entête &amp;quot;Accept&amp;quot; de la requête HTTP plutôt que dans la ''queryString'' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Accept: application/json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion des erreurs ===&lt;br /&gt;
&lt;br /&gt;
Il existe deux types d'erreurs, les standardisées, et les erreurs de transport.&lt;br /&gt;
&lt;br /&gt;
Dans les deux cas les erreurs sont propagées par le système de code d'état de la requête (les erreurs sont propagées par le système de code d'erreur traditionnel du HTTP) :&lt;br /&gt;
* le code d'erreur '''200''' signifie que la fonction s'est éxécutée correctement,&lt;br /&gt;
* le code '''301''' et '''302''' désignent que la fonction a été déplacée,&lt;br /&gt;
* le code '''404''' désigne une fonction qui n'existe pas ou plus,&lt;br /&gt;
* les codes '''401''' et '''403''' désignent un manque de droits pour l'éxécution, &lt;br /&gt;
* et enfin le code '''500''' désigne une erreur standardisée, décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Tous les autres codes d'erreurs HTTP sont dépendantes soit d'une erreur dans la formulation de la requête HTTP (code 4xx), soit d'une erreur ponctuelle non liée à la fonction (5xx).&lt;br /&gt;
&lt;br /&gt;
Lors d'une erreur 500, vous pouvez récupérer une erreur standardisée qui retrace l'exception et le problème :&lt;br /&gt;
&lt;br /&gt;
 GET /core/api/ACL.TraitmentCancel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;PHCAPIError&amp;gt;&lt;br /&gt;
  &amp;lt;Error&amp;gt;0&amp;lt;/Error&amp;gt;&lt;br /&gt;
  &amp;lt;StackTrace&amp;gt;&lt;br /&gt;
   à WebServiceCore.API.HttpComponentAPIManager.&amp;lt;&amp;gt;c__DisplayClass28_3.&amp;lt;__BuildResources&amp;gt;b__0(HttpResponse lnk) dans C:\Work\Polaris\dev\sources\WebServiceCore\WebServiceCore\API\HttpComponentAPIManager.cs:ligne 958&lt;br /&gt;
  &amp;lt;/StackTrace&amp;gt;&lt;br /&gt;
  &amp;lt;Message&amp;gt;paramètre 'traitmentName' manquant&amp;lt;/Message&amp;gt;&lt;br /&gt;
&amp;lt;/PHCAPIError&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gestion de l'identification et des droits d'accès ===&lt;br /&gt;
&lt;br /&gt;
L'identification est propagée par l'ouverture et la transmission d'un cookie qui contient un jeton de session.&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir utiliser correctement l'API, vous devez :&lt;br /&gt;
# appeler la fonction ''ACL.SSL'' pour vous voir rediriger sur un port sécurisé si ce n'est pas le cas ; à partir de ce point, toute la communication est protégée ;&lt;br /&gt;
# '''toujours propager les cookies de session reçus''' avec le client HTTP que vous utilisez pour forger et envoyer vos requêtes,&lt;br /&gt;
# ouvrir une session sur le système en utilisant la fonction de connexion ''ACL.Login'' au début de l'échange,&lt;br /&gt;
# fermer votre session en utilisant la fonction de connexion ''ACL.Logout'' à la fin de votre échange.&lt;br /&gt;
&lt;br /&gt;
Le jeton de session fourni est valable au moins 20 minutes entre chaque appel de fonctions.&lt;br /&gt;
&lt;br /&gt;
== Liste des fonctions accessibles == &lt;br /&gt;
&lt;br /&gt;
La liste des fonctions accessibles est disponible ici : [[:Catégorie:Webservice API|pages relatives au Webservice]].&lt;br /&gt;
{{DebutInfoCartographeCustom|1}}&lt;br /&gt;
{{FinInfoCartographeCustom|1}}&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Webservice API|*]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Cat%C3%A9gorie:Webservice_types&amp;diff=16333</id>
		<title>Catégorie:Webservice types</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Cat%C3%A9gorie:Webservice_types&amp;diff=16333"/>
		<updated>2018-07-30T15:19:25Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page créée avec « Types »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Webservice API|Types]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Notes_de_la_derni%C3%A8re_version&amp;diff=14720</id>
		<title>Notes de la dernière version</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Notes_de_la_derni%C3%A8re_version&amp;diff=14720"/>
		<updated>2018-03-22T16:45:20Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page redirigée vers Notes de version de Polaris 6.07&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[Notes de version de Polaris 6.07]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF4804_%E2%80%94_Edition_des_devis,_r%C3%A9servation_et_commande_client&amp;diff=14713</id>
		<title>NF4804 — Edition des devis, réservation et commande client</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF4804_%E2%80%94_Edition_des_devis,_r%C3%A9servation_et_commande_client&amp;diff=14713"/>
		<updated>2018-03-21T16:34:43Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:CG58 → A classer]]{{DebutInfoCartographe}}{{#cartographie:4804}}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;small&amp;gt;''Voir la carte de la fonctionnalité : [[PP58_—_A_classer#NF4804|A classer]]''&amp;lt;/small&amp;gt;&amp;lt;/blockquote&amp;gt;{{FinInfoCartographe}}&lt;br /&gt;
{{DebutChapeau}}&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{FinChapeau}}&lt;br /&gt;
&lt;br /&gt;
à faire.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=14705</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=14705"/>
		<updated>2018-03-21T10:51:38Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
p,td,a,h1,h2,h3,h4,h5,h6 {&lt;br /&gt;
	overflow-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.book { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* couleur des approbations et révision */&lt;br /&gt;
#mw-revision-info { color: white; background-color: indianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-nav { color: black; background-color: #dedede; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-info a { color: white; }&lt;br /&gt;
.approvedAndLatestMsg { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notApprovedRevision { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notLatestMsg { color: white; background-color: darkorange; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.noApprovedRevision a, .notLatestMsg a { color: white; text-decoration: underline; }&lt;br /&gt;
.noApprovedRevision a:hover, .notLatestMsg a:hover { text-decoration: none; }&lt;br /&gt;
&lt;br /&gt;
form.navbar-left {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dropdown-menu #n-help {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  top: 64px;&lt;br /&gt;
  right: 16px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation .btn-success {&lt;br /&gt;
  opacity: 0.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation a {&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
 .footer-icons, .footer-places, .footer-info, .p-tb, .approbation, .approbation * { display: none !important; } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
img {&lt;br /&gt;
  max-width:100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  page-break-before: auto; &lt;br /&gt;
  page-break-after: auto; &lt;br /&gt;
  page-break-inside: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
  page-break-inside: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1, h2, h3, h4, h5, h6, h7, h8, h9 {&lt;br /&gt;
  page-break-after: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#catlinks {&lt;br /&gt;
  display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-normal-catlinks{&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
  border: 0 !important;&lt;br /&gt;
  background: white !important;&lt;br /&gt;
  margin-top: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#tweeki-cat hr {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.depuis_version { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
.obsolete_version { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.fil-ariane .ariane-sep {&lt;br /&gt;
		margin-left: 0.2em;&lt;br /&gt;
		margin-right: 0.2em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab&lt;br /&gt;
	{		&lt;br /&gt;
		border-collapse: collapse;&lt;br /&gt;
		width: 100%;		&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab td {&lt;br /&gt;
		/* padding: 0.2ex 0.5em; */&lt;br /&gt;
		padding: 1ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-no {		&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: lightblue;&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lib {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: aliceblue;		&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-desc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-space {&lt;br /&gt;
		border-top: 2px solid black;		&lt;br /&gt;
		height: 3ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions {&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		padding-right: 1em;&lt;br /&gt;
		border-left: 1px solid black;		&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		white-space: nowrap;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions ul {&lt;br /&gt;
		list-style-type: none;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li {&lt;br /&gt;
		margin: 0 0.5em 0 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li:before {&lt;br /&gt;
		content: '→ ';&lt;br /&gt;
		color: #aaa;&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-depuis-lib {&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-lib {&lt;br /&gt;
		display: block;&lt;br /&gt;
		color: crimson;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		padding-top: 2ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-versions li:before {&lt;br /&gt;
		content: '× ';&lt;br /&gt;
		color: red;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		vertical-align: middle;&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		max-width: 3ex;&lt;br /&gt;
		width: 3ex;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl .txt {		&lt;br /&gt;
		-webkit-transform-origin: 50% 50%;&lt;br /&gt;
       -moz-transform-origin: 50% 50%;&lt;br /&gt;
        -ms-transform-origin: 50% 50%;&lt;br /&gt;
         -o-transform-origin: 50% 50%;&lt;br /&gt;
            transform-origin: 50% 50%;&lt;br /&gt;
		-webkit-transform: rotate(-90deg);&lt;br /&gt;
       -moz-transform: rotate(-90deg);&lt;br /&gt;
        -ms-transform: rotate(-90deg);&lt;br /&gt;
         -o-transform: rotate(-90deg);&lt;br /&gt;
            transform: rotate(-90deg);&lt;br /&gt;
		overflow-wrap: normal !important;&lt;br /&gt;
		text-overflow: ellipsis;		&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
                &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-cli {&lt;br /&gt;
		background: LightBlue;&lt;br /&gt;
		height: 8ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-qlt {&lt;br /&gt;
		background: palegreen;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-dev {		&lt;br /&gt;
		background: orange;&lt;br /&gt;
		height: 4x;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-col-little {&lt;br /&gt;
		width: 1px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-title {&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		text-align: left;	&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		background: #eee;&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-parametrable {&lt;br /&gt;
		padding-right: 2em;&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-type-func {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-doc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest ul {&lt;br /&gt;
		padding: 0;&lt;br /&gt;
		margin: 0 0 0 1em;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-liennf525 {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .dev-namespace {&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	.carto-tab .dev-file {&lt;br /&gt;
		color: darkgray;&lt;br /&gt;
		font-style: italic;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended {&lt;br /&gt;
		margin-top: 1ex;&lt;br /&gt;
		margin-bottom: 0.5ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended span {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-style: italic;		&lt;br /&gt;
		padding: 2px 1em;		&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction {&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
		color: black;&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status {&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-4 {&lt;br /&gt;
		background-color: YellowGreen;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-0 {&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-1 {&lt;br /&gt;
		background-color: Salmon;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-2 {&lt;br /&gt;
		background-color: Moccasin;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-3 {&lt;br /&gt;
		background-color: LightSteelBlue;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-desc {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link {&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin-left: 6em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link:before {&lt;br /&gt;
		content: '⤍ '; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-nom {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-page {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
.ticket-desc {&lt;br /&gt;
font-size: 90%;&lt;br /&gt;
padding: 0.2ex 0.5em 0.2ex 1em;&lt;br /&gt;
margin: 0.5ex 0.5em 1ex 0.5em;&lt;br /&gt;
color: #666;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.puce-non-conformite { color: white; background-color: RoyalBlue; padding: 0.2ex 0.5em; margin: 0 0.5em 1ex 0; border-radius: 4px; display: inline-block; font-size: 80%;}&lt;br /&gt;
&lt;br /&gt;
#api-body a {&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body a:hover {&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .vlr {&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args ul {&lt;br /&gt;
    list-style: square;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature {&lt;br /&gt;
    border: 1px dotted navajowhite;&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .return-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .security-elt {&lt;br /&gt;
    color: royalblue;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .optionel {&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args th {&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return th {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return td {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args thead th {&lt;br /&gt;
    color: #666;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args td {    &lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h2:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h3:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h4:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h5:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.&amp;quot; counter(cth5) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-headline::before {&lt;br /&gt;
    display: inline !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
	counter-reset: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1 {&lt;br /&gt;
	counter-increment: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2 {&lt;br /&gt;
	color: #0066CC;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	padding: 0 0 0.3ex 0;&lt;br /&gt;
	margin: 3ex 0 3ex 0;&lt;br /&gt;
	border-bottom: 1px solid #0066CC;&lt;br /&gt;
	display: block;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	page-break-before: always;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctitle h2 {&lt;br /&gt;
	color: #FF6633 !important;	&lt;br /&gt;
	border: 0 !important;&lt;br /&gt;
	counter-increment: none !important;&lt;br /&gt;
	page-break-before: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc h2:before {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
h3 {&lt;br /&gt;
	color: #004586;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin: 2ex 0 1ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h4 {&lt;br /&gt;
	color: #FF6633;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	margin: 3ex 0 2ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h5 {&lt;br /&gt;
  color: black;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-size: 120%;&lt;br /&gt;
  margin: 2ex 0 2ex 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body ul, .mw-body ol {&lt;br /&gt;
    padding-bottom: 2ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body li {&lt;br /&gt;
  margin-bottom: 0.5ex;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=14704</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=14704"/>
		<updated>2018-03-21T10:49:30Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
p,td,a,h1,h2,h3,h4,h5,h6 {&lt;br /&gt;
	overflow-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.book { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* couleur des approbations et révision */&lt;br /&gt;
#mw-revision-info { color: white; background-color: indianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-nav { color: black; background-color: #dedede; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-info a { color: white; }&lt;br /&gt;
.approvedAndLatestMsg { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notApprovedRevision { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notLatestMsg { color: white; background-color: darkorange; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.noApprovedRevision a, .notLatestMsg a { color: white; text-decoration: underline; }&lt;br /&gt;
.noApprovedRevision a:hover, .notLatestMsg a:hover { text-decoration: none; }&lt;br /&gt;
&lt;br /&gt;
form.navbar-left {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dropdown-menu #n-help {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  top: 64px;&lt;br /&gt;
  right: 16px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation .btn-success {&lt;br /&gt;
  opacity: 0.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation a {&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
 .footer-icons, .footer-places, .footer-info, .p-tb, .approbation, .approbation * { display: none !important; } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
img {&lt;br /&gt;
  max-width:100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  page-break-before: auto; &lt;br /&gt;
  page-break-after: auto; &lt;br /&gt;
  page-break-inside: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
  page-break-inside: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1, h2, h3, h4, h5, h6, h7, h8, h9 {&lt;br /&gt;
  page-break-after: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#catlinks {&lt;br /&gt;
  display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-normal-catlinks{&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
  border: 0 !important;&lt;br /&gt;
  background: white !important;&lt;br /&gt;
  margin-top: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#tweeki-cat hr {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.depuis_version { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
.obsolete_version { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.fil-ariane .ariane-sep {&lt;br /&gt;
		margin-left: 0.2em;&lt;br /&gt;
		margin-right: 0.2em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab&lt;br /&gt;
	{		&lt;br /&gt;
		border-collapse: collapse;&lt;br /&gt;
		width: 100%;		&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab td {&lt;br /&gt;
		/* padding: 0.2ex 0.5em; */&lt;br /&gt;
		padding: 1ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-no {		&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: lightblue;&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lib {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: aliceblue;		&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-desc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-space {&lt;br /&gt;
		border-top: 2px solid black;		&lt;br /&gt;
		height: 3ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions {&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		padding-right: 1em;&lt;br /&gt;
		border-left: 1px solid black;		&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		white-space: nowrap;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions ul {&lt;br /&gt;
		list-style-type: none;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li {&lt;br /&gt;
		margin: 0 0.5em 0 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li:before {&lt;br /&gt;
		content: '→ ';&lt;br /&gt;
		color: #aaa;&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-depuis-lib {&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-lib {&lt;br /&gt;
		display: block;&lt;br /&gt;
		color: crimson;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		padding-top: 2ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-versions li:before {&lt;br /&gt;
		content: '× ';&lt;br /&gt;
		color: red;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		vertical-align: middle;&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		max-width: 3ex;&lt;br /&gt;
		width: 3ex;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl .txt {		&lt;br /&gt;
		-webkit-transform-origin: 50% 50%;&lt;br /&gt;
       -moz-transform-origin: 50% 50%;&lt;br /&gt;
        -ms-transform-origin: 50% 50%;&lt;br /&gt;
         -o-transform-origin: 50% 50%;&lt;br /&gt;
            transform-origin: 50% 50%;&lt;br /&gt;
		-webkit-transform: rotate(-90deg);&lt;br /&gt;
       -moz-transform: rotate(-90deg);&lt;br /&gt;
        -ms-transform: rotate(-90deg);&lt;br /&gt;
         -o-transform: rotate(-90deg);&lt;br /&gt;
            transform: rotate(-90deg);&lt;br /&gt;
		overflow-wrap: normal !important;&lt;br /&gt;
		text-overflow: ellipsis;		&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
                &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-cli {&lt;br /&gt;
		background: LightBlue;&lt;br /&gt;
		height: 8ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-qlt {&lt;br /&gt;
		background: palegreen;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-dev {		&lt;br /&gt;
		background: orange;&lt;br /&gt;
		height: 4x;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-col-little {&lt;br /&gt;
		width: 1px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-title {&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		text-align: left;	&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		background: #eee;&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-parametrable {&lt;br /&gt;
		padding-right: 2em;&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-type-func {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-doc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest ul {&lt;br /&gt;
		padding: 0;&lt;br /&gt;
		margin: 0 0 0 1em;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-liennf525 {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .dev-namespace {&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	.carto-tab .dev-file {&lt;br /&gt;
		color: darkgray;&lt;br /&gt;
		font-style: italic;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended {&lt;br /&gt;
		margin-top: 1ex;&lt;br /&gt;
		margin-bottom: 0.5ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended span {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-style: italic;		&lt;br /&gt;
		padding: 2px 1em;		&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction {&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
		color: black;&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status {&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-4 {&lt;br /&gt;
		background-color: YellowGreen;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-0 {&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-1 {&lt;br /&gt;
		background-color: Salmon;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-2 {&lt;br /&gt;
		background-color: Moccasin;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-3 {&lt;br /&gt;
		background-color: LightSteelBlue;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-desc {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link {&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin-left: 6em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link:before {&lt;br /&gt;
		content: '⤍ '; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-nom {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-page {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
.ticket-desc {&lt;br /&gt;
font-size: 90%;&lt;br /&gt;
padding: 0.2ex 0.5em 0.2ex 1em;&lt;br /&gt;
margin: 0.5ex 0.5em 1ex 0.5em;&lt;br /&gt;
color: #777;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.puce-non-conformite { color: white; background-color: RoyalBlue; padding: 0.2ex 0.5em; margin: 0 0.5em 1ex 0; border-radius: 4px; display: inline-block; font-size: 80%;}&lt;br /&gt;
&lt;br /&gt;
#api-body a {&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body a:hover {&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .vlr {&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args ul {&lt;br /&gt;
    list-style: square;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature {&lt;br /&gt;
    border: 1px dotted navajowhite;&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .return-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .security-elt {&lt;br /&gt;
    color: royalblue;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .optionel {&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args th {&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return th {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return td {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args thead th {&lt;br /&gt;
    color: #666;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args td {    &lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h2:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h3:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h4:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h5:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.&amp;quot; counter(cth5) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-headline::before {&lt;br /&gt;
    display: inline !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
	counter-reset: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1 {&lt;br /&gt;
	counter-increment: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2 {&lt;br /&gt;
	color: #0066CC;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	padding: 0 0 0.3ex 0;&lt;br /&gt;
	margin: 3ex 0 3ex 0;&lt;br /&gt;
	border-bottom: 1px solid #0066CC;&lt;br /&gt;
	display: block;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	page-break-before: always;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctitle h2 {&lt;br /&gt;
	color: #FF6633 !important;	&lt;br /&gt;
	border: 0 !important;&lt;br /&gt;
	counter-increment: none !important;&lt;br /&gt;
	page-break-before: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc h2:before {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
h3 {&lt;br /&gt;
	color: #004586;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin: 2ex 0 1ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h4 {&lt;br /&gt;
	color: #FF6633;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	margin: 3ex 0 2ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h5 {&lt;br /&gt;
  color: black;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-size: 120%;&lt;br /&gt;
  margin: 2ex 0 2ex 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body ul, .mw-body ol {&lt;br /&gt;
    padding-bottom: 2ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body li {&lt;br /&gt;
  margin-bottom: 0.5ex;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=14703</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=14703"/>
		<updated>2018-03-21T10:49:15Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
p,td,a,h1,h2,h3,h4,h5,h6 {&lt;br /&gt;
	overflow-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.book { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* couleur des approbations et révision */&lt;br /&gt;
#mw-revision-info { color: white; background-color: indianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-nav { color: black; background-color: #dedede; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-info a { color: white; }&lt;br /&gt;
.approvedAndLatestMsg { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notApprovedRevision { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notLatestMsg { color: white; background-color: darkorange; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.noApprovedRevision a, .notLatestMsg a { color: white; text-decoration: underline; }&lt;br /&gt;
.noApprovedRevision a:hover, .notLatestMsg a:hover { text-decoration: none; }&lt;br /&gt;
&lt;br /&gt;
form.navbar-left {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dropdown-menu #n-help {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  top: 64px;&lt;br /&gt;
  right: 16px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation .btn-success {&lt;br /&gt;
  opacity: 0.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation a {&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
 .footer-icons, .footer-places, .footer-info, .p-tb, .approbation, .approbation * { display: none !important; } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
img {&lt;br /&gt;
  max-width:100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  page-break-before: auto; &lt;br /&gt;
  page-break-after: auto; &lt;br /&gt;
  page-break-inside: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
  page-break-inside: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1, h2, h3, h4, h5, h6, h7, h8, h9 {&lt;br /&gt;
  page-break-after: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#catlinks {&lt;br /&gt;
  display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-normal-catlinks{&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
  border: 0 !important;&lt;br /&gt;
  background: white !important;&lt;br /&gt;
  margin-top: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#tweeki-cat hr {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.depuis_version { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
.obsolete_version { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.fil-ariane .ariane-sep {&lt;br /&gt;
		margin-left: 0.2em;&lt;br /&gt;
		margin-right: 0.2em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab&lt;br /&gt;
	{		&lt;br /&gt;
		border-collapse: collapse;&lt;br /&gt;
		width: 100%;		&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab td {&lt;br /&gt;
		/* padding: 0.2ex 0.5em; */&lt;br /&gt;
		padding: 1ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-no {		&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: lightblue;&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lib {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: aliceblue;		&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-desc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-space {&lt;br /&gt;
		border-top: 2px solid black;		&lt;br /&gt;
		height: 3ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions {&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		padding-right: 1em;&lt;br /&gt;
		border-left: 1px solid black;		&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		white-space: nowrap;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions ul {&lt;br /&gt;
		list-style-type: none;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li {&lt;br /&gt;
		margin: 0 0.5em 0 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li:before {&lt;br /&gt;
		content: '→ ';&lt;br /&gt;
		color: #aaa;&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-depuis-lib {&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-lib {&lt;br /&gt;
		display: block;&lt;br /&gt;
		color: crimson;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		padding-top: 2ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-versions li:before {&lt;br /&gt;
		content: '× ';&lt;br /&gt;
		color: red;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		vertical-align: middle;&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		max-width: 3ex;&lt;br /&gt;
		width: 3ex;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl .txt {		&lt;br /&gt;
		-webkit-transform-origin: 50% 50%;&lt;br /&gt;
       -moz-transform-origin: 50% 50%;&lt;br /&gt;
        -ms-transform-origin: 50% 50%;&lt;br /&gt;
         -o-transform-origin: 50% 50%;&lt;br /&gt;
            transform-origin: 50% 50%;&lt;br /&gt;
		-webkit-transform: rotate(-90deg);&lt;br /&gt;
       -moz-transform: rotate(-90deg);&lt;br /&gt;
        -ms-transform: rotate(-90deg);&lt;br /&gt;
         -o-transform: rotate(-90deg);&lt;br /&gt;
            transform: rotate(-90deg);&lt;br /&gt;
		overflow-wrap: normal !important;&lt;br /&gt;
		text-overflow: ellipsis;		&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
                &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-cli {&lt;br /&gt;
		background: LightBlue;&lt;br /&gt;
		height: 8ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-qlt {&lt;br /&gt;
		background: palegreen;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-dev {		&lt;br /&gt;
		background: orange;&lt;br /&gt;
		height: 4x;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-col-little {&lt;br /&gt;
		width: 1px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-title {&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		text-align: left;	&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		background: #eee;&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-parametrable {&lt;br /&gt;
		padding-right: 2em;&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-type-func {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-doc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest ul {&lt;br /&gt;
		padding: 0;&lt;br /&gt;
		margin: 0 0 0 1em;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-liennf525 {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .dev-namespace {&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	.carto-tab .dev-file {&lt;br /&gt;
		color: darkgray;&lt;br /&gt;
		font-style: italic;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended {&lt;br /&gt;
		margin-top: 1ex;&lt;br /&gt;
		margin-bottom: 0.5ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended span {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-style: italic;		&lt;br /&gt;
		padding: 2px 1em;		&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction {&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
		color: black;&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status {&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-4 {&lt;br /&gt;
		background-color: YellowGreen;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-0 {&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-1 {&lt;br /&gt;
		background-color: Salmon;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-2 {&lt;br /&gt;
		background-color: Moccasin;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-3 {&lt;br /&gt;
		background-color: LightSteelBlue;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-desc {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link {&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin-left: 6em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link:before {&lt;br /&gt;
		content: '⤍ '; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-nom {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-page {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
.ticket-desc {&lt;br /&gt;
font-size: 90%;&lt;br /&gt;
padding: 0.2ex 0.5em 0.2ex 1em;&lt;br /&gt;
margin: 0.5ex 0.5em 1ex 0.5em;&lt;br /&gt;
color: #888;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.puce-non-conformite { color: white; background-color: RoyalBlue; padding: 0.2ex 0.5em; margin: 0 0.5em 1ex 0; border-radius: 4px; display: inline-block; font-size: 80%;}&lt;br /&gt;
&lt;br /&gt;
#api-body a {&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body a:hover {&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .vlr {&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args ul {&lt;br /&gt;
    list-style: square;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature {&lt;br /&gt;
    border: 1px dotted navajowhite;&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .return-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .security-elt {&lt;br /&gt;
    color: royalblue;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .optionel {&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args th {&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return th {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return td {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args thead th {&lt;br /&gt;
    color: #666;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args td {    &lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h2:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h3:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h4:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h5:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.&amp;quot; counter(cth5) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-headline::before {&lt;br /&gt;
    display: inline !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
	counter-reset: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1 {&lt;br /&gt;
	counter-increment: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2 {&lt;br /&gt;
	color: #0066CC;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	padding: 0 0 0.3ex 0;&lt;br /&gt;
	margin: 3ex 0 3ex 0;&lt;br /&gt;
	border-bottom: 1px solid #0066CC;&lt;br /&gt;
	display: block;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	page-break-before: always;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctitle h2 {&lt;br /&gt;
	color: #FF6633 !important;	&lt;br /&gt;
	border: 0 !important;&lt;br /&gt;
	counter-increment: none !important;&lt;br /&gt;
	page-break-before: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc h2:before {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
h3 {&lt;br /&gt;
	color: #004586;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin: 2ex 0 1ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h4 {&lt;br /&gt;
	color: #FF6633;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	margin: 3ex 0 2ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h5 {&lt;br /&gt;
  color: black;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-size: 120%;&lt;br /&gt;
  margin: 2ex 0 2ex 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body ul, .mw-body ol {&lt;br /&gt;
    padding-bottom: 2ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body li {&lt;br /&gt;
  margin-bottom: 0.5ex;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=14702</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=MediaWiki:Common.css&amp;diff=14702"/>
		<updated>2018-03-21T10:48:59Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
p,td,a,h1,h2,h3,h4,h5,h6 {&lt;br /&gt;
	overflow-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.book { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* couleur des approbations et révision */&lt;br /&gt;
#mw-revision-info { color: white; background-color: indianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-nav { color: black; background-color: #dedede; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
#mw-revision-info a { color: white; }&lt;br /&gt;
.approvedAndLatestMsg { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notApprovedRevision { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.notLatestMsg { color: white; background-color: darkorange; padding: 0.5ex 0.5em; margin: 0 0 1ex 0; border-radius: 4px; }&lt;br /&gt;
.noApprovedRevision a, .notLatestMsg a { color: white; text-decoration: underline; }&lt;br /&gt;
.noApprovedRevision a:hover, .notLatestMsg a:hover { text-decoration: none; }&lt;br /&gt;
&lt;br /&gt;
form.navbar-left {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dropdown-menu #n-help {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  top: 64px;&lt;br /&gt;
  right: 16px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation .btn-success {&lt;br /&gt;
  opacity: 0.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.approbation a {&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
 .footer-icons, .footer-places, .footer-info, .p-tb, .approbation, .approbation * { display: none !important; } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
img {&lt;br /&gt;
  max-width:100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  page-break-before: auto; &lt;br /&gt;
  page-break-after: auto; &lt;br /&gt;
  page-break-inside: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
  page-break-inside: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1, h2, h3, h4, h5, h6, h7, h8, h9 {&lt;br /&gt;
  page-break-after: avoid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#catlinks {&lt;br /&gt;
  display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-normal-catlinks{&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
  border: 0 !important;&lt;br /&gt;
  background: white !important;&lt;br /&gt;
  margin-top: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#tweeki-cat hr {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.depuis_version { color: white; background-color: MediumSeaGreen; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
.obsolete_version { color: white; background-color: IndianRed; padding: 0.5ex 0.5em; margin: 0 0 2ex 0; border-radius: 4px; display: inline-block;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.fil-ariane .ariane-sep {&lt;br /&gt;
		margin-left: 0.2em;&lt;br /&gt;
		margin-right: 0.2em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab&lt;br /&gt;
	{		&lt;br /&gt;
		border-collapse: collapse;&lt;br /&gt;
		width: 100%;		&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab td {&lt;br /&gt;
		/* padding: 0.2ex 0.5em; */&lt;br /&gt;
		padding: 1ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-no {		&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: lightblue;&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lib {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 2px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		background-color: aliceblue;		&lt;br /&gt;
		padding: 0.4ex 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-desc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-space {&lt;br /&gt;
		border-top: 2px solid black;		&lt;br /&gt;
		height: 3ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions {&lt;br /&gt;
		text-align: left;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		padding-right: 1em;&lt;br /&gt;
		border-left: 1px solid black;		&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		white-space: nowrap;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions ul {&lt;br /&gt;
		list-style-type: none;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li {&lt;br /&gt;
		margin: 0 0.5em 0 0.5em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions li:before {&lt;br /&gt;
		content: '→ ';&lt;br /&gt;
		color: #aaa;&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-depuis-lib {&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-lib {&lt;br /&gt;
		display: block;&lt;br /&gt;
		color: crimson;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		padding-top: 2ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-versions .carto-obsolete-versions li:before {&lt;br /&gt;
		content: '× ';&lt;br /&gt;
		color: red;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		vertical-align: middle;&lt;br /&gt;
		text-align: center;&lt;br /&gt;
		border-left: 2px solid black;&lt;br /&gt;
		border-right: 1px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		max-width: 3ex;&lt;br /&gt;
		width: 3ex;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl .txt {		&lt;br /&gt;
		-webkit-transform-origin: 50% 50%;&lt;br /&gt;
       -moz-transform-origin: 50% 50%;&lt;br /&gt;
        -ms-transform-origin: 50% 50%;&lt;br /&gt;
         -o-transform-origin: 50% 50%;&lt;br /&gt;
            transform-origin: 50% 50%;&lt;br /&gt;
		-webkit-transform: rotate(-90deg);&lt;br /&gt;
       -moz-transform: rotate(-90deg);&lt;br /&gt;
        -ms-transform: rotate(-90deg);&lt;br /&gt;
         -o-transform: rotate(-90deg);&lt;br /&gt;
            transform: rotate(-90deg);&lt;br /&gt;
		overflow-wrap: normal !important;&lt;br /&gt;
		text-overflow: ellipsis;		&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin: 0;&lt;br /&gt;
		padding: 0;&lt;br /&gt;
                &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-cli {&lt;br /&gt;
		background: LightBlue;&lt;br /&gt;
		height: 8ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-qlt {&lt;br /&gt;
		background: palegreen;&lt;br /&gt;
		height: 10ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-lbl-dev {		&lt;br /&gt;
		background: orange;&lt;br /&gt;
		height: 4x;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-col-little {&lt;br /&gt;
		width: 1px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-title {&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		text-align: left;	&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
		background: #eee;&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-parametrable {&lt;br /&gt;
		padding-right: 2em;&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-type-func {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-doc {&lt;br /&gt;
		border: 1px solid black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-casdetest ul {&lt;br /&gt;
		padding: 0;&lt;br /&gt;
		margin: 0 0 0 1em;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-liennf525 {&lt;br /&gt;
		border-left: 1px solid black;&lt;br /&gt;
		border-right: 2px solid black;&lt;br /&gt;
		border-top: 1px solid black;&lt;br /&gt;
		border-bottom: 1px solid black;&lt;br /&gt;
		&lt;br /&gt;
		vertical-align: top;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .dev-namespace {&lt;br /&gt;
		color: #777;&lt;br /&gt;
	}&lt;br /&gt;
	.carto-tab .dev-file {&lt;br /&gt;
		color: darkgray;&lt;br /&gt;
		font-style: italic;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended {&lt;br /&gt;
		margin-top: 1ex;&lt;br /&gt;
		margin-bottom: 0.5ex;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.carto-tab .carto-extended span {&lt;br /&gt;
		font-size: 80%;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
		font-style: italic;		&lt;br /&gt;
		padding: 2px 1em;		&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction {&lt;br /&gt;
		font-size: 90%;&lt;br /&gt;
		font-weight: bold;		&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
		color: black;&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status {&lt;br /&gt;
		padding: 2px 1em;&lt;br /&gt;
		border-radius: 4px;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.bug-status a {&lt;br /&gt;
		color: black;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-4 {&lt;br /&gt;
		background-color: YellowGreen;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-0 {&lt;br /&gt;
		background-color: Gainsboro;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-1 {&lt;br /&gt;
		background-color: Salmon;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-2 {&lt;br /&gt;
		background-color: Moccasin;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.etat-fonction-3 {&lt;br /&gt;
		background-color: LightSteelBlue;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;&lt;br /&gt;
		font-weight: bold;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-no:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-desc {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link {&lt;br /&gt;
		display: block;&lt;br /&gt;
		margin-left: 6em;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.nf525-link:before {&lt;br /&gt;
		content: '⤍ '; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.licence-nom {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id {&lt;br /&gt;
		clear: both;&lt;br /&gt;
		display: inline;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:before {&lt;br /&gt;
		content: ' '; &lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-id:after {&lt;br /&gt;
		content:' — ';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.doc-link-page {&lt;br /&gt;
		display: inline;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
.ticket-desc {&lt;br /&gt;
font-size: 90%;&lt;br /&gt;
padding: 0.2ex 0.5em 0.2ex 1em;&lt;br /&gt;
margin: 0.5ex 0.5em 1ex 0.5em;&lt;br /&gt;
color: #999;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.puce-non-conformite { color: white; background-color: RoyalBlue; padding: 0.2ex 0.5em; margin: 0 0.5em 1ex 0; border-radius: 4px; display: inline-block; font-size: 80%;}&lt;br /&gt;
&lt;br /&gt;
#api-body a {&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body a:hover {&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .appel .vlr {&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .lbl {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args ul {&lt;br /&gt;
    list-style: square;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature {&lt;br /&gt;
    border: 1px dotted navajowhite;&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .return-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .security-elt {&lt;br /&gt;
    color: royalblue;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-type {&lt;br /&gt;
    color: darkgreen;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .signature .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .parameter-name {&lt;br /&gt;
    color: darkblue;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .optionel {&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 2ex 1em;&lt;br /&gt;
    margin: 1ex 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args th {&lt;br /&gt;
    background: cornsilk;&lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return th {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args .t-return td {&lt;br /&gt;
    background: LightCyan;        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args thead th {&lt;br /&gt;
    color: #666;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#api-body .args .t-args td {    &lt;br /&gt;
    border: 1px solid navajowhite;&lt;br /&gt;
    padding: 1ex 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h2:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h3:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h4:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ons-0 h5:before {&lt;br /&gt;
	content: counter(cth2) &amp;quot;.&amp;quot; counter(cth3) &amp;quot;.&amp;quot; counter(cth4) &amp;quot;.&amp;quot; counter(cth5) &amp;quot;.   &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-headline::before {&lt;br /&gt;
    display: inline !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
	counter-reset: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1 {&lt;br /&gt;
	counter-increment: cth1;&lt;br /&gt;
	counter-reset: cth2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2 {&lt;br /&gt;
	color: #0066CC;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	padding: 0 0 0.3ex 0;&lt;br /&gt;
	margin: 3ex 0 3ex 0;&lt;br /&gt;
	border-bottom: 1px solid #0066CC;&lt;br /&gt;
	display: block;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth2;&lt;br /&gt;
	counter-reset: cth3;&lt;br /&gt;
	page-break-before: always;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctitle h2 {&lt;br /&gt;
	color: #FF6633 !important;	&lt;br /&gt;
	border: 0 !important;&lt;br /&gt;
	counter-increment: none !important;&lt;br /&gt;
	page-break-before: avoid !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc h2:before {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
h3 {&lt;br /&gt;
	color: #004586;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin: 2ex 0 1ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth3;&lt;br /&gt;
	counter-reset: cth4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h4 {&lt;br /&gt;
	color: #FF6633;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	margin: 3ex 0 2ex 0;&lt;br /&gt;
	&lt;br /&gt;
	counter-increment: cth4;&lt;br /&gt;
	counter-reset: cth5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h5 {&lt;br /&gt;
  color: black;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-size: 120%;&lt;br /&gt;
  margin: 2ex 0 2ex 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body ul, .mw-body ol {&lt;br /&gt;
    padding-bottom: 2ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body li {&lt;br /&gt;
  margin-bottom: 0.5ex;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Changer_l%27exp%C3%A9diteur_des_SMS&amp;diff=13880</id>
		<title>Changer l'expéditeur des SMS</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Changer_l%27exp%C3%A9diteur_des_SMS&amp;diff=13880"/>
		<updated>2018-01-11T10:29:26Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Expéditeur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ebauche}}&lt;br /&gt;
&lt;br /&gt;
[[Documentation#Menu_Clients|Revenir à la documentation du menu Clients]]&lt;br /&gt;
&lt;br /&gt;
L'option '''Changer l'expéditeur des SMS''' permet de '''saisir l'expéditeur figurant sur les SMS envoyés au client''' au lieu de numéros (36300, 36108 ...) comme actuellement.&lt;br /&gt;
&lt;br /&gt;
{{Note|Attention, '''&amp;lt;big&amp;gt;le programme ne permet pas d'afficher l'expéditeur précédemment saisi, mais seulement de le renseigner puis de le mémoriser.&amp;lt;/big&amp;gt;'''. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Le nom de l'expéditeur des SMS est '''limité à 11 caractères maximum, non accentués'''. .}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Droit utilisateur :'''&lt;br /&gt;
*Cette fonctionnalité est restreinte par le droit utilisateur '&amp;lt;nowiki/&amp;gt;'''Pouvoir envoyer des sms/messagemobile, si une passerelle est renseignée'&amp;lt;nowiki/&amp;gt;''' de la rubrique '&amp;lt;nowiki/&amp;gt;'''Messages payants''''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Saisie de l'expéditeur''' :&lt;br /&gt;
*Aller au menu Clients &amp;gt; Changer l'expéditeur des SMS&lt;br /&gt;
[[Fichier:Nouv_5_15_ExpSMS_1.PNG|centré]]&lt;br /&gt;
*Saisir le nom de l'expéditeur '''limité à 11 caractères maxi et non accentués''' puis Valider.&lt;br /&gt;
*Le nom de l'expéditeur saisi sera mémorisé pour tous les envois de SMS ultérieurs.&lt;br /&gt;
*Si vous rappelez Clients &amp;gt; Changer l'expéditeur des SMS, '''le programme n'affichera pas l'expéditeur précédemment saisi'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Conseils pour l'envoi d'un mailing par SMS''' :&lt;br /&gt;
*Nous vous conseillons de créer un mailing de test avec uniquement un client de test comportant votre N° de portable et le contenu du SMS réel.&lt;br /&gt;
*Lancer l'envoi des SMS via le mailing de test, ce qui vous permettra de vérifier l'expéditeur du SMS reçu sur votre portable ainsi que le nombre de SMS décomptés.&lt;br /&gt;
*Copier le contenu du SMS du mailing de test vers le mailing réel.&lt;br /&gt;
*Puis envoyer les SMS depuis le mailing réel pour envoi aux clients.&lt;br /&gt;
*Même si vous avez paramétré un nom d'expéditeur, '''n'oubliez pas de renseigner le nom de votre boutique dans le corps du SMS'''. En effet, l'expéditeur n'est pas systématiquement utilisé par tous les opérateurs et ne sera donc pas visible sur un certain nombre de téléphones portables, notamment certains opérateurs virtuels comme ''NRJ mobile''.&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF92&amp;diff=13879</id>
		<title>NF92</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF92&amp;diff=13879"/>
		<updated>2018-01-11T10:15:22Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page redirigée vers NF92 — Envoi des SMS ⇒ Nouvelle option 'Changer l'expéditeur des SMS'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF92 — Envoi des SMS ⇒ Nouvelle option 'Changer l'expéditeur des SMS']]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Gestion_des_SMS&amp;diff=13878</id>
		<title>Gestion des SMS</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Gestion_des_SMS&amp;diff=13878"/>
		<updated>2018-01-11T10:11:52Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page redirigée vers NF9246 — Publipostage/Mailing et Gestion des SMS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF9246 — Publipostage/Mailing et Gestion des SMS]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=NF9246&amp;diff=13877</id>
		<title>NF9246</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=NF9246&amp;diff=13877"/>
		<updated>2018-01-11T10:11:06Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page redirigée vers NF9246 — Publipostage/Mailing et Gestion des SMS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF9246  — Publipostage/Mailing et Gestion des SMS]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Gestion_des_SMS&amp;diff=13876</id>
		<title>Gestion des SMS</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Gestion_des_SMS&amp;diff=13876"/>
		<updated>2018-01-11T09:52:05Z</updated>

		<summary type="html">&lt;p&gt;Julienv : Page redirigée vers NF9246&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[NF9246]]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Gestion_des_SMS&amp;diff=13875</id>
		<title>Gestion des SMS</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Gestion_des_SMS&amp;diff=13875"/>
		<updated>2018-01-11T09:51:52Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [NF9246]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
	<entry>
		<id>https://extranet.vega-info.fr/doc-polaris/index.php?title=Gestion_des_SMS&amp;diff=13874</id>
		<title>Gestion des SMS</title>
		<link rel="alternate" type="text/html" href="https://extranet.vega-info.fr/doc-polaris/index.php?title=Gestion_des_SMS&amp;diff=13874"/>
		<updated>2018-01-11T09:51:04Z</updated>

		<summary type="html">&lt;p&gt;Julienv : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[#REDIRECT: NF9246]&lt;/div&gt;</summary>
		<author><name>Julienv</name></author>
	</entry>
</feed>