La norme ISO 20022 une norme ISO régissant l’échange de données informatisé entre les institutions financières. Standard international et ouvert, ISO 20022 n’est pas contrôlé par un seul intérêt: il peut être utilisé par n’importe qui dans l’industrie et implémenté sur n’importe quel réseau. Il a des processus entièrement établis pour sa maintenance, son évolution et sa gouvernance.
Première publication en 2004, l’ISO 20022 est largement reconnue comme la norme du futur. En plus d’être assez flexible pour travailler avec les dernières technologies,
ISO 20022 peut également s’adapter aux nouvelles technologies à mesure qu’elles emergent.
La norme ISO 20022 est décrite dans le document «ISO 20022 Financial Services – Système de messages de l’industrie financière universelle».
L’édition actuelle de la norme comprend huit parties, publiées en mai 2013:
ISO 20022-1: Métamodèle
ISO 20022-2: profil UML
ISO 20022-3: Modélisation
ISO 20022-4: Génération de schémas XML
ISO 20022-5: Ingénierie inverse
ISO 20022-6: Caractéristiques de transport des messages
ISO 20022-7: Enregistrement
ISO 20022-8: génération ASN.1
Les commandes d’ISO 20022 et d’autres normes internationales ou publications ISO peuvent être obtenues sur http://www.iso.org. Dans la zone Rechercher, tapez 20022, puis Rechercher. Les huit parties de la norme sont disponibles à l’achat en format PDF ou papier
Dans l’example qui va suivre, nous allons voir comment générer un XML sur C# en utilisant plus spécifiquement le message « Customer Credit Transfer Initiation » : pain.001.001.03
Je vous invite à consulter le lien ci dessous de la CFONB ( Comité Francais d’Organisation et de Normalisation Bancaire ) pour avoir plus de details sur le virement SEPA (Single Euro Payments Area ) et les instructions de paiements.
Pour commencer, prenons l’example ci-dessous.
Nous avons une table Emetteur avec les informations suivantes.

Nous avons aussi une table Recepteur qui a la meme structure que la table Emetteur.

Les données à partir de ces 2 tables peuvent etre assignees dans une DataTable à partir de la requete sql suivante.
Emeteur.
[code language=”sql”]
select Libelle_Emetteur,BIC_Emetteur_IBAN_Emetteur from Emetteur
[/code]
Recepteur
[code language=”sql”]
select Libelle_Recepteur,BIC_Recepteur,IBAN_Recepteur from Recepteur
[/code]
La generation du XML
[code language=”csharp”]
public void WriteXML()
{
DateTime DateXml = Global.GetImportDate.AddDays(1);
string namespace_xml = "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03";
xmlDoc.InsertBefore(xmlDoc.CreateProcessingInstruction("xml", "version=’1.0′ encoding=’UTF-8’"), xmlDoc.ChildNodes.Item(0));
XmlNode objXMLRootelement = xmlDoc.CreateNode(XmlNodeType.Element, "Document", namespace_xml);
xmlDoc.AppendChild(objXMLRootelement);
XmlAttribute attribute = xmlDoc.CreateAttribute("xsi:schemaLocation");
attribute.Value = @"urn:iso:std:iso:20022:tech:xsd:pain.001.001.03\\REPERTOIRE OU SE TROUVE LE SCHEMA\pain.001.001.03.xsd";
objXMLRootelement.Attributes.Append(attribute);
XmlAttribute attribute_1 = xmlDoc.CreateAttribute("xmlns:xsi");
attribute_1.Value = "http://www.w3.org/2001/XMLSchema-instance";
objXMLRootelement.Attributes.Append(attribute_1);
XmlAttribute attribute_2 = xmlDoc.CreateAttribute("xmlns:xsd");
attribute_2.Value = "http://www.w3.org/2001/XMLSchema";
objXMLRootelement.Attributes.Append(attribute_2);
XmlNode objXMLelement = xmlDoc.CreateNode(XmlNodeType.Element, "CstmrCdtTrfInitn", namespace_xml);
objXMLRootelement.AppendChild(objXMLelement);
//#####################################
//# En Tête #
//#####################################
CreateNode("GrpHdr", namespace_xml, "CstmrCdtTrfInitn");
CreateNode("MsgId", namespace_xml, "GrpHdr", RandomString(3) + "/" + RandomString(2) + "/" + RandomInt(8));
CreateNode("CreDtTm", namespace_xml, "GrpHdr", DateXml.ToString("yyyy-MM-ddThh:mm:ss"));
CreateNode("NbOfTxs", namespace_xml, "GrpHdr", "1");
// Le montant du virement
CreateNode("CtrlSum", namespace_xml, "GrpHdr", MontantVirement());
CreateNode("InitgPty", namespace_xml, "GrpHdr");
CreateNode("Nm", namespace_xml, "InitgPty", "XXXXX");
//#####################################
//# LOT Banque #
//#####################################
CreateNode("PmtInf", namespace_xml, "CstmrCdtTrfInitn");
CreateNode("PmtInfId", namespace_xml, "PmtInf", "0000001");
CreateNode("PmtMtd", namespace_xml, "PmtInf", "TRF");
CreateNode("NbOfTxs", namespace_xml, "PmtInf", "1");
CreateNode("CtrlSum", namespace_xml, "PmtInf", MontantVirement());
CreateNode("PmtTpInf", namespace_xml, "PmtInf");
CreateNode("SvcLvl", namespace_xml, "PmtTpInf");
CreateNode("PmtTpInf", namespace_xml, "PmtInf");
CreateNode("Cd", namespace_xml, "SvcLvl", "SEPA");
CreateNode("ReqdExctnDt", namespace_xml, "PmtInf", DateXml.ToString("yyyy-MM-dd"));
CreateNode("Dbtr", namespace_xml, "PmtInf");
// GetDataTableEmetteur est une methode qui retourne un DataTable
// Le libelle_Emetteur dans la Table Emetteur
CreateNode("Nm", namespace_xml, "Dbtr", GetDataTableEmetteur.Rows[0].ItemArray[0].ToString());
CreateNode("DbtrAcct", namespace_xml, "PmtInf");
CreateNode("Id", namespace_xml, "DbtrAcct");
//Le IBAN_Emetteur dans la Table Emetteur
CreateNode("IBAN", namespace_xml, "Id", GetDataTableEmetteur.Rows[0].ItemArray[2].ToString());
CreateNode("DbtrAgt", namespace_xml, "PmtInf");
CreateNode("FinInstnId", namespace_xml, "DbtrAgt");
//Le BIC dans la Table Emetteur
CreateNode("BIC", namespace_xml, "FinInstnId", GetDataTableEmetteur.Rows[0].ItemArray[1].ToString());
CreateNode("ChrgBr", namespace_xml, "PmtInf", "SLEV");
//#####################################
//# Lot Transaction #
//#####################################
CreateNode("CdtTrfTxInf", namespace_xml, "PmtInf");
CreateNode("PmtId", namespace_xml, "CdtTrfTxInf");
CreateNode("InstrId", namespace_xml, "PmtId", "XXXXXX-1");
CreateNode("EndToEndId", namespace_xml, "PmtId", "XX000");
CreateNode("Amt", namespace_xml, "CdtTrfTxInf");
CreateNode("InstdAmt", namespace_xml, "Amt", MontantVirement(), "Ccy=EUR");
CreateNode("Cdtr", namespace_xml, "CdtTrfTxInf");
//GetDataTableRecepteur est une méthode qui retourne une DataTable
CreateNode("Nm", namespace_xml, "Cdtr", GetDataTableRecepteur.Rows[0].ItemArray[0].ToString());
CreateNode("CdtrAcct", namespace_xml, "CdtTrfTxInf");
CreateNode("Id", namespace_xml, "CdtrAcct");
//
CreateNode("IBAN", namespace_xml, "Id", GetDataTableRecepteur.Rows[0].ItemArray[2].ToString(), "", 1);
CreateNode("RmtInf", namespace_xml, "CdtTrfTxInf");
CreateNode("Ustrd", namespace_xml, "RmtInf", "XXXXXXXXXXXXXXX XX" + GetDataTableEmetteur.Rows[0].ItemArray[2].ToString() + " COM " + Global.GetImportDate.ToString("MM/yyyy") + GetDataTableEmetteur.Rows[0].ItemArray[0].ToString());
string targetPath = @"\DOSSIER_SORTIES\" + Global.GetImportDate.ToString("yyyy MM dd");
// Creation d’un dossier pour sauvegarder le XML
if (!System.IO.Directory.Exists(targetPath))
{
System.IO.Directory.CreateDirectory(targetPath);
}
xmlDoc.Save(targetPath + "\\DOSSIER_XML" + Global.GetImportDate.ToString("yyyyMM") + "_1.xml");
}
[/code]